Stickman films, directed by your coding agent, rendered as code. No video-generation model, no video API, renders locally.
Overview
No video-generation model, no video API, renders locally. , a 58-second ad for a made-up app. A coding agent produced it with Stickman Kino from a short brief: script, storyboard, voice-over, music, animation and render. Watch with sound · All films · film.json · scenes.js There is no Sora, Veo, Runway or other video model, and no video API or per-video credits. Your coding agent (Claude Code, Codex, Cursor, Gemini CLI and similar) writes a script and scene code; a small engine draws every frame from that code on your machine. The agent is the only AI in the loop. The agent follows the skills in this repo and produces two files: - film.json: the clips, narration, theme, music, intro and outro - scenes.js: the choreography, written against the engine Then it runs the pipeline: voice-over and music are generated locally, the film is composed, checked, snapshotted for visual review, and rendered to MP4. Chorus above was made this way.
README
[!NOTE] Nothing here generates pixels. There is no Sora, Veo, Runway or other video model, and no video API or per-video credits. Your coding agent (Claude Code, Codex, Cursor, Gemini CLI and similar) writes a script and scene code; a small engine draws every frame from that code on your machine. The agent is the only AI in the loop.
What it does
You ask your coding agent for a film:
Make a 60-second stickman ad for a made-up app that ends the "whose turn is it?"
chore fight at home. Catchy music, a clear story, an intro and an outro.
The agent follows the skills in this repo and produces two files:
film.json: the clips, narration, theme, music, intro and outroscenes.js: the choreography, written against the engine
Then it runs the pipeline: voice-over and music are generated locally, the film is composed, checked, snapshotted for visual review, and rendered to MP4. Chorus above was made this way.
How it works
flowchart LR
A["Brieftopic, script, article"] -->|director skill| B["film.jsonclips, narration, theme, music"]
B -->|stickman audio| C["Local voice, generated music and SFXreal clip durations"]
B -->|animator skill| D["scenes.jsengine calls timed to the narration"]
C --> E["stickman compose"]
D --> E
E -->|check, snapshot| F{"Agent reviewsits own frames"}
F -->|fix| D
F -->|ok| G["MP4 / WebM / GIF"]
- Rendering is deterministic. A film is a HyperFrames composition: one paused GSAP timeline, seeked frame by frame in headless Chrome. No clocks, randomness or network calls are allowed in scene code (the engine has a seeded RNG, and a test enforces this). Same inputs, same pixels.
- Narration drives timing. Each clip’s voice-over is synthesised first, so clip lengths come from real audio. Scenes then place actions on words, for example
chart.grow(sc.cue("doubled")). - The agent checks its work. The skills require
stickman check(lint, runtime, layout and contrast checks) and a look at snapshot contact sheets before rendering.
More detail in docs/how-it-works.md.
Why stick figures
A rigged stick figure is identical in every shot, which is the main thing generated video still struggles with. Because poses and positions are plain numbers in code, an agent can reason about them, place a hand on a chart or walk a character to a mark, and fix one moment without touching the rest. The style also suits explainers, where clarity matters more than realism.
Why it’s different
| Manual tools / stock footage | AI video models | Stickman Kino | |
|---|---|---|---|
| Same character in every shot | Yes | Drifts | Yes |
| Readable text, real numbers, charts | Yes | Often garbled | Yes |
| Fix one moment without regenerating | Yes | No | Yes |
| Narration synced to actions | Manual | Unreliable | Word-level cues |
| Music and SFX licensing | Paid or manual | n/a | Generated from code |
| Video API or per-video credits | No | Required | No |
| Works from a plain-English request | No | Yes | Yes, via your coding agent |
What’s in the box
- Four agent skills (director, animator, sound, producer): a five-beat story structure, a word budget per clip, three visual beats per clip, narration-synced actions, and a mandatory review loop.
- A stick figure rig: 58 poses, walk and run cycles, jump, climb, sit, kneel, fall and throw, two-bone arm IK (
reach,point,tap), simple faces, and 14 character presets with hats, hair, shirts, dresses and props in hand. - 202 props in one line-art style, theme-aware, constant line weight at any size.
- 19 chart and diagram types: bar, line, pie and donut, counters, progress, gauge, flowcharts with moving tokens, timelines, venn, versus split, network, pyramid, cycle, 2x2 matrix, funnel, table, balance scale.
- Text: 12 entrance effects, word highlight, underline, strike and circle, titles, lower thirds, labels, speech and thought bubbles, checklists, and captions generated from the narration.
- Camera, effects and scenes: focus, push, follow, whip and shake; 22 effects; 15 transitions; environments such as city, road, office and stage; 8 themes plus custom brand colours.
- Intros and outros: 4 of each (countdown, clapperboard, logo, spotlight; call to action, credits, end screen, “made with”), declared in one line of
film.json. - Local audio: Kokoro text-to-speech (12 voices), 9 procedurally generated music styles, 41 synthesised sound effects, loudness-normalised mix. No samples, so nothing to license.
- CLI:
new,build,audio,check,snapshot,render,gif,prompts,list, and asetupthat works without sudo on Linux and WSL.
More sample films
All of these are in samples/ with their source. Watch them with sound.
| Hello, Stickman (15 s) | Compound interest (50 s) | The 2-minute rule (9:16) | Showcase (44 s) |
|---|---|---|---|
| the smallest complete film | paper theme, charts, British voice | dark theme, captions from narration | three themes, camera follow |
Quick start
You need: Node 18 or newer, and a coding agent that can run terminal commands on your computer (Claude Code, Codex CLI, Cursor, Gemini CLI, Copilot agent mode, Windsurf and similar). Python 3.10 to 3.12 is optional, for the local voice.
git clone https://github.com/dsauce/stickman-kino.git && cd stickman-kino
npm install
node bin/stickman.mjs setup # finds or fixes Chrome, installs the local voice, checks the toolchain
node bin/stickman.mjs build samples/chorus # writes samples/chorus/renders/chorus.mp4
Then open the folder in your agent and ask for a film. To use the skills in any project:
node bin/stickman.mjs install-skills # copies the skills to ~/.claude/skills, ~/.codex/skills and ~/.agents/skills
Claude Code can also load it as a plugin: /plugin marketplace add dsauce/stickman-kino.
Or install the CLI from npm, without cloning:
npm install -g stickman-kino
stickman setup
stickman install-skills # makes the skills available to your agent in any folder
stickman new videos/my-film
Documentation
| Getting started | install, first film, the CLI |
| Using with agents | Claude Code, Codex, Cursor, Gemini CLI, Copilot, Windsurf, Aider |
| film.json reference | every field, intros and outros, captions (JSON Schema) |
| Engine API | figures, props, text, charts, camera, effects, environments, transitions, titles |
| Cookbook | 17 tested recipes for common explainer moments |
| Characters and poses · Props · Themes | the catalogue |
| Audio | voices, music styles, sound effects, loudness |
| AI-video prompts | optional export of the same storyboard as text-to-video prompts |
| How it works · Troubleshooting · FAQ | internals, fixes, answers |
Limitations
- Cue timing is approximate. Word times are estimated from the text and the measured clip duration, not forced-aligned to the audio. Local Whisper alignment is on the roadmap.
- No two-figure interactions yet. Characters can share a scene and react to each other, but there are no helpers for handshakes, carrying things together and similar.
- It needs a local toolchain. Node 18+ and a Chrome or Chromium. Chat-only tools (ChatGPT, claude.ai) can draft
film.jsonandscenes.js, but cannot render. - Agent self-review has limits. It reliably catches layout problems such as overlaps, clipping and off-screen elements. It is weaker on timing and on taste.
- Rendering is CPU-bound. About 2 to 3 minutes per minute of 1080p on a laptop without a GPU. Draft quality and snapshots are much faster.
- Stick figures only. The look is deliberately simple; there is no photoreal or 3D mode.
Related work
Video as code is not new: Remotion, Manim and Motion Canvas are mature and more general. The difference here is the agent skills that do the directing (story, timing, review), plus a built-in rig, prop library and local audio pipeline aimed at one specific format: narrated stick-figure explainers. The optional prompt export and the five-beat story structure draw on kaomei/stickman-video-director.
Roadmap
- Word-accurate cue timing with local Whisper alignment
- Two-figure interactions (handshake, high-five, carry together)
- Mouth movement driven by the narration
- More characters and outfits
- One script, several languages (voice and captions)
Ideas and bug reports are welcome in issues and discussions.
Contributing
New props, poses, characters, music styles and recipes are the easiest places to start. See CONTRIBUTING.md.
Author
Prerit Ahuja · preritahuja.com · LinkedIn · GitHub
I work on making AI reliable enough for sustained real-world use; this is a side project exploring that idea in video.
Credits
Rendering by HyperFrames (Apache-2.0), animation by GSAP (installed from npm, not redistributed), voice by Kokoro-82M (Apache-2.0), fonts Inter, Caveat and Permanent Marker (OFL). Full list in THIRD_PARTY_NOTICES.md.
License
MIT © Prerit Ahuja. Music and sound effects produced by Stickman Kino are generated from scratch and are yours to use. Chorus is a fictional product made up for the demo.
If this is useful to you, a star helps other people find it.
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add dsauce/stickman-kino