Free guide · from the reel

Make a hand-drawn animated short with Claude, frame by frame.

A 60-second oil-pastel film about procrastination. Claude designed the character, directed every shot, animated him, wrote the camera moves, storm, rain and handwriting in code, and composed the music. Here's the exact workflow, the prompts, the script and what it cost.

⏱ A day💸 About $8 in credits🎬 60-second 16:9 film

What you need

💻Claude CodeIn the Claude desktop app (Code tab) or in a terminal: npm install -g @anthropic-ai/claude-code
🖍An image model for the drawingsI used Nano Banana Pro through Pika, connected to Claude. Any model that takes reference images works. The key is one character sheet and one room that every other drawing references.
🎙An ElevenLabs accountFor the narrator. To publish the video you need a paid plan (Starter or above) for the commercial license.
🐍Python + FFmpegClaude writes the renderer in Python with OpenCV and NumPy. uv installs everything on the fly, so there's no setup beyond FFmpeg.

The workflow

The big lesson: don't ask code to draw a person, and don't ask a video model to move him. Let an image model draw the frames, and let code do everything that moves.

1

Design the character

1 image · approve it before anything else

One sheet with turnarounds and emotions. Every later drawing uses it as a reference, so he looks the same in every shot.

Character sheet promptCharacter model sheet for an animated short film, hand-drawn editorial illustration in oil pastel and coloured pencil on warm off-white paper. Visible waxy crayon strokes, layered hatching, confident cobalt-blue outlines. Palette: cobalt and ultramarine shadows, warm cream highlights, one hero colour for the outfit. Character: [NAME], [age], realistic adult proportions (about 7.5 heads tall), NOT chibi, NOT a cartoon toy, not 3D. [hair, face, glasses, outfit, shoes, one accessory]. Layout on one 16:9 sheet: top row = full-body turnaround (front, three-quarter, side, back). Bottom row = eight head-and-shoulders expressions, labelled: hopeful, avoidant, dread, relief, guilt, overwhelmed, determined, proud. Same face in every drawing. No other text, no logos.
💡Realistic proportions are the difference. My first version was a 3D toy built in Blender, and it looked cheap. A human character drawn in a real illustration style is what makes it feel like a film.
2

Draw the world

1 room master, then ~24 scene plates

Make the main room first and approve it. Then every scene is generated with two references, the character sheet and the room, so nothing drifts.

Scene plate promptFilm still for an animated short, 16:9. Hand-drawn editorial illustration in oil pastel and coloured pencil: visible waxy crayon strokes, layered hatching, cobalt-blue outlines, paper grain. Same art style, same room and same man as the reference images. No text, no letters, no logos. Shot: [camera + framing, e.g. "low-angle medium close-up from desk height"], [what he's doing], [his expression], [the light, e.g. "cold blue, as if a storm blocked the sun"]. [Leave empty space where an effect will go, e.g. "empty ceiling in the top third for a storm cloud".]

Also ask for one or two prop sheets on plain paper: a storm cloud, a box, a paper bird, a phone, sticky notes. Claude cuts them out with code so they can fly around the scenes.

The room master plateA prop sheet

The room every scene references, and one of the prop sheets.

3

Record the voice first

ElevenLabs · then word timings

Every cut, caption and effect lands on a word, so the voice comes before any animation. I used the voice "Katherine – Calm Luxury Narrator" on Eleven v4, with direction tags in brackets:

Paste into ElevenLabs[calm, warm, intimate narrator, unhurried] Nine a.m. [pause] No boss. No deadline. Nobody waiting. … (your script here, with a direction tag at every change of mood)

Then have Claude get the timing of every word and check the take against the script:

PromptTranscribe voice.mp3 with Whisper (word timestamps), compare it word by word with script.md, and tell me any missing or changed words, the long pauses, and when the call-to-action keyword is said. Then map every shot in my shot list to the word it starts on and save shot_timing.json.
4

Build the film in code

The main prompt

This is where the stills become a film. A virtual camera moves over each drawing, and everything alive is code.

Build promptWrite a Python renderer (OpenCV + NumPy, run with uv) that turns my plates into a 16:9 film timed to shot_timing.json, then pipes the frames to FFmpeg with the voice. Per shot: a slow camera move (push, pan or pull back) over the plate, with props pasted in plate space so they move with the camera. Effects in code: a storm cloud that boils, rain only under the cloud, lightning flashes on the key words, glows, drifting dust in the light, frozen raindrops for a bullet-time shot, a ring of light on the first keystroke, a paper bird that flies out of the window. Handwriting: captions in a handwritten font (Caveat) that write themselves on, left to right, exactly when Katherine says them. One caption fully fades before the next starts. Words on sticky notes are written on in perspective. Make it feel drawn, not panned: a tiny "boil" (redraw wobble) on 2s over every frame, paper grain and a soft vignette. Ending: torn paper strips drop in with the closing line in crayon lettering, then an orange sticky note slaps down with Comment "YOUR KEYWORD". Render stills at 15 key moments first, look at every one, and fix anything that covers a face or runs off-screen before the full render.
5

Animate the character

Limited animation · 2–4 drawings per action

Like classic 2D animation: the image model redraws only the part that moves (the mug lifted, the hand pulled back), using the original plate as the reference. Code then lines each drawing up exactly with the plate, keeps only the changed area, and swaps the drawings on the beat.

Pose drawing promptEdit this exact illustration, keeping it pixel-aligned: same framing, same room, same colours and the same oil-pastel style, nothing else moved. Change ONLY [the part that moves], as one frame of an animation: [the new pose]. Same man, same outfit, same size and position. No text.
Prompt for ClaudeFor each pose drawing: align it to its original plate with feature matching on the parts that don't move (ORB + RANSAC homography), keep only the pixels that changed inside a box I give you around the moving part, colour-match that patch to the plate and feather it in. Then play the drawings as limited animation in the shot, holding each one until the next beat.
💡Less is more. Typing should move only the hands, never the elbows, head or legs. For small hands in a wide shot, skip the drawings and have code lift and drop the fingers on the original drawing on every key click. When an expression changes, change it once and hold it. Flicking between two faces looks broken.
6

Score, render, record

Music and sound effects in code too
Music + sound promptWrite audio.py that synthesizes the whole soundtrack with NumPy/SciPy (no samples): a soft felt piano and pad that follow the story (hopeful, dark drone in the storm, a bright swell on relief, a circling ostinato for the loop, opening up on the first keystroke), plus rain, thunder on each lightning flash, whooshes, a paper crumple, wingbeats and quiet key clicks timed to the animation. Duck the music about 12 dB under the voice and master to −16 LUFS.

For the reel: play the film full-screen on your laptop in a dark room and film the screen with your phone.

What it cost

Real numbers from this film.

Character sheet + 24 scene plates + 2 retakes (2K images)≈ $3.80
26 pose drawings for the animation≈ $3.50
Narration, 2 takes (ElevenLabs Eleven v4)≈ 2,100 credits
Camera, effects, handwriting, music, sound, render$0 · code

The script

Exactly as narrated, plus the 21-shot list the film was built from.

Narration[calm, warm, intimate narrator, unhurried] Nine a.m. [pause] No boss. No deadline. Nobody waiting. [pause] Just you… and the thing you said you'd start today. [gently] You're not lazy. You're not out of time. [curious] So why does everything else suddenly feel urgent? [lower, a little darker] Because some work stirs up a storm. Boredom. Doubt. The fear it won't be good enough. [lighter] Look away… and the storm clears. Instantly. [knowing] That relief feels like a reward. So your brain asks for it again. [slower, heavier] But the feeling doesn't leave. It waits. It grows. And it lands on your future self… someone your brain treats almost like a stranger. [firm, warm] It was never a time problem. It's a feeling problem. [encouraging] So handle the feeling. Name it. Forgive yesterday's delay. Shrink the first step until it's almost silly. And decide exactly when you'll take it. [bright, smiling] Then start. Even a little progress makes you feel better. [friendly] Everything you just saw was made by Claude, in code. Comment "FILM", and I'll show you how.
The 21 shots
  1. Extreme close-up of his eye, a cursor blinking in the reflection · he blinks
  2. Wide: the studio at sunrise, dust in the light · he types
  3. The task appears on the desk as a glowing box
  4. Close-up: a sip of coffee, a small nod
  5. Whip-pan montage: watering the plant, wiping a clean desk, moving sticky notes, scrolling
  6. A storm cloud forms over his head · his hand creeps toward the laptop and flinches on the lightning
  7. "Boredom. Doubt. The fear…" written inside the storm
  8. He looks away · the cloud lifts, warm light floods back, a long exhale
  9. The phone glows like a reward
  10. The loop drawn by hand: task → storm → look away → relief
  11. Time-lapse: noon, afternoon, dusk · the cloud grows in the corner
  12. Night: his reflection in the window is an older, tired him
  13. The room floods, rain indoors · he rocks, head in his hands
  14. The clock frozen at 9:00, raindrops stopped mid-air · "It's a feeling problem."
  15. "AFRAID" written on a sticky note
  16. He crumples yesterday's list · a paper bird flies out of the window
  17. The glowing box shrinks to a tiny cube: "open the doc"
  18. A note on the laptop: "Tomorrow · 9:00 · this desk"
  19. The first keystroke sends a ring of warm light
  20. Golden hour, the plant in bloom · he types and smiles
  21. Torn paper and an orange sticky note: Comment "FILM"

If something looks off

The character looks different in every shotGenerate every scene with the character sheet AND the room as reference images, and approve those two before anything else.
Animated poses flicker or the room shimmersOnly paste back the part that moved. Align each drawing to the plate and keep everything outside the moving box from the original.
Ghost hands or a doubled sleeveThe redrawn arm doesn't line up with the original shoulder. Shrink the box to the hands, drop that drawing, or move the original fingers in code instead.
Two captions overlap for a momentMake each caption finish fading out (~0.3 s) before the next one starts writing.
Bright orange looks salmonLower the exposure of that shot. Bright warm colours wash out first.
🙌Credit: drawings by Nano Banana Pro (Google) via Pika, voice by ElevenLabs, rendering with OpenCV, NumPy and FFmpeg, word timings with Whisper, handwriting in Caveat (SIL Open Font License). Claude by Anthropic.

This is what I do. Check out my work.

I make content, websites and AI tools for brands, with the same kind of AI tools you just saw.

See my portfolio →
Got a project in mind? paulino@trigonagency.com