Skip to content
All posts
2 min readIntellity

Reference images that actually hold

What a start frame does to a take, why the aspect chips stop mattering the moment you attach one, and when two references beat one.

A reference image is the cheapest control you have over a take. It is also the one most often used wrong — attached as decoration rather than as an instruction. Here is what it actually does.

The start frame is a first frame, not a mood board

On every video model we mount, a single reference goes into the image-to-video endpoint as image_url, and the model treats it as frame one. Not "something like this". The literal first frame of the clip.

Two consequences fall straight out of that:

  • Composition is decided before the model runs. If your subject is small and centred in the reference, it is small and centred for the whole take. Crop the reference the way you want the shot framed.

  • The aspect chips become a readout. Kling and Wan have no aspect_ratio field on image-to-video — they read it off the still. So the studio snaps your upload to the nearest of its six aspects, shows you which one won, and sends no aspect at all. Fighting the chips at that point does nothing, because there is no field for them to travel in.

Two references are a different endpoint

This is the part that surprises people. On Seedance 2.5, one image is a first frame. Two through six are subjects, on reference-to-video, and they are addressed in the prompt by position:

text
@Image1 walks past @Image2 and stops at the window

That is not a wider version of the same request — it is a different endpoint with a different body, and sending image_urls to image-to-video is a 422. Nothing about this is a judgement call at the desk: the reference count decides it, and videoEndpoint() is the only place in the codebase that rule lives.

The practical read: if you want a character placed in a scene, one reference. If you want two things that both need to look like themselves, use two, and name them.

The end frame is legal only beside a start frame

image_url is required on all four endpoints that accept a tail, so an end frame with no start frame is refused — both in the studio and in the Server Function behind it, because a Server Function takes direct POSTs. Grok Imagine Video has no end-frame input at all, and the studio says so rather than accepting one and dropping it.

What to actually upload

Downscale before you think about anything else. The browser already resizes to a 1280px JPEG at around 200 KB, and there is a hard 700 KB cap on the decoded image, because a reference travels as a data: URI inline in the request body rather than as a URL. Six references at that cap is already 5.7 MB of base64.

Beyond that: high contrast between subject and background, no motion blur, and the subject at the size you want it. A reference is an instruction. Write it clearly.