Input
{{ studioMode === 'edit' ? 'Drop the still to edit. An optional second still applies image 2 onto image 1. Files leave the desktop after save.' : 'Drop a still, describe the motion, then send the job. Generate stays available — a long shot list takes one queue slot, and you can line up more while it runs.' }}
Still loaded · preview hidden
Toggle Hide input still off to show it
{{ studioMode === 'edit' ? 'Image 1' : (textToVideo ? 'Start still · optional' : 'Choose an image') }}
{{ textToVideo ? 'Text-to-video does not need a still. Shot 2+ will still extend from the last frame.' : 'Browse the library or upload a new PNG, JPG, or WEBP' }}
Image 2 · optional
{{ editRefFile ? 'Two-image branch on. Image 2 is applied onto image 1.' : 'One-image branch on. Add a second still to transfer details from image 2.' }}
Paste a block. Text before the first marker is shot 1. Put shot 2, shot 3 on their own lines to queue extensions — a line like Shot Type will not start a new shot. Every shot uses the duration slider. The Comfy identity prefix is prepended to every shot, and the same Picture 1 / extra stills are sent with each shot.
Write camera, action, and audio. That is the dynamic action prompt. We concatenate the <Picture 1> identity prefix in front of it and send the result to Reference to Video, not Image to Video.
{{ parsedShots.length }} shot{{ parsedShots.length === 1 ? '' : 's' }} in this script. Open the prompt to scroll through them.
Recommended prompt
{{ recommendMessage || 'Sidecar Qwen VL is reading the still…' }}
{{ recommendError }}
shot {{ shot.n }}
{{ shot.prompt }}
{{ recommendText }}
Pass {{ index + 2 }}
Prompt sent to Reference to Video
Identity prefix
{{ identityBoilerplate(extraIdentityPictures) }}
Dynamic action prompt
{{ identityActionPrompt }}
Concatenated result
{{ composedIdentityPrompt }}
Extension #{{ index + 1 }}
Save to library
Output preview hides library thumbs and autoplay. Click the player or still to reveal; click anywhere else on the page to hide it again. Folder default applies to output preview when you pick a new still.
Video model
Start from
{{ videoModelHint }}
MiniMax graph
Picture 1 is the start still and stays Picture 1 on every shot, including queued extensions. Extra stills map to Picture 2–5 only if you add them. Empty slots are left out of the graph, not filled with copies of Picture 1.
Generation settings
Aspect ratio / resolution
Output {{ outputSize.width }} × {{ outputSize.height }}{{ aspect === 'auto' ? (file ? ' · matching the still' : ' · 16:9 until a still is loaded') : '' }}
Steps
{{ ltxVideo ? 'Default 3.5 for PinkCherry' : (turbo ? 'Default 1.5 with Turbo LoRA' : 'Default 4.0 with High-Fidelity') }}
Sampler & scheduler
Image edit settings
Flux.2 Klein 9B. Shares the desktop GPU with video.
Graph default is 20 steps, CFG 1, euler. A second still switches the two-image branch on.
The current job keeps running in Output. This submit waits in the job queue.
{{ editBlockReason }}
Job queue
Each submit is one job. Shots inside a job live on the Queue page.
-
{{ job.name }}
{{ studioJobStatusLabel(job) }} · {{ studioJobShotLine(job) }}
Held jobs
Comfy was still busy after 3 minutes. Click one to restore the still, prompt, and settings.
Output
{{ liveElapsedLabel }} · chain {{ editChainStep }}/{{ editChainTotal }} · chain {{ chainStep }}/{{ chainTotal }} · step {{ liveStep }}/{{ liveMaxStep }}
Step {{ chainStep }}/{{ chainTotal }}{{ chainLabel ? `: ${chainLabel}` : '' }} · {{ overallProgress }}% overall
Step {{ editChainStep }}/{{ editChainTotal }}{{ editChainLabel ? `: ${editChainLabel}` : '' }} · {{ editOverallProgress }}% overall
- {{ shotCheckMark(part) }} {{ part.label }} {{ part.prompt }} {{ formatClipDuration(part.duration) }}
{{ shotChecklistResume }}
- {{ part.label }} {{ part.prompt }}
Extend this clip
Continue from the last frame with a new motion prompt, then stitch the segments together.{{ extendSaveName ? ` Saves as “${extendSaveName}”.` : '' }}
{{ lastFrameLoading ? 'Reading last frame…' : 'Last frame preview unavailable' }}
Library
{{ libraryEmptyLabel }}
-
{{ collectionTitle(entry.group) }}
{{ familyScript(entry.group.parts) }}{{ clipMetaLine(entry.group.head) }}
-
{{ item.name || item.prompt }}
{{ clipMetaLine(item) }}
{{ stillCollectionTitle(entry.stillGroup) }}
{{ stillFamilyScript(entry.stillGroup.parts) }}{{ stillMetaLine(entry.stillGroup.head) }}
-