Hypernatural

TechniqueBy HypernaturalVersion 2, Oct 26, 2026

seedance-2-5-image-to-video

Animate a still with ByteDance Seedance 2.5 image-to-video, first and last frames pinned: the exact opening (about 0.997 against the still), photographic grain at 720p or 1080p, and complex physical motion such as paper, cloth or debris falling through the air. Use for physics-heavy shots and shots where a small detail must hold between two pinned frames; slow (6 to 30 min a render). For fast drafts use h3-max-image-to-video; for close-up character shots, kling-v3-image-to-video.

SKILL.md

Seedance 2.5: image to video

Give it a first frame, optionally a last frame, and a prompt; get a clip that opens on the exact frame (frame_alignment about 0.997) and lands on the last, with photographic grain and motion that handles hard physics: a burst of papers drifting down like feathers, cloth, spray. Every render takes minutes, so it is the upgrade for the shots that need it, not the drafting model. Use h3-max-image-to-video to draft and kling-v3-image-to-video for close-ups of people. It takes no references; for a dialogue shot with a voice track, or references, use seedance-2-5-dialogue.

Inputs

  • The first frame at the output size (1920×1080 for 16:9; python-conform-to-1080p).
  • The last frame (optional, and the reason to pick this model for a detail that must hold): derived from the locked first frame (nano-banana-derive-last-frame) so hair, props and print match by construction, then cropped to the source's push-in (python-match-push-in). Look at first and last back to back on a review page before spending a render.
  • The shot's length. Durations are whole seconds from 4 to 30.

Run it

Call describe("fal/bytedance/seedance-2.5/us/image-to-video") before the first run in a job. Before that first run, a test included, show the person the still that will move and ask (core skill: the person decides every look).

run("fal/bytedance/seedance-2.5/us/image-to-video", {
  "image_url": "<job>/video/shot09_first_1080p.jpg",
  "end_image_url": "<job>/video/shot09_last_1080p.jpg",
  "prompt": "<Seedance prompt, see below>",
  "duration": "4",
  "resolution": "720p",
  "generate_audio": true,
  "bitrate_mode": "high"
}, into="<job>/video/raw", unit="shot09_seedance", tag="shot09")
  • duration: a string, the shot's length rounded up to whole seconds, at least "4".
  • resolution: 480p, 720p or 1080p, lowercase. 720p takes about 6 min a render; use it for drafts, or when only part of the frame ships. 1080p takes 6 to 30 min; use it for a full-frame shot that ships at 1080p quality. 720p plus topaz-upscale only saves money where quality matters less: it softens fine detail.
  • No seed and no aspect_ratio: the shape follows the image. Takes differ by sampling alone; run each as its own call.
  • bitrate_mode: "high" keeps the grain.

Prompt

Load seedance-2-5-prompt-format first and write the image-to-video shape: no header, no @Image labels. Replace every handle with plain words ("@Nora" becomes "the woman"). For this mode:

  • Integer-second marks only, 1 to 3 ("At the 1-second mark, a gust lifts…"), then "then".
  • Describe the physics in plain, visible terms and its pace: "the pages drift down slowly in long side-to-side arcs like feathers settling".
  • When the clip runs longer than the shot: "The shot's action lasts 3.4 seconds; play it at natural real-time speed, then hold the final moment with only small natural movement until the clip ends." Never plan to speed the clip up.
  • With a last frame, say what the end of the shot shows.

What you get

An MP4 that opens on the first frame and, with a last frame, lands on it at the end, with its own generated sound effects. The clip is at least 4 s; trim to the shot (ffmpeg-frame-exact-trim), keeping the untrimmed render in raw/. Upscale before trimming.

Tips and traps

  • Content filter false positives. fal sometimes rejects a render because the generated audio was flagged as sensitive. Nothing is wrong with the prompt: run it again as the next take letter.
  • Cost and time. On the first job over half the spend went to Seedance, $100 of it to a 1080p batch that was abandoned. Settle the pinned frames on review pages first, render one take, look, then add takes.
  • Anchored reference-to-video (the still as @Image1 plus reference pictures, no end frame) keeps the layout but opens slightly zoomed and shifted (0.86 to 0.97) and looked no better than image-to-video, whose people stay consistent because they are already in the pinned frame. Choose between them with guide-animate-a-shot.
  • Hair morphing mid-shot means the two pinned frames weren't continuous. Rebuild the last frame from the first rather than re-rolling.

Check it

  • Frame 0 against the first frame and the end against the last: python-check-pinned-frames.
  • A small detail (a logo, print) at start, middle and end, close up: python-measure-detail and your own eyes on 100% crops.
  • Then a review page with the original shot beside the takes.

Go make something cool.

Install the app, open your agent, describe the video. That's the whole onboarding.

Sticker HypernaturalSticker BannerSticker TVBoy