A Vox explainer normally needs an illustrator, an animator, and a week in After Effects. I gave Claude Fable 5.1 one instruction: make a one-minute narrated explainer a person could mistake for a Vox video. It pulled real Vox videos apart, built a style sheet, picked the topic, wrote the script, drew a keyframe for every beat, and called out to a video model for the motion. This is what came back.
The prompt
Here it is, unedited. Drop it in a folder with a Replicate key in .env and paste it into Claude Code. It covers pulling the reference footage, the burst-sampling method for studying motion, the style sheet, the keyframes, the model calls, the assembly, and the self-checks the agent runs before it hands anything back.
Everything in this post is also on GitHub if you would rather clone it: per-simmons/vox-explainer-one-prompt. The repo has this prompt and the style guide below.
Read prompt.md and follow it end to end. Don't stop until you hit feature parity with a Vox explainer.
# Goal — a one-minute explainer that could pass for Vox
Make a one-minute narrated explainer video that a person could mistake for a Vox
video. You own the whole job: the research, the topic, the script, the art
direction, and every call out to the image and video models. Nothing gets handed
back to me half-finished. Work until it's there, and if a scene misses,
regenerate that scene rather than shipping it.
## 1. Get the footage
```bash
yt-dlp -f "18/worst[ext=mp4]" --cookies-from-browser chrome --write-auto-sub --sub-lang en \
-o "reference/%(id)s.%(ext)s" "<vox video url>"
```
The cookies flag is required — without it YouTube returns 403. Pull three Vox
videos with subtitles.
## 2. Study how it moves
Sample one frame every few seconds and you learn the palette and the type and you
miss the entire animation. So sample in **bursts** — 8 fps across two-second
windows where something is happening — and **stitch each burst into one contact
sheet in order** before you read it. As separate stills you see nothing; as an
ordered grid you can see what snaps in, what holds, how hard it overshoots.
```bash
ffmpeg -ss 00:00:20 -i reference/<id>.mp4 -vf "fps=8,scale=520:-1" -frames:v 8 reference/burst/b%02d.png
```
Do six moments. Read the sheets and the subtitles and write down what you see:
the materials, the type treatment, how the highlight bars arrive, how long things hold, how
a piece opens and turns.
## 3. Make the style sheet
This is the single most important artifact. Pick one real Vox **graphics** frame
from your bursts — type on paper, a map, a chart, not a talking head —
and hand it to an image model with the frame attached:
> Using the attached frame as the ONLY source of truth for the look, design a
> motion-graphics STYLE SHEET — one clean designer's reference page: COLOR (six
> swatches sampled from the frame, labeled), TYPE (however this frame treats a
> number or a caption, at three sizes), TEXTURE (every surface and grain you can
> see in the frame), ELEMENTS (the recurring pieces this style builds scenes from),
> EXAMPLES (three small compositions on unrelated subjects, in this exact style).
Look at it. If the EXAMPLES row came back as generic flat vector illustration
rather than the reference's actual materials, regenerate — that's the failure
everyone hits.
**Freeze it.** Every keyframe in the video comes off this one sheet.
## 4. The topic and the script
Pick a topic that's culturally relevant in the **last month or two** and fits
what you learned in step 2 — a why-or-how question with one surprising number and
something a map, a chart, or an object can carry. Every figure verified against
two independent sources. Skip tragedies and gossip.
Write the script: **10 beats of 10–17 words each**,
one narration line and one visual idea per beat, written to be read aloud,
numbers spelled the way they're spoken, no stage directions. **Change the scene every beat**, alternating between scene types — including but not
limited to a wide map, an archival photograph, a chart, a close-up cut-paper object,
a diagram, and type on bare paper. Carry **one** element across each cut so it reads as continuity, never the whole composition. **When a line explains a mechanism, draw the mechanism** — grass with steam lines rising versus bare dirt with heat squiggles says "bare dirt can't cool itself" better than any photo of dirt. A still that only illustrates the noun is a slideshow; a diagram that draws itself on the verb is Vox. **Plan the visuals so
elements persist** — the map in beat 2 is the same map in beat 3, the photo in
the corner stays in the corner. Show me and stop until I approve.
## 5. Keyframes — one per beat, all off the sheet
For each beat, one call to the image model with the **style sheet attached**:
> Using the attached style sheet as the ONLY source of truth for the look, create
> one 16:9 keyframe. SUBJECT: <the composition at the START of this beat — before
> any text or highlight bar lands>. No text, no numbers, no highlight bars anywhere. STYLE:
> exactly the sheet, including everything the sheet forbids.
Lay all ten out as a contact sheet and show me.
**Use real photographs, never generated ones.** For any beat that calls for an
archival photo, pull a real public-domain frame — the Library of Congress FSA/OWI
collection (`loc.gov/collections/fsa-owi-black-and-white-negatives/`, JSON with
`&fo=json`) or Wikimedia Commons (`commons.wikimedia.org/w/api.php`, `prop=imageinfo`
for the original URL) — crop the film rebate off, and paste it onto a photo-less
keyframe as a cutout with PIL, matching how the reference treats its photographs. A generated
"archival" photo has the wrong light and the wrong faces; a real one is the single
cheapest way to make the whole piece feel like Vox. Generate the keyframe with the
photo's region left empty, then composite. Stop until I approve.
## 6. Render on Replicate — the video model
**Draw what has to be exact; render what can be loose.** A bar chart, a number
that must land on a beat, anything where a second copy or a reset would be a bug —
build those frames deterministically with PIL and let
the video model render only the seams. **The seam into a drawn element must land on that
element's first frame** (grey bar up, orange stub) — hand the model the finished
chart as `last_frame` and it draws its own, then yours restarts. Three prompt wordings could not stop the
model from growing the bars twice; code did it in one pass. Same rule as the real
photographs: the model is for motion and texture, not for facts.
Pick an image-to-video model that accepts BOTH a first frame and a last frame —
that one capability is the transition mechanism, and it matters more than
resolution or price. `REPLICATE_API_TOKEN` is in `.env` —
`set -a; . ./.env; set +a`. Don't ask me for it.
Each beat is one call with **three inputs**:
- `image` — this beat's keyframe, as a data URI (JPEG, ≤300 KB)
- `last_frame` — the **next** beat's keyframe. This is the transition. The model
animates from one composition to the other, so every cut lands exactly on the
frame the next clip starts from.
- `prompt` — three blocks. **STYLE and BACKGROUND you write once, from your own
style sheet, and then paste byte-identical into every call.** Only ACTION
changes per beat. Leaving the style out because the keyframe already carries it
does not work: the look drifts mid-clip.
```
STYLE (locked): <one paragraph, written by you from your style sheet. Name the
medium and whether it is printed or lit. Name the palette you sampled. Name the
texture. Name how type is treated. Name what is forbidden — the things that would
break the look if the model added them.>
ACTION (this is the only block that changes; fill it per beat):
0 to 2 seconds, <the beat's main move, happening once>. Then 2 to 3.5 seconds,
<a second, different move that cannot repeat>. The last 2 seconds, one thing
becomes the next: <what transforms into what>, landing exactly on the final frame.
BACKGROUND (locked): <what never changes across the whole piece, and the
instruction that the clip must end exactly on the final frame provided.>
```
Two different moves per clip, never one long one: a single motion asked to fill
five seconds gets played, reset, and played again.
The last beat has no `last_frame`; its ACTION is the same constant camera and
**"absolutely nothing else appears: no highlight bar, no text, no new element"** — without
an end frame to anchor it, the model improvises to fill the time.
**The camera never stops.** Open every ACTION with the same camera sentence,
verbatim, describing the continuous move you observed in the reference. A held
graphic that is genuinely still reads as a freeze.
**Write every seam as one thing physically becoming the next.** "A slides off, B
slides in" reads as a slideshow whatever the style is. Use the transition
vocabulary you wrote down in step 2 — the specific physical moves you saw the
reference make — and vary them, never the same seam twice in a row.
**Never write "plate" anywhere in a prompt** — models render a literal licence
plate, pressed metal and rivets. Describe the shape and colour you actually saw
in the reference instead.
Text goes in double quotes. **Only beats with a number get a highlight bar** — a caption
that repeats what the picture already shows ("GRASS" over a photo of grass) is
noise; drop the highlight line from that beat's ACTION entirely. Large type only.
Simple, big-block movements. Describe on-screen text the way your style sheet does, and say it *appears
instantly and stays fixed* —
"snaps in with overshoot" makes the model bounce and drift it.
`resolution: "720p"`, `aspect_ratio: "16:9"`. Clips come back about 5 seconds.
Use data URIs for the images — Replicate file URLs fail inside the model.
**Narration —** `inworld/realtime-tts-2`, `voice_id: "Ashley"`,
`temperature: 0.3`, `language: "en"`, `audio_format: "wav"`. One voice on every
line. She reads about three words a second; measure each take's real duration.
**Music —** `google/lyria-2`, one instrumental bed, no vocals, no drums. It
returns about 33 seconds; loop it.
## 7. Assemble it into one video
A folder of clips is not the deliverable. In the same run, with ffmpeg:
- **Build the timing from word timestamps, not estimates.** Run each narration
take through a local speech-to-text with word timings and use those numbers. The
picture changes on the word that names the change, a highlight bar lands on the
syllable that says the number, and each line starts about 0.3 s after the
previous line ends. Put the voice on its own track at explicit timestamps rather
than cutting audio to fit the video segments.
- **Draw the beats that have to hit a word.** An object that topples on a
particular word, a label that appears on a particular syllable: rotate about a
pivot with an ease and one bounce, about forty lines of code, and it lands
frame-exact. The video model renders only the seams into and out of it.
- **Never freeze-pad.** For each beat, time-stretch the clip's first three
seconds (the in-shot motion) to fit the line — `setpts` plus `minterpolate` so
it stays a slow move, not duplicated frames — and keep the two-second
transformation at real speed. Size it so the transformation **starts half a
second before the line ends**: the payoff word lands on its own picture, and
the change happens in the breath before the next line.
- **Beat 1 opens on bare paper.** Its first frame is the empty ground; the
photo drops in from above the top edge at 0.3 s — already full size, landing flat with one small bounce — the map slides in from the right at 1.0 s, the bar at 2 s, with a
push-in underneath. Keep those slap-ins real-time (stretch only the hold) and
start the voice about 1.2 s in, so line one lands on a picture that's already
moving. Every other beat gets its opening motion from the previous clip's
transformation; only beat 1 has a cold start.
- **Trust the clip's real length.** These models return 5 s most of the time and 10 s some of
the time. The seam is always the clip's *last two seconds* — derive it from the
measured duration, never from an assumed 5.
- **Profile the head of every clip as well as the tail.** With no target frame to
anchor it a model improvises at both ends, and a clip will often open by
re-staging a transition the previous clip already finished. Trim to the settled
part.
- **If a defect is in the keyframe, fix the keyframe.** A prompt can't negate what the
still already shows; regenerate the still, then the clip.
- **The closing beat** has no `last_frame`: a steady push-in, hold about three
seconds past the last word, and the ACTION must say nothing else appears.
- **Every beat needs real in-shot motion** — an 8–12 % push, a drift, an element
arriving. A 4 % push stretched over a seven-second line reads as a freeze.
- Concatenate in order. Each clip ends on the next one's first frame, so the cuts
are invisible.
- Loop the music under everything at about 10%, fade out over the last 1.5 s.
- **Grade with restraint.** `eq=contrast=1.04:saturation=0.95,vignette` is the
whole grade. Film grain and chromatic aberration read as broken rather than
filmic. Cutting on twos (12 fps) is a real Vox technique but only over
deliberately drawn graphics; over photographic content or a moving camera it
reads as a glitch, so apply it per segment if at all, never to the whole cut.
- **Run the camera once, over the whole assembled cut.** A push or drift applied
per segment restarts at every segment, and that reset pops on every join. Inside
a scene that spans a join it reads as "it cut to a slightly different version of
the same scene", and it is the hardest artifact here to diagnose because every
clip is fine.
- **A same-scene join needs a short blend; a scene change does not.** Measure the
frame difference across each join against normal in-scene motion. Where the
scene is the same on both sides, a 0.25 s fade stops a landing error reading as
a glitch. Between different scenes, cut hard.
- 16:9, 1280×720. Write to `out/`.
## 8. QA your own work
Burst-sample the finished MP4 the same way you sampled Vox and read the sheets
back in order. Paper, highlight-bar treatment, and type weight consistent from the
first beat to the last? Each cut landing on the next clip's first frame?
Then run checks that produce numbers, because the eye forgives what the file
doesn't: a static-hold detector (mean frame difference over one-second windows), a
boundary-jump detector comparing the frames either side of each cut against normal
in-scene motion, and a table of the gap between every pair of spoken lines.
**Check the delivered file, not the code that was supposed to fix it.** When a
defect survives a fix, suspect the assembly path first — the concat list, the
first frame, where the audio starts. A fix you haven't measured on the file you're
about to hand over is not a fix.
Fix, regenerate that beat only, and don't hand it to me until it passes.
Deliver: the video, the script, the keyframe contact sheet, and your sources.The style guide it wrote
The prompt never tells the agent what Vox looks like. It tells it how to find out: pull four videos, sample them in bursts at eight frames a second, stitch each burst into one ordered contact sheet, read the subtitles against the sheets, and write down what it sees.
This is what came back. Measured motion timings, the type rules, the transition vocabulary, the script shape. Every rule traces to something in the footage, and the ones that exist because a render failed say so.
# Vox explainer — the style, derived
Every rule here traces to something observed in real footage or proven by a
render. Where a rule exists because a specific thing failed, the failure is
named — those are the load-bearing ones.
**How this was derived.** Four Vox videos pulled with `yt-dlp` and their
timestamped subtitles. Motion studied by burst-sampling at 8 fps across
two-second windows where something was animating, then stitching each burst into
one ordered contact sheet before reading it — sampled sparsely you learn the
palette and miss the entire animation style, which is most of what makes it read
as Vox. Writing studied by reading the subtitles end to end, then lining the
transcript against the burst sheets to see what the picture was doing at the
moment a given line was spoken.
## 1. Materiality
The whole look is **printed, not lit**. Nothing has a light source, a specular
highlight, a soft shadow falloff, or depth of field.
- **Ground:** a pale halftone paper with a faint grid and visible fibre. It never
changes across the piece. It boils very slightly, like printed grain.
- **Graphics:** flat two-dimensional shapes that behave like printed ink. Edges
bleed a hair. Fills carry a visible halftone dot pattern.
- **Photography:** black-and-white archival frames, cropped and pasted flat onto
the paper with **rough torn white paper edges**, as cutouts. Degraded contrast,
film grain, dust. They are objects on the page, not windows into a scene.
- **Palette:** a muted green land, warm orange-red for heat and emphasis, one
bright highlighter yellow used only for numbers, ink black for line and type.
Six colours is the whole range. The yellow is precious — spend it once per beat
at most.
- **Depth:** none. Everything sits on the page. Where a piece overlaps another,
it's paper on paper with a hard, tight drop shadow, never a soft glow.
## 2. Type and the highlight bar
Type is **bold condensed uppercase black**, and where it carries a number it sits
on **a flat bright-yellow highlight bar** — the look of a highlighter swipe
behind the words.
Describe it to an image or video model in exactly these terms:
> bold condensed uppercase black lettering on a flat bright-yellow highlight bar,
> like a highlighter swipe behind the words: a plain flat rectangle, **no border,
> no rivets, no rounded corners, no shadow, no bevel**
Every negation in that line is there because it was rendered wrong without it.
**Never call it a "plate."** Models render a literal licence plate — pressed
metal, rivets, a bevelled edge. The word costs you the shot.
Rules of use:
- **Only beats with a number get a bar.** A caption that repeats what the picture
already shows ("GRASS" over a photo of grass) is noise. Drop it.
- Large type only. Small type garbles in generated video.
- The bar **arrives already full size** and then holds fixed. It does not scale
up, fade in, or drift.
- Put the text in double quotes in the prompt.
## 3. Motion vocabulary, with timings
Measured off the burst sheets:
| Move | Timing | Shape |
|---|---|---|
| Element entrance | 10–15 frames (0.3–0.5 s) | exponential ease-out, 5–10% overshoot, one settle |
| Hold after entrance | 2–4 s | never perfectly still |
| Continuous drift | whole shot | 100% → ~105% scale over ~5 s, or a slow lateral pan |
| Texture boil | 3-frame loop | paper and halftone jitter, always running |
| Exit | rare | Vox cuts out; it seldom animates an exit |
Two things follow from that table.
**Nothing is ever perfectly still.** A held graphic still drifts and its paper
still boils. A frame that is genuinely static for a second reads as a freeze, and
a very small push stretched over a long line reads as a freeze too even though
the pixels differ. Give each shot a real move.
**Entrances are snappy and physical.** Half a second, with an overshoot. Written
for a model: *"drops in from above the top edge, already full size, lands flat
with one small bounce."* Never *"slaps down"* or *"pops in"* — both render as a
scale-in from nothing, which looks like a PowerPoint reveal.
## 4. Transition vocabulary
This is the part that separates the style from a slideshow. **A transition is one
thing physically becoming the next**, always described as something happening to
paper. These are the moves that render reliably:
- the sheet **tears down the middle** and the halves fall away, revealing what's under
- a cutout **peels up from a corner** like a sticker and lifts off
- the **whole sheet slides away like a page**, the next scene underneath
- a **page flip** to a new sheet
- an element is **pushed off frame by an unseen hand**
- a tint that **stamps on** like ink
- a line that **draws itself**
Vary them; never the same seam twice in a row. What does *not* work: "slides off
/ slides in," dissolves, wipes, anything with the word "transition" in it. Those
produce a slideshow.
**Cuts are hard.** Vox does not dissolve between scenes. The only place a short
blend belongs is a join where the scene is the *same* on both sides and the
picture doesn't quite line up — there a 0.25 s fade stops a landing error from
reading as a glitch. Between different scenes, cut.
## 5. Scene grammar
- **The scene changes every beat.** Map, archival photo, chart, close-up object,
bare paper. Ten beats on one composition is boring however good it looks.
- **One element carries across each cut** — and only one. The sun in a slot
becomes the moon in the same slot; the thermometer holds while the ground
changes. The whole composition changing is incoherent; one thing carrying is
what makes the cut feel authored.
- **Anything factual is drawn, not generated.** Charts, counters, exact labels.
Generated video will play a bar rise twice and land a number two seconds late.
Draw it in code on the same paper the stills use, and let the video model
render only the seams into and out of it.
- **Archival photography is real.** Public-domain frames from a real archive,
never generated. Invented evidence inside a factual explainer is not a style
choice.
## 6. How it's written
From the subtitles, not from assumption:
- **One idea per beat**, and the beat ends when the idea does.
- Short declaratives that carry a fact, alternating with a longer sentence that
gives it consequence. Read every line aloud; a sentence that needs a second
pass to parse gets rewritten.
- **A number is introduced with what it beats** — "for ninety years the hottest
month ever measured was July 1936" before "this July was hotter." The
comparison is the story; the figure alone isn't.
- Numbers spelled the way they're spoken.
- The turn lands about two-thirds through: the piece sets up an obvious
explanation, then names the thing that actually did it.
- It ends on a consequence, not a summary. No recap.
- A line that is literally true but reads oddly aloud is a bug in the script, not
in the delivery. Cut the beat and fold its point into a neighbouring line.
## 7. Narration and picture
The relationship is the whole style. Get this wrong and it's narration over a
slideshow no matter how good the frames are.
- **The picture changes on the words that name the change.** Not before, not
after. Get word-level timestamps from the narration audio and build the timing
from them.
- **A number's highlight bar lands on the syllable that says it.**
- **A line starts as its transition starts** — the words announce the change
while it's happening, so the transition is never dead air.
- **About 0.3 s of air between lines.** Less and it runs together; more and it's
a hole.
- A beat whose script says it holds through its line **holds** — the seam out
doesn't start until the line is done.
## 8. The grade
Restraint. Contrast a touch up, saturation a touch down, a gentle vignette. That
is nearly the whole grade.
Cutting on twos (12 fps) is a real Vox technique, but apply it **only over
deliberately drawn graphics** — over photographic content or a moving camera it
reads as a glitch, not as a style. Film grain and chromatic aberration read as
broken rather than filmic; leave them off.
Run the camera in **one continuous pass over the assembled cut**. A per-scene
push restarts at every join, and that reset pops — inside a scene that spans a
join it reads as "it cut to a slightly different version of the same scene."
## 9. What is not Vox
A quick failure catalog, all of these observed:
- soft shadows, gloss, 3D, depth of field, anything lit
- an element that scales, grows or fades up on entrance
- the same composition for consecutive beats
- a dissolve between two different scenes
- small type; a caption that repeats the picture
- a yellow bar on a beat with no number
- a perfectly still frame
- a generated "vintage" photograph
- a number the video model was trusted to animate
## Appendix — the prompt blocks
Locked and byte-identical in every scene call; only the ACTION changes. Leaving
the style out because "the image already carries it" does not work — the style
transforms mid-clip.
```
STYLE (locked): printed editorial motion graphic, not lit. Pale green halftone
paper with faint grid texture. Flat muted green land, warm orange-red heat tones,
one bright highlighter yellow, ink black. Archival black-and-white photo cutouts
with rough torn white paper edges pasted flat on the paper. Numbers and captions
are bold condensed uppercase black lettering sitting on a flat bright-yellow
highlight bar, like a highlighter swipe behind the words: a plain flat rectangle,
no border, no rivets, no rounded corners, no shadow, no bevel. Everything flat on
the paper; no gloss, no 3D, no photoreal rendering, no depth of field.
BACKGROUND (locked): the paper ground never changes. The paper texture boils very
slightly like printed grain. The clip must end exactly on the final frame provided.
CAMERA (in every ACTION): The camera never stops: a slow continuous push-in of
about fifteen percent across the whole shot with a gentle lateral drift.
Everything is hand-placed cut paper and every element shifts by a hair each frame,
like stop-motion re-registration; edges and shadows breathe.
```
ACTION shape per beat — two different motions, then the seam:
```
ACTION: <camera line> Two different things happen, one after the other, and
neither repeats. FIRST, 0.3 to 2.0 seconds: <the beat's main move, once>. THEN,
2.0 to 3.3 seconds: <a second, unrepeatable move — a line drawing itself, a tint
spreading, a label landing>. The last 2 seconds, one thing becomes the next, like
a paper collage being reworked by hand: <the transition, from the vocabulary in
section 4>, landing exactly on the final frame.
```
The two-part structure is not decorative. A single motion asked to fill five
seconds gets played, reset, and played again.The three things that make it work
One style sheet. Independently generated scenes never match each other. They match when they share a parent. One real Vox frame becomes a single-page reference (six colour swatches sampled from it, the type treatment at three sizes, the textures, three example compositions), that page gets frozen, and every still in the video is generated against it, at four cents a still.
The last frame is the transition. Seedance 2.5 accepts both a first and a last frame. Hand one beat four's still and beat five's still and it has to invent the journey between them. Describe that journey as something physical happening to paper and you get the collage feel: the sheet tears down the middle and the halves fall away, the map peels off from the corner, the night sheet rips to reveal grass. The cut arrives on a frame the next clip already starts from, so the seam disappears.
Draw anything that has to be exact. A generative model will not hit a number and will not hit a word. Ask it to animate a bar chart and it plays the rise twice. So the chart here is drawn in code, on the same paper the generated stills use, with one rise that ends on the word "degree." The 1936 record is a placard that topples on the word "fell." The 64°F label appears on the syllable "64." The video model renders only the seams into and out of those pieces.
The archival photographs are real, too. They are public-domain Farm Security Administration frames from the Library of Congress, cropped and pasted on as torn-edge cutouts. A model asked for a vintage photograph invents one, and invented history in a factual explainer is not a style choice.
What it cost
Generated once, at 720p, a minute of this costs $14.49. Every line below is a published Replicate rate times a real quantity: $0.2312 per second of output video, $0.04 per still, $2 per thousand seconds of audio, $25 per million characters of speech.
Getting there cost me a great deal more. I generated 958 seconds of video to end up with forty-eight, across twenty-eight versions. Most of those passes were finding out that something I had already called fixed was still broken, usually because I checked the code meant to fix it instead of the file I actually shipped. The camera move is the one that stung: I was applying it per scene, so the zoom snapped back at every join, and I spent three rounds hunting for a bad clip that did not exist.
That gap is what it cost to work out the method. The method itself runs about fourteen dollars a minute. Generating is the only step that costs money, and the timing work all happens after it, in the edit, where re-running is free. Approve the stills before any clip renders, draw anything that has to be exact, and never re-render to fix a timing problem.
| Line item | Cost |
|---|---|
| Video, Seedance 2.5, 60 seconds at 720p | $13.87 |
| Keyframes, 12 stills | $0.48 |
| Music, 60 seconds of audio | $0.12 |
| Voiceover, 708 characters | $0.02 |
| One minute, generated once | $14.49 |
Three rules that each cost me several versions. Change the scene every beat and carry one element across the cut. Write every transition as one thing physically becoming the next. Start each line of narration as its transition starts, so the picture changes on the words that name it.
Swap the style sheet and the same prompt makes a whiteboard explainer or a glossy corporate piece. Swap the video model and the prompt still does the work. Everything is on GitHub at per-simmons/vox-explainer-one-prompt.