Module 3. Stills before motion, always. Your look gets decided once and written down, your shot list grows prompts, and twenty variants fire off that file while you do something else.
Every program in the field teaches image before motion. Not one reverses it.
The reason is money and time. A still is cheap and fast. A video generation is neither.
If you animate before the frame is right, you pay video prices to discover you had an image problem. Get the frame right, then move it.
Everything in this module produces frames you approve before a single second of video exists.
Claude Code does not generate images. It writes the prompts, drives the generator, files what comes back, and keeps the books. You keep whichever generator you already pay for.
| Your generator | What this does |
|---|---|
| Has an API or a command line | Fires the batch itself, writes the prompts, calls it, files the results, updates status |
| Web or Discord only, no API | Writes and versions every prompt, tells you which shots are outstanding, files what you drop back in |
Either way the prompt file and the bookkeeping are automated, the half that eats your evening, and the half nobody else in this market teaches at all.
Open story/shots.json. Every shot has a prompt field and it is empty. Fill it from the file you already have:
"For every shot instory/shots.json, write thepromptfield from that shot's owndescription,character,location,time_of_dayandcamera. Append the style block fromstory/look.mdto each one. Do not invent detail the shot list does not contain, where something is missing, leave aTODOin the prompt and list those shots for me."
That last sentence is the slide. A model told to write prompts will happily invent a coat colour. A model told to flag gaps hands you a list of the decisions you still owe.
If your style exists only in the prompt box of your last good generation, you do not have a style. You have one lucky frame and a search problem.
story/look.md holds the look: film stock or lens language, palette, lighting, grain, the reference names you keep reaching for, and the things you never want to see.
"Here are six frames I like the look of. Write story/look.md as a reusable style block: what these have in common, in the language an image model responds to. Keep it under 80 words."
Because it is a file:
The point of prompts living in a file is that they can be looped over.
"Take shots 1 through 12. Fire four variants of each: vary only the seed. Write everything toimages/<shot_id>/v<n>.png, and log the exact prompt, model, seed and timestamp beside each one inimages/log.jsonl."
48 images, filed and traceable, while you do something else.
Every frame traces back to the shot it serves and the prompt that made it. When shot 7 comes back wrong, you are one row away from knowing why.
v3_final_ACTUAL.png was the folder you cleaned up in Module 0. Do not build a new one.
Shot id in the path, version in the name, everything else in the log. The name only has to answer which shot, which attempt; the log answers everything else.
This is not tidiness. The video module reads these paths, and so does the edit. A name you have to interpret is a pipeline that stops needing a human at exactly the wrong moment.
The limit from Module 1 arrives here, and it is the important one.
It cannot look at a frame and tell you the hands are wrong, or that the face went slightly plastic, or that this one is beautiful.
So it does everything around the looking:
"Build me a contact sheet of every variant, grouped by shot, with the shot description as the caption and the file path under each frame."
One page. You scroll it once. Judgment stays yours, but you are spending it on the frames instead of on file management.
You pick. Then tell it, and let the file carry the decision:
"Shot 7 take 2, shot 8 take 4, shot 9 take 1. Copy those toimages/approved/, setstatustoapprovedon those rows inshots.json, and show me which shots still have nothing."
Now the file knows what is done. The video module reads approved. So does the progress count. So does the version of you who picks this up in three weeks.
story/bible.json was written in the last module. This is what it was for.
"For each character instory/bible.json, generate a reference set, front, three-quarter, profile, full length, from that entry's description only, and file it toreferences/<name>/. Then add the approved reference path back into the bible entry."
Locations get the same treatment. Establishing angle, the corner the scene actually plays in, the light at the time of day the script says.
Now every shot prompt can point at a reference instead of re-describing a person from memory, which is the actual mechanism behind the thing this market calls character consistency.
Your own shot list from the last module. Twenty minutes.
story/look.md from these references, under 80 words, reusable."prompt in shots.json from the shot's own fields plus the look block.Flag anything the shot list never specifies."*
bible.json."images/<shot_id>/, log prompt, model and seed."status, tell me what is still outstanding."Step 7 is the one to notice. You made every creative call and touched zero filenames.
story/look.md: your look, decided once, inherited by every promptshots.json with prompts filled and status moving: the file is now a progress boardreferences/: characters and locations that will hold across every shotimages/approved/: frames you have actually looked at and chosenimages/log.jsonl: every generation traceable to the prompt, model and seed that made itNot one second of video yet, and the expensive part is already de-risked.
Motion. The approved frames start moving, image-to-video off the same file, camera language that survives the round trip, and a queue that runs while you sleep.
Verified against Claude Code 2.1.220 · 2026-07-30.