Behind the scenes

The Making of
THE ODYSSEY

A 90-second film, cast entirely in ASCII text, built and directed end-to-end by Kimi K3 running inside Claude Code — no stock footage, no templates, no human touching a single pixel. Here's how it actually happened.

Title card

01 One paragraph, one film

The entire brief was a single sentence: build the most realistic Boeing 747 in three.js — wait, wrong file. For this one, the ask was even shorter: write an ASCII adaptation of Homer's Odyssey and direct it like a real film. Everything below — the renderer, the ten scenes, the camera moves, the score — Kimi invented on its own.

0assets used
12scenes
2,172frames hand-drawn
90.5sruntime

02 It built its own camera before it built the story

Before writing a single scene, Kimi wrote itself a tiny film studio: a character-grid renderer, a rasterizer to turn text into pixels, and — critically — a way to look at what it had drawn. Every scene got checked against a real render before moving on.

I'll build this as a real production: a Python ASCII render engine, scene-by-scene direction, a Pillow rasterizer, visual self-inspection loops, then ffmpeg encode.Kimi K3, turn 1

03 The blooper reel it never showed you

This is the fun part. Kimi rendered a frame, looked at it, hated it, and fixed it — over and over. Real quotes, no cleanup:

The title text is uniform blobs — no internal texture… after render #1
Title still fails — the vignette multiplies the text down to mid-density glyphs. I need to draw text after vignetting.after render #2
My "silhouette + rim" double-draw in Cyclops cancels itself (the max undoes the min).debugging the cave scene
Storm is a wall of dense glyphs that swallows the ship — the sea needs a gamma to suppress mid-tones, plus a hull shadow to silhouette the ship against foam.fixing the storm
Sea and moon now work. Remaining fixes: title text needs near-uniform dense glyphs, stars should be tiny dots not bright letters…the punch-list kept growing
Common diseases: backgrounds are dot-fields instead of black, vignette dims the text… time for a comprehensive revision pass.the moment it stopped patching and rewrote

04 Old tricks, done in a text file

No shaders, no GPU — every "cinematic" effect is arithmetic on a grid of characters.

film grain — random brightness jitter, ±3% vignette — darken toward the frame edge bloom on fire & torches gate weave — vintage-projector wobble dither, to kill banding in the glows

(The gate weave got cut in the final pass — at character-grid resolution a one-row shift is a visible jump, not a wobble, so it was removed for a steadier image. Real film-restoration problem, solved the same way an editor would.)

05 The gallery

All twelve scenes, straight off the render engine.

06 Beaten 495 times, kept working

Kimi K3 runs on a shared, rate-limited API. Over the two-hour build it got knocked back with "rate limit exceeded" 495 separate times — and just retried, quietly, until each scene actually rendered.

145agent turns
495rate-limit hits survived
125 minbuild time
$6.75total cost

07 Then it scored its own film

In a follow-up session, Kimi turned the silent film into a full production — narrator, orchestral score, and sound design — using ElevenLabs. It wrote twelve original passages, one per scene, then had to solve the hardest part: making a real human voice land exactly on the picture.

Bill speaks ~20% slower than George — every passage was shortened and re-measured until it fit its window with margin: troy 28→19 words, cyclops 28→22 (kept the "Nobody" wordplay), penelope 24→16.repacing the narration, take 2

That "Nobody" line is a three-thousand-year-old joke: in the original, Odysseus tells the Cyclops his name is Nobody — so when he's blinded and screams for help, the other Cyclopes hear "Nobody is hurting me!" and walk away. Kimi kept the gag.

08 Casting an elder bard

The first cut used a smooth, youthful narrator. Asked for someone older, Kimi auditioned voices instead of guessing:

The only roster voice labeled "old" — wise, mature, balanced. Previewed against Callum (husky trickster — wrong character) with the title line before committing.casting the narrator

09 The trick that keeps the voice audible

Orchestral score and narration fight for the same space. Kimi's fix is the same one real film mixers use: sidechain ducking — the score automatically drops in volume the instant the narrator speaks, then swells back in the silence.

Sidechain duck8:1, 30ms attackmusic ducks 10–13 dB under speech, swells back between lines
Thunder crack18.5stimed to the lightning flash, not just "somewhere in the storm"
Cyclops' roar30.6slands exactly on the blinding flash
Arrow whoosh68.8sfired on the frame the bowstring releases
Hall melee70.3scovers the suitors' fall under score

Final master: three audio buses (voice / ducked music / effects) through a limiter and two-pass loudness normalization — the same signal chain a professional mix engineer would reach for.