Animate a shot
Turn a still into a moving shot, or remake a shot from an existing video. Ask first: must the shot open on, and keep, an exact frame? If yes, pin the frame (i2v, or both ends). If the layout may move a little, anchor a ref2vid render on the still. If the model may compose the shot, use pure ref2vid. If a filmed take already has the performance you want and only the person changes, recast it instead of animating.
Which model to use is guide-choose-a-video-model. Shots with dialogue go to
guide-lipsync-video; shots whose logo, label or small product must hold go to
guide-keep-small-details.
Routes
| Route | Pick it when | Cost and time | What you get | Load |
|---|---|---|---|---|
| i2v, first frame pinned | The opening must match the still; the end can be free | One render; minutes per take, by model | Frame 0 matches the still (Kling ~0.996, Seedance ~0.997); the end drifts where the model takes it | kling-v3-image-to-video, seedance-2-5-image-to-video, h3-max-image-to-video |
| First and last frames pinned | The shot must reach an end pose the model keeps skipping, or small details must not degrade across the shot | Two stills to make and review first, then one render | Both ends land; nothing drifts between them, if the two stills are continuous | nano-banana-derive-last-frame, python-match-push-in, then an i2v leaf |
| ref2vid, anchored | References (people, product, audio) must drive the shot, and the layout may zoom or shift slightly | One render; Seedance r2v is slow (minutes) | Seedance with the still as @Image1 keeps its layout but opens zoomed or shifted (match 0.86–0.98). Measure, then accept or counter-crop | seedance-2-5-prompt-format (r2v mode), python-measure-layout-drift |
| ref2vid, pure | No frame to hold: the model composes the shot from references | One render | A new composition; anything not in a reference changes | the model's prompt-format leaf |
| v2v recast | A filmed take is right and only the person changes | One render per take; source ≥ 5 s | The original performance exactly, new person | h3-max-recast (and guide-recast-a-person) |
Models that take an end frame: Kling v3, Seedance 2.5 i2v, H3 Max (i2v and r2v), Wan 3.
Seedance r2v has no frame inputs at all: the still is @Image1 only by the prompt's
say-so ("Image 1 is the first frame"), which is why it opens slightly off.
Choosing
- Layout must stay exactly: i2v, or both ends pinned. Never pure ref2vid; it redraws the opening (0.2–0.5 SSIM against the still).
- People and props already in the pinned still stay consistent through i2v. Anchored ref2vid with every character sheet was no better than i2v on a busy wide shot; reach for it when the references carry something the still cannot (audio, an entrance, a product that turns).
- Pin the last frame when a timed end state matters or a small detail has to survive the whole shot. Derive it from the locked first frame (never from the source's last frame), then crop it to the source's push-in.
- Complex physical motion (papers falling like feathers, a burst of objects): Seedance i2v, not H3 Max.
- A whole take worth keeping, new face: recast. A new performance: swap the still, then animate it.
Process
Each gate is a review page (review_open, review_wait) with the original shot as the
reference and the measured numbers in each candidate's note.
- Cut and inspect the source.
ffprobe-inspect-mediafor frame rate and frame count;ffmpeg-scene-cutsfor boundaries (scene > 0.15finds candidates, real cuts score ~0.4–0.8; confirm by eye, since motion inside a shot can score 0.15). Export each shot's first and last stills and an exact-frame clip. - Read the shot.
gemini-shot-recreation-briefwatches the clip at 24 fps and gives camera, timed beats and sound. Correct it with direction where it is wrong: it sometimes mirrors left and right, and called slow push-ins "locked off". - Make the frames. First frame from
guide-edit-a-frame-before-animatingorguide-recast-a-person. For a pinned end:nano-banana-derive-last-framefrom the locked first frame, as text edits only, thenpython-match-push-in(image models ignore "pushed in 10%"). Gate: first ↔ last on a flip; hair, cuffs, props, eyes must match, or the shot morphs mid-clip. - Write the brief (rules below), one per model, since each model's length floor changes the timing line. Load the model's prompt-format leaf for the grammar.
- Gate: the stills that move. Show the person the still of each shot you will
animate, say which shots move and how, and price the run (
estimate). Ask before the first paid run, a test included: a plan's "animate about six hero moments" is not that yes, and neither is your own look at the stills. - Render about three takes per shot, each under the next free variant letter;
with more than a few shots, one shot first. Start every take at once with
wait: false. - Check every take before the person sees it, each as it lands (
tasks(wait: true, calls: [...], until: "any"), then again with the ids still running), so a re-render starts while the rest still render:python-check-pinned-frames: frame 0 against the first still, where the render lands on the last still, and the overage;python-measure-layout-drift: under 0.95 means it did not open on its still (a bad opening scored 0.68, good ones ≥ 0.98). Raw SSIM misleads: the same layout 2% zoomed scores ~0.5. A shot's own first against last frame is ~0.86;python-measure-judderacross takes of one shot (source footage ≈ 0.05). Re-render a take that does not open on its still, with its framing stated in the prompt ("from mid-shin up; never pulls back"). Gate: the takes next to the original, played together.
- Trim, don't retime. Cut each pick at native fps to the shot's length (plus a
0.5 s tail if the delivery keeps shot files), starting later to skip an idle opening;
see
guide-prepare-renders-for-delivery. Keep the untrimmed render.
The brief
- Timing for the model's floor. H3 Max takes lengths from about 1 s, so ask for the shot's own length there. Keep every shot to about 15 s or less on any model. If the render is longer than the shot (Kling's floor is ~3–4 s), say: play the action at natural real-time speed so it reaches the final pose by the shot's length, then hold it with only tiny natural movement. Every model spreads action over its whole clip otherwise, and a sped-up clip reads badly.
- Models idle at the start. Kling waits in the opening pose even when told to act "inside the first second". Trim the start instead of fighting it.
- Spell out counts and amounts: "blinks exactly once", "tips it a third of the way, base below her chin", "walks left in profile, never turning toward the camera". Unqualified, models double the blink, overshoot the lift and turn people to camera.
- State the camera every shot ("a slow push-in", "locked").
- Time-cue the beats from the analysis ("From 0.40 s to 1.10 s, the woman lowers the cup"), and the end state ("It ends exactly on the provided last frame: …").
- Say what makes sound, and "No music or score of any kind" when the cut keeps the source's audio.
- References in the prompt: how to cite people and props, entrances, and why handles
must never reach the model are in
references/video-reference-rules.md. Read it before writing any prompt with references.
Avoid
- Pure ref2vid when the layout must stay; Omni Flash and regular H3 r2v for a held layout (no first frame; they redraw the opening, and Omni lost the faces).
- The source's last frame as a reference for an edit: its cast and props leak back in.
- A pinned last frame without the push-in: the clip loses the push-in.
- Two pinned stills edited independently: on H3 Max the hair morphed mid-shot.
- Speeding a render up to fit the shot.
- Judging layout by raw SSIM.
Related
guide-choose-a-video-model (which model), guide-keep-small-details (logos and
products through the shot), guide-lipsync-video (speech), guide-recast-a-person
(new people), guide-prepare-renders-for-delivery (trim, upscale, grain, splice).


