Animation compiler
Prompt in, cartoon out.
Type a premise. Pick a style of cartoon. Amarna writes the episode, compiles it into scenes, and draws them at 60 frames a second in your browser — a watchable animated show you can then take apart beat by beat.
The same second of the same show, in three of the nineteen packs. Nothing was rewritten or regenerated between them — a style is data the compiler reads, so changing it costs a recompile.
One sentence in, six things out
Every stage below runs from the same document. Change the document and only what depended on it is redrawn — which is why a style change costs a recompile rather than a regeneration.
01 Writes
A show bible, a three-act episode and a per-scene shot list, from one sentence — with the built-in writer or with Claude — in one of six registers, from deadpan to the 2 a.m. one.
02 Compiles
Procedural sets for 68 places, seeded characters, blocking, a camera track, baked lip sync, effects, captions and an audio-description track.
03 Renders
60fps on a canvas, in nineteen style packs across three shelves — variable-width ink, line boil, paper grain, rim light, haze, depth of field and gate weave.
04 Speaks
A deterministic formant synth driven by the same phoneme track that moves the mouths, so audio and lip sync cannot drift apart. A thirteen-control mix desk sits on top. With a key, a real speech provider replaces it.
05 Edits
A timeline where every beat is a block: click to select, drag to re-order, drag the edge to hold it longer. Ten fields per beat in the inspector. Everything is undoable, and the document survives the tab closing.
06 Exports
mp4 via WebCodecs at 360p–2160p, WebM where WebCodecs is missing, plus a still,
a .wav, captions, the screenplay and the show.json
itself — which you can drop back on the page to reopen.
Nineteen styles, on three shelves
Each style is data — ink, fill, paper, figure proportion, motion cadence and camera behaviour — so switching one is a recompile, not a rewrite. Underneath them sit the same seventy controls, and moving any of them saves a tune beside the style. Every pack is named in our own terms; none is named after anybody's property.
Cartoon drawn, flat, and unashamed of it
- Cutout Paper
- Flat Ink
- Rubber Hose
- Neon Drift
- Chalk Pastel
- Bold Marker
- Prime Time
- Sharp Cel
- Chibi Pop
- Atomic Retro
- Deco Noir
- Wobble Gag
Late night where the writing carries it and the drawing is free to be blunt
- Late Cable
- Pen Wobble
- Grim Ink
- Crisp Vector
Naturalistic real proportion, real light, real distance
- Painted Real
- Soft Key
- Traced Live
How it works
The language model writes a document and then stops. Everything after that point is ordinary code with a seed, which is what makes the same premise draw the same frames twice — and what makes a single beat editable without regenerating the show around it.
→ The model writes
It produces a structured show document — characters, scenes, beats, ten fields each — and never touches a pixel. Its output is validated against a schema before anything downstream sees it.
→ The compiler stages
Sets are generated for the named place, characters are seeded from their description, and the blocking, camera and lip sync are derived. Same document, same staging, every time.
→ The renderer draws
A canvas, a style pack and a frame number. No frame depends on the one before it, which is why scrubbing the timeline is instant and why export is just the same function called faster than real time.
It runs as a repository too — the writer, the compiler and the renderer are all drivable from a terminal with no browser involved.
# the app, at http://127.0.0.1:5173/app npm run dev # document, screenplay, captions, description and audio — no browser npm run generate -- "a haunted laundromat in a small town" --style chalk-pastel # the same premise, written in a different register npm run generate -- "a haunted laundromat" --register feral # batch render to mp4 npm run render -- --in out/show.json --fps 24 --width 1280
Type a premise and see what it draws
The built-in writer needs no key and costs nothing. Everything happens in your browser.
Open the app