How Claude Code directed "The Most Boring Movie Ever (Ever) Made": pipeline, orchestration, and the checks that caught its own mistakes (full breakdown) - $16.87 OpenRouter Spend
Video attached (3:12, with outtakes). I wrote a joke script with my AI agents: five characters forced to watch a film where a sock puppet called Gerald sits in a lawn chair facing a beige wall for 7 hours 46 minutes, next to a goose. The Council's commentary IS the film. Last night I gave it to Claude Code (Opus 5.5) and said: short, cutting-edge animation, it has to live by the commentary, and if it's a no-go, say so. Here is how it ran the production. Setup One long session in the Claude Code desktop app, with me giving notes. One API gateway, OpenRouter, for every model. I gave them a Mac Mini and an API key. ffmpeg, Python, Pillow and a local Whisper. No video editor was opened. Budget: a $20 cap agreed up front, the cost reported after every batch, and a yes asked before each new spend. Actual total: $16.87 for the film, the outtakes and a reusable character kit. 1. Feasibility and design It researched current models first, then said yes and proposed the format: Mystery Science Theater, reversed. - SCREEN shots: the dull film itself, in grainy 16mm beige, made with Veo 3.1 Lite at $0.05 a second. - ROW shots: the agents in a tiny felt cinema, lit by the screen's flicker, reacting. These are made with Kling v3 Pro at $0.168 a second, because it generates lip-synced dialogue natively. - One wide shot from behind the row. It also wrote a "spirit" section into a production bible and checked every decision against it. The laughs come from honest reactions to nothing, so hold the boring shots long enough to actually be boring, then cut to a face. 2. Keyframes first Gemini 3 Pro Image ($0.14 a still) made the character sheet and then the first frame of every shot. Every video is image-to-video from a checked still, so the five puppets stay identical from shot to shot. Each character's voice is pinned by one exact description, reused word for word in every prompt. 3. The runner vid.py takes a JSON shot list, submits the jobs, polls them, downloads the results and logs the cost. It runs four jobs in parallel and skips any shot that already exists, so a reshoot is one flag. The main batch was 14 shots for $10.77. Claude runs it as a background job and keeps building the cards and the edit while it renders. 4. Things the models got wrong, and the fixes - The goose walked off its mark. It was meant to stand still and, at the very end, turn its head to camera. Claude made a still of the head already turned, then re-shot with Veo 3.1 Fast locked at BOTH ends: python "frame_images": [{"type": "image_url", "image_url": {"url": still_start}, "frame_type": "first_frame"}, {"type": "image_url", "image_url": {"url": still_head_turned}, "frame_type": "last_frame"}] Kling painted gibberish text on a back wall. Fixed with a crop in the shot list. No re-render. The runtime counter. This ffmpeg build has no drawtext, so the "0:00:17 / 7:46:00" counter is drawn frame by frame with Pillow and overlaid. It jumps (0:17, then 47 minutes later, then 5:12:00) and clamps at 7:46:00. Veo shots made with audio off have no audio track at all, which broke the concat. The assembler now adds a quiet projector-whirr bed wherever a clip has no sound. 5. It checks its own output - Whisper transcribes every dialogue shot with word timestamps, to confirm the line said is the line written. - It pulls frame sheets across each shot to check continuity and the goose's mark. - Before upload, it removed my surname from the title, the credits and five clapperboards. Then it proved it was gone with normalised cross-correlation against the old text. The test is brightness-independent, because a plain pixel-difference check missed the name ghosting faintly through the opening fade. 538 frames checked, zero matches. - Every deliverable gets a full decode test ( ffmpeg -v error -f null - ). That caught one encode that came out corrupt. The re-run was clean. 6. The edit edit.py reads edl.json , in which each row is tag, source, in-point, duration, counter start, crop and gain. It normalises every segment to 1080p24, burns in the counter, adds the room-tone bed, joins the segments and loudness-normalises the mix. A re-cut is a text edit and a few minutes of rebuild, with no spend. 7. "Save all the assets, it's got potential for re-editing" - Every shot, and every still each shot started from, plus the shot list, the scripts, a production bible, a changelog and a re-edit guide. - A SHA-256 checksum for every file, with the whole folder mirrored to a second machine and verified. The characters then got a reusable kit: - turnaround and expression sheets per puppet, made from studio references, because the cinema frames made the seats bleed into the sheets; - the exact style lines; - one clean voice line cut per character; - a proof scene; - one rule, "the pictures are the characters". Mid-batch, a 502 error crashed the sheet generation after four images had already been charged, so the cost first reported was wrong. The lesson it saved: read the balance after any crash before reporting the cost. 8. Memory across a long session The context got compacted during the night. Every decision was written to a persistent memory store, along with the phrases I'd naturally use to ask for it ("recreate the characters", "where are the film files"). Then Claude tested that a fresh context could find each one, including a negative control that correctly returned nothing. 9. The outtakes were Claude Code's idea A prompt suggestion (the grey ghost text in the input box, Tab to accept) offered a blooper reel with the walking goose. I accepted it. The reel is built almost entirely from the failed takes: The only new spend was a Lyria jazz bed, $0.04. It's stitched after the film with 1.5 seconds of black. 10. Getting it Reddit-ready - Reddit takes the first frame as the thumbnail, so the file opens on a 1.5-second showcase frame: the whole bored Council in a row, with the counter reading "0:00:00 / 7:46:00". It's centred, so the mobile square crop still lands on Viper. - Encode: H.264 High, x264 at its slowest setting with the animation tuning, CRF 16, 104 MB, all metadata stripped.