First, the prompt
Paste it into Claude Code, swap the red part for your own script, and answer its questions. It's the brief I'd give it now, after one full run. The prerequisites are right below; without them this won't work.
Make a 9:16 explainer reel (1080×1920), about 60 seconds, from the script below. Visuals: build them in code. One HTML page with a render(t) function that draws the exact frame at time t. Capture it frame by frame with Playwright at 60 fps, blend each pair of frames for motion blur, encode at 30 fps with ffmpeg. Voice: generate it with ElevenLabs using the with-timestamps endpoint, so every word has a start and end time. Drive the captions and every animation cue from those timestamps. Look: dark background, one warning red. When a screen has only a few words, set them huge and bold. Spring-based motion, nothing linear. A thin red progress bar along the top. Rhythm: a steady beat (120 BPM). The background pulses on each kick. Drop the music for one beat before each big reveal. Sound: synthesize the music and sound effects in code, no stock files. Put each effect on the same frame as its visual event. Duck the music under the voice. Captions: on by default. Hide them only when a full-screen headline, or a card sitting where the captions are, already says the same words. Before you render the whole thing, show me a contact sheet of the key scenes so I can judge them. Script: [paste your script here]
It works because of three things
- Claude Code on your own computer. It has to run Node, Python, Playwright and ffmpeg itself. A chat window can only describe the video; it can't render it.
- A voice account. I used ElevenLabs. Read its terms: the free plan doesn't allow commercial use and needs a credit in the title.
- A script you've already approved, with a source for every claim. The AI builds what you hand it. If the facts aren't checked first, it will animate the mistakes beautifully.
Without the first one you'll get a storyboard, not a video.
The prompt is the easy part. What made it watchable were the notes I gave along the way:
Five pieces, one timeline
Everything reads the same word timestamps, so picture, captions and sound can't drift apart.
Script → voice
ElevenLabs reads the script and returns the audio plus the start and end time of every word (243 words).
Timestamps → animation
An HTML page with render(t). Give it a time, it draws that exact frame. Scenes, captions and camera hits are all keyed to words.
Frames → video
Playwright opens the page and screenshots it 4,323 times at 60 fps. ffmpeg blends pairs into 30 fps, which is where the motion blur comes from.
Cue list → music and effects
The page exports 117 sound cues. A Python script synthesizes a 120 BPM score and every whoosh and hit on those exact times.
Mix → master
The music ducks under the voice, the effects go on top, and loudness is set for Instagram.
Three things that made it feel alive
These are live, not recordings.
Springs, not timers
The red dot moves on a spring: it overshoots a little and settles, like a real object. Every pop in the reel works this way.
Captions that land on the word
Each word appears when it's spoken; the key words turn red. That only works because the voice came with timestamps.
A beat you can see
120 BPM. The background flashes on each kick, so the picture keeps time even with the sound off. This one makes sound.
What I actually told it
The AI did the work; these notes did the deciding. Translated from Chinese, in the order I said them.
Why did the hook get so weak? I feel it should be punchy.
A question with a soft answer became three beats: grab, break the belief, promise.
The script can't use ellipses. The whole emotion goes wrong, there's no rhythm, it drags and it's flat, and the phrasing is strange.
Pauses moved from punctuation into the script itself.
Faster. Make his speed come from talking fast and feeling urgent. Not from you speeding it up.
The voice model reads faster itself now. No editing of the audio.
Music and sound effects, and smooth motion design.
Springs, motion blur, and a cue for every hit.
Don't hold back. Go all out. This animation has to be the viral kind: eye-catching, the kind people don't want to scroll past.
It needs rhythm.
A steady 120 BPM, with silence before each reveal.
You should show me every key scene first, laid out on one contact sheet, so I can judge.
Judging 18 stills takes a minute. Re-rendering takes much longer.
Where there are only a few words, you can go with bolder type. … When a title card and the caption say the same words, take the caption away, or it repeats.
Big type replaces the caption only when it already says the same thing.
Honestly: not right the first time
- The voice sounded choppy. To speed it up, the AI cut the pauses out of the audio and sped it up, and clipped the end of every word. Fixed by having the voice read faster itself.
- “REAL” slammed in 7 seconds early. The animation looked for the second time the word “real” was spoken and found the wrong one. Every word count was rechecked.
- The AI can't hear. It measured pauses, speed and loudness from the timestamps, but whether it sounded right was my call each time.
- Captions said the same thing twice. Big headline on screen, same words underneath. Now one gives way to the other.
The tools did the work. Deciding whether it was good was still on me.
You might be wondering
Can I do this in ChatGPT or a normal chat window?
You'll get a plan and a storyboard. To get a video, the AI has to run the rendering tools on a computer, which is what Claude Code does.
Do I need to know how to code?
I didn't write any of the code. But you do need to read results and give specific notes, like the eight in chapter 04.
How long did it take?
One long working session, most of it going back and forth on the script and the voice. A full render takes about six minutes.
What about the music license?
There's no license to worry about: the music and effects were generated by code for this video.