zippr
All prompts

3D

The Key, in 3D

A little 3D room with a swinging door.

Paste it into Claude or ChatGPT, answer its questions, and it makes the video. It works best in an app that can run code.

Make me a short film for my product the same way zippr made one particular film: "The Key, in 3D" (zippr.to). In it, a small blue mascot is locked out of a door at the end of a navy corridor. It pays coins, one after another, into a slow thought over the lock until the thinking turns into a key. The next time, one turn of the key opens the door at once, and no coin moves. It is a real little 3D room with a swinging door and warm light that throws the mascot's shadow, and the whole film is one Python program with no browser. Below is the exact recipe zippr used: the tools, the steps, the settings and the timings. Follow it as closely as you can. Only the parts about my product change.

WHAT IT COSTS

- The code tools in this recipe are free and open source. - zippr made it with Claude (Opus 5.5) on a paid Claude plan. Any AI app that can run Python can follow it. - One step was paid: zippr's mascot was drawn once with Google's Nano Banana Pro image model, 3 pictures at about $0.14 each (about $0.42). You can skip it: use a picture you already have, or have the hero drawn in code for free.

STEP 1: ASK ME FIRST

Before you make anything, ask me these questions. Use your question tool if you have one. Otherwise ask them one at a time in the chat. If I skip one, suggest an answer and tell me what you picked. 1. What is your product or business, in a sentence or two? 2. What is the one thing a viewer should take away? (zippr's: "Pay for thinking once.") 3. Who is going to watch it, and where: reels, a website, a talk? 4. Length and shape. zippr's film is 10 seconds, portrait 1080x1920 (a landscape 1920x1080 cut exists too). Keep 10 s, or stretch every beat evenly to 20 or 30 s? Portrait or landscape? 5. Your brand colours (hex codes if you have them), and your product's name as it should appear at the end. 6. The one line of words at the end (zippr's: "Pay for thinking once."), or none. 7. Your story in zippr's shape. Who is the hero, and what do they want (zippr's: to get through a door)? What does getting it cost the first time (zippr's: coins, paid one by one into a slow thought)? What does your product turn that into (zippr's: a key)? And what does the next time look like (zippr's: one turn, instant, nothing paid)? 8. The hero's picture: (a) you have one: a mascot, product photo or logo, ideally 3 poses (standing, looking up hopefully, jumping for joy) as PNGs with transparent backgrounds; (b) you want one generated like zippr's with Nano Banana Pro (paid, about $0.14 a picture; you run it, or give me access); (c) I draw it in code (free). 9. The room. zippr's is a navy corridor ending in a small arched tangerine door. Should your room be a corridor with a door, or another simple set (a shop counter, a shelf, a gate)? Which of your colours go on the colour roles in the recipe below (the room, and the one warm accent), or keep zippr's?

STEP 2: THE RECIPE (exactly how zippr made this film)

Where the method came from A prompt shared on Reddit's r/ClaudeAI, where Claude wrote a renderer instead of drawing pictures: "for the corridor, they made a 3d raycast written in numpy. They made everything else by drawing with cairo + adding effects". zippr used that prompt's product version word for word: "I would like to see you create a 1 minute video programmatically. The video should be coded and rendered using python, numpy, scipy, cairo, you are free to download anything else you might need. The theme of the video is [the story]. it should look stunning with motion graphics that are on the level of a commercial design studio, make the product insanely attractive to viewers and show off its best features in a visual way that anyone can immediately understand and "get it" The visuals should be detailed and the audio should also be programmed in however you see fit." It changed three things: "1 minute" became "10-second 9:16"; "you are free to download anything else you might need" became "use only the pinned tools installed for this test (Piper, FluidSynth with GeneralUser GS); download nothing else"; and the theme became its story. (Piper and FluidSynth made other cuts, with a score and a narrator. The film on zippr.to uses the sound below and needs neither.)

The tools - Claude (Opus 5.5): wrote the whole program from that paragraph, made every fix, and ran the fresh-eyes checks. - Python 3.11 with numpy: the 3D room is a raycaster. Each pixel gets a ray, and the nearest of floor, ceiling, two walls, back wall, door slab or the lit room behind it. - cairo, used from Python through cairocffi 1.7.1: draws everything crisp with gradients (the thought bubble, puffs, coins, key, chain, sparkles, rays, the hero's eyelids). - SciPy: the glow, the light rays, and the soft background in the close-up. - Pillow: turns Geist letters into masks for the words. cairo alone can't load a font file on a Mac without extra native code. - The font: Geist (weight 600), free under the SIL Open Font License. - ffmpeg with libx264 and AAC: frames are piped in as raw RGB, and there are no frame files on disk. - The sound: numpy only, from tones and filtered noise. There are no recordings and no music. - Paid, once, before this film: Nano Banana Pro (Google's gemini-3-pro-image, through Vertex AI, at 2K) drew the mascot's 3 poses, about $0.14 each by usage.

The steps, in order 1. The story first. Write it in one line, render a few key frames, and have a fresh reader describe what they see. 2. One plan file holds every time in the film and every camera key. The picture and every sound read it. 3. The program: frame(t) returns one 1080x1920 picture for any time t. It is a pure function of time, seeded, the same on every run. 4. Render with 6 worker processes, in order, piped straight into ffmpeg. One format took 58 to 81 seconds of wall time on a laptop. 5. The sound: numpy builds each sound at the times in the plan file. Mix, master, join. 6. Fresh eyes, then fixes. A separate AI (Claude Opus 5.5) is told nothing. It sees one frame every 0.2 s at phone width (390 px), with no sound, and says what happens and what it means. Fix what it misses, then ask a NEW reader. zippr ran 5 rounds and stopped when the readers began contradicting each other. Each read was about 80,000 tokens. 7. Check the finished file (below), then export.

The room (units are metres; the camera looks down +z) - A corridor 2.3 m wide (walls at x = -1.15 and +1.15), with the ceiling at 2.0 m and the back wall at z = 3.0. - The door is in the back wall: 0.6 m wide, with straight sides up to 0.62 m and a round top (radius 0.3), about 0.92 m tall. It hinges on its left edge. - The lock is on the door at x 0.15, height 0.47, with a big dark keyhole. A small wall clock hangs at (0.72, 1.06), radius 0.12. - The hero stands at x 0.66, z 2.66, and is 0.6 m tall. The coin stack is at (0.415, 2.8): 22 coins, each 0.062 m in radius and 0.019 m thick. The thought bubble is at (0.02, 1.16, 2.93), radius 0.135. - The colours are ROLES (sRGB, turned to linear light for the maths). My brand colours go onto the roles; zippr's value stays for any role my colours don't fill. The shades of a role are the same hue, lighter or darker. - THE ROOM (walls, wainscot, ceiling): walls #3D4D80, a darker wainscot #2B3863, ceiling #2E3657. Mine: my darkest or coolest colour, kept dark, so the warm light is the brightest thing in the film. - FLOOR: #5C4A45 with board lines. Mine: a dark warm neutral. - TRIM: cream #EDDEC7. Mine: my lightest neutral. - THE THING WANTED, the door (the one warm accent): #F5782E with darker seams #8C3D1A. Mine: my warmest or brightest colour. It must stand clearly apart from the room. - THE COST AND THE KEY (coins, lock, key, chain): brass #A87A3D. Keep brass unless my brand has its own gold. It must differ from the door. - LIGHT: the lamp and the door light stay warm (their values are below). - WORDS: off-white #F7EDDB. THE NAME: a lighter tone of the door's colour (zippr's #FF9E4D). - Keyhole #1A0F0A. - Lights (linear): a warm ceiling lamp at (0.3, 1.85, 1.55) aimed at the floor near the door, colour (1.0, 0.91, 0.78) x 1.45. The ambient is (0.50, 0.56, 0.74) x 0.55. The door light sits behind the door at (0.0, 0.55, 3.95), colour (1.0, 0.70, 0.40) x 2.6, and reaches the corridor ONLY through the doorway and around the slab: a per-pixel shadow test with 3 samples for a soft edge. So the light on the floor opens with the door. There is also a glossy streak on the floor boards. - The hero is a flat cut-out (its PNG's alpha) standing in the room, lit in numpy by the same two lights, and warmer on the door's side. Its long shadow toward the camera comes from the door light, sampled through its own alpha along each floor point's ray. - The post, per frame, in order: - god rays: a 26-sample radial blur of the doorway's light mask, decay 0.965, done at quarter size; - a filmic tone curve (Reinhard with white point 3, then gamma 2.2); - bloom on the lit scene only: pixels above luminance 0.74, two blurs (5 and 18 px at quarter size, mixed 0.55 and 0.45), screen-blended at 0.45; - a vignette of 1 - 0.38 r^1.4; - then the crisp graphic layer on top; - then fine grain (sigma 0.012, at half size) and a 1/255 dither. The close-up alone blurs the room behind the hero (depth of field, sigma 5 px). - Coins in flight are motion-blurred with 4 samples inside the shutter. The flying key leaves a faint trail: its pose a few hundredths of a second earlier, drawn faint.

The hero's pictures (the one paid step; follow this only if I chose (b)) - The model: Nano Banana Pro (Google's gemini-3-pro-image), through Vertex AI, at 2K, 16:9. It cost about $0.14 a picture by usage; Google's price page said $0.134 for a 1K or 2K picture. - What kept the character identical in 33 of 34 pictures: - one locked description, pasted word for word into every prompt; - the character's clean reference picture passed in with every call; - each new pose made as an EDIT of an existing picture, with one change per edit. - zippr's locked description: "a small chunky soft-vinyl toy creature: one rounded bean-shaped piece for head and body in matte cornflower-blue vinyl (#5387D8), with a pale periwinkle (#9DACD0) oval belly patch, two short rounded stub arms and two short round stub feet in the body's blue. The upper front of the bean is a large, softly rounded-rectangle screen set into the body, glowing a soft warm white (#FBE5CA). On that screen, and only on it, sit two small round glossy black eyes, each in a thin clear glossy rim and each carrying one round white catchlight. Two soft floppy dog ears in warm cream vinyl (#E6C28E) hang from the top of the head, one on each side. No mouth, no nose, no neck, and no marks, letters or numbers on the body." - The three pose prompts. Every one ends with: "The face-screen shows only its two eyes: no mouth, no nose, no symbol, no logo. No words, letters or numbers anywhere in the picture." 1. Standing, an edit of the character's first picture: "Edit this image. Keep the identical character: its shape, proportions, pose, colours, matte soft vinyl, face-screen glow, eyes and catchlights, and the same camera angle and framing. Only change: the setting. [The old background] is replaced by a plain, seamless, evenly lit light-grey studio backdrop that curves smoothly into the floor: one smooth neutral grey (about #C8C8C8), with no texture, no props, no doodles and no horizon line. The character stands on it with only a soft contact shadow under its feet. Soft, even studio light from the upper left, so its colours read true." 2. Looking up, an edit of picture 1 with the reference passed in: "The first image is the picture to edit. The second image shows a character, for reference only; copy its exact design, proportions, colours and material. Edit the first image. Keep the identical character (exactly as in the second image: its shape, proportions, colours and matte soft vinyl), the plain light-grey studio backdrop, the light and the framing; only change: its pose and expression, to hopeful. Its body turns a little toward the left of the picture (a three-quarter view, never more, the face-screen fully visible) and it looks up and to the left, as if at someone taller. The head tips back slightly. The two eyes are open wide and round, glossy, with bright round catchlights, gazing upward. The two stub arms are held together in front of the belly. The face-screen keeps its soft warm-white glow. It stands on the floor with a soft contact shadow." 3. The jump, an edit of picture 1 with the reference passed in. The opening is the same as prompt 2, then: "only change: its pose and expression, to a delighted jump. It is in mid-air, both feet well off the floor, a small happy hop; both stub arms thrown up high; both floppy ears flung up and outward by the jump. It faces the camera. The face-screen glows a brighter lime green, almost white-hot at its centre; the two eyes open wide and round, each with two big round catchlights, bright and glossy. A soft shadow on the floor below it, separate from its feet." - Then, free, in code: - cut each picture out of its grey backdrop (a model of the grey per row, plus a colour gate); - measure each pose once: its feet centre, its screen box and its eye ellipses (the half-lids are drawn over those); - mirror the looking-up pose so it faces the door; - recolour the jump's lime screen to warm white. - Designing the character in the first place took zippr several earlier rounds of pictures. Those are not in the $0.42.

zippr's story, beat by beat (10.0 s, 30 frames a second; frame = seconds x 30) - 0.00 s: the lamp flickers on. There is a navy corridor and a small arched tangerine door with a bronze lock. The hero stands beside it with 22 coins and a wall clock. The camera starts a slow dolly-in. - 0.30 to 0.62 s: three puffs rise from the keyhole (0.30, 0.36, 0.42 s), and a thought bubble pops open over the lock (0.44 to 0.62 s). Its three dots bob like an AI app's "..." at 2.6 waves a second. - 0.55 to 1.90 s: three coins flick off the stack and tumble into the thought (they land at 0.95, 1.45 and 1.90 s). It swells with each one, and the clock races (1.6 turns over the thinking). - 2.10 to 3.15 s: the stream. Ten coins, each flight 0.3 s, landing one every 0.1 s from 2.2 s to 3.1 s. The dots speed up and the bubble jitters. The pile sinks, and the hero's lids droop (2.0 to 3.05 s). - 3.15 s: the dots stop dead. 3.18 to 3.40 s: the thought bursts into a big gold key, in a flash of rays. It is born big and held until 3.54 s. - 3.54 to 3.90 s: the key flies to the lock, swings to point in, pushes in, and turns a quarter, seen from the front. CLACK at 3.90 s. (Seen side-on, a key read as a line at phone size.) - 3.96 to 4.52 s: the key hops onto a bead chain on the hero's chest. Route the key low, under the face, on its way to and from the chain: a key or card that crosses the face hides the eyes. 4.46 to 4.88 s: the door swings open 95 degrees in 3D, overshooting a little. Warm light floods the floor and throws the hero's shadow, and the camera pulls back. - 5.00 to 5.20 s: the door SLAMS shut and bounces 3.5 degrees. The camera shakes, dust puffs from the door's foot, and the lamp sways. 5.24 to 5.54 s: the clock spins three turns, a time-lapse: this is the next time. - 5.50 s: a puff, and a small new thought starts over the lock (5.52 to 5.66 s). - 5.66 to 6.10 s: cut to a close-up, field of view 48 degrees. The hero gives the camera "the look" (flat half-lids), and the key glints on its chest. The background is soft. - 6.10 s: cut to a medium shot of the lock. 6.14 to 6.42 s: the hero hops, and the key flips off the chain into the lock. 6.44 to 6.52 s: one quarter turn, and ONE click at 6.52 s. The new thought pops at 6.61 s, before a single coin moves. 6.58 to 6.82 s: the door flies open 100 degrees. The untouched coins gleam (6.66 to 7.0 s). - 6.82 to 7.20 s: the hero jumps for joy. Its screen glows warm white, and the key is back on its chain. Short arms raised beside the head read as ears: throw them out to the sides, clear of the head's outline. - 7.45 s on: the camera cranes out to a wide end frame. - 7.50, 7.68, 7.92 and 8.16 s: "Pay for / thinking once." rises word by word, on two rows, in Geist 600, off-white (#F7EDDB) over a soft dark shadow. - 8.85 s: "zippr" in tangerine (#FF9E4D, 92 px), scaling up from 0.86 as it fades in over 0.35 s, held to 10.0 s. The last frame rhymes with the first: the door is open, the hero wears the key, and 9 coins are still there. - The camera, portrait, as [time, eye position, look-at point, vertical field of view]: [0.0, (0.36,0.62,0.0), (0.34,0.70,3.0), 58], [3.15, (0.36,0.62,0.45), (0.33,0.72,3.0), 58], [3.52, (0.32,0.60,0.62), (0.28,0.68,3.0), 58], [3.92, (0.30,0.54,1.05), (0.24,0.56,3.0), 58], [4.76, (0.36,0.62,0.05), (0.34,0.70,3.0), 58], [5.219, (0.36,0.62,0.08), same, 58], [5.659, (0.36,0.62,0.12), same, 58], CUT [5.66, (0.66,0.40,1.78), (0.67,0.39,2.66), 48], [6.099, (0.66,0.40,1.84), same, 48], CUT [6.10, (0.38,0.54,1.10), (0.34,0.54,3.0), 56], [6.6, (0.38,0.54,1.05), same, 56], [7.45, (0.30,0.80,-0.10), (0.30,0.96,3.0), 60], [10.0, (0.30,0.80,0.0), same, 60]. Ease in and out between keys.

The hero, drawn over its cut-outs in cairo - Three poses: looking up hopefully (most of the film), standing (for the look, and after the jump), and the jump. The hero breathes (a 0.8% squash at 0.9 Hz), bounces when the key lands on its chest, and flinches at the slam. - Flat half-lids are drawn over the eyes in the screen's own colour, with a dark lid line. They sink to about half while it waits, and snap open when the thinking stops. - The chain is two straight rows of 11 small brass beads (#8C6420 under #F2CF7A), in a V. A curved line near a face reads as a mouth. - The key is brass, with a ring bow, a blade and 5 teeth.

The sound (no music; the scene's own sounds are the rhythm) - Made in numpy at 48 kHz, from tones and filtered noise, with a fixed random seed. There is no music bed and no voice. - Under everything: room tone (band noise 60 to 900 Hz, plus a quarter of 0.9 to 9 kHz) at -50 dB, and the lamp's hum (100 Hz plus 200 Hz) at -58 dB. - The sounds, what they are made of, and their gains in dB: - lamp strike (a 52 Hz thump, a noise click and a faint 1760 Hz ring), -6; - thought puffs (rising sine blips from 620 Hz, 180 Hz apart), -15, with a brighter puff as the bubble opens; - ticks, one per wave of the bubble's dots (30 ms of band noise, 1.8 to 6 kHz, with a 2200 Hz ring, alternating with a lower "tock"), -22, and 4 dB louder in the stream; - a coin "tink" for every coin (a sine with partials at 2.41x and 3.9x, 60 ms decay), pitched from MIDI note 84 and rising 2 semitones per coin: -11 for the first three, about -15 in the stream; - a short high bell (1568 Hz) as the key forms, -14; - a metal slide as the key goes in, -10; - the heavy CLACK, -6; - three tiny tinks on the chain, -12; - a soft creak as the door swings, -20; - the SLAM (a 62 Hz body, then a clack), -3; - quiet racing ticks for the time-lapse; - a dry "tock" for the look, -14; - a vinyl hop, -12; - ONE round click (12 ms of noise, 1.5 to 6 kHz, over modes at 480, 1250 and 2300 Hz), -5; - a bright pop as the new thought bursts, -8; - the hero's two-note chirp (1320 Hz, then 1980 Hz), -9; - a soft landing, -12; - a soft key click per word, -18; - one dry bell (C5, 523 Hz) under the name, -9. - The hits and their frames (at 30 fps): lamp 0; puffs 9, 11, 13; bubble opens 14; coins into the thought 29, 44, 57, then the stream; key forms 102; key goes in 114; CLACK 117; chain 136; SLAM 156; new thought 165; the look 171; hop 185; key goes in 193; ONE click 196; thought pops 199; chirp 205; chain 208; landing 216; words 225, 231, 238, 245; bell 266. - Every sound that goes with something you see starts 2 frames BEFORE that frame; the ear hears that as exactly on time. Swells and creaks END on their frame instead. - Mix: one clear sound per key moment, at least 6 dB louder than whatever is under it, and silence when the thinking stops. Master with a look-ahead peak limiter (no saturation) to -16 LUFS, true peak at or below -2.5 dBTP.

The finish - 1080x1920 (or 1920x1080), 30 fps, 10.0 s. H.264 High, level 4.0, yuv420p, crf 18, capped at 12 Mbit/s, tagged BT.709. AAC 192 kbit/s at 48 kHz stereo, with +faststart. zippr's file came out at about 16 MB.

STEP 3: SWAP IN MY PRODUCT

Keep the method (one Python program, a numpy raycast room, cairo graphics, the light and the post), the timings, the camera moves and the sound design exactly. Change only these: - zippr's mascot becomes my hero, from question 8. - The corridor and door become my room (question 9), my colours go on the colour roles, and the coins become what my hero's goal costs the first time. - The thought bubble becomes the slow work, and the key becomes what my product gives. - "One turn, the door flies open" becomes my one-step payoff, and the door's warm light becomes the moment it works. - "Pay for thinking once." becomes my line, and "zippr" becomes my name, in my accent colour. - If my set isn't a door, keep a light that is blocked at first and floods in at the payoff: it is what makes this style.

STEP 4: SHOW ME THE PLAN, THEN WAIT

Write my story in two sentences, then my beat table with times in zippr's format, then my colours on their roles. If you can run code, render 4 stills in the finished look (for example at 0.8 s, 3.4 s, 5.8 s and 9.5 s). Wait for my yes before you build the whole film.

STEP 5: MAKE IT

If you are an AI app that can run code and save files, follow the recipe and give me the MP4 with sound. Ask me before installing anything. cairo may need installing: it is the cairo library plus the cairocffi Python package. If it's missing, ask me, or draw the graphics with Pillow and tell me. If you can't run code, build it as one self-contained web page that plays in the chat. Draw the room on a canvas: a raycast in JavaScript at a lower resolution, or a simpler one-point perspective. Make the sounds live in the browser. Add a big Play button (browsers only play sound after a tap), a Replay button, and a "Save as video" button if the browser allows. Tell me how to screen-record it with sound on a phone and on a computer. Say plainly that it will look simpler than the Python version.

STEP 6: CHECK IT BEFORE YOU GIVE IT TO ME

- Put one frame from every 0.5 s on a contact sheet and look at it at phone size. Could someone who never saw this message say what the film means from the frames alone? Fix what doesn't read. - On the file: it plays start to end; each hit sound starts 2 frames before its picture and is clearly audible; the loudness is -16 LUFS and the peaks are below -1 dB. - Then give me the file, one still, and one honest line on anything you couldn't do. Never use copyrighted music.