Storyboard blocking for AI filmmaking β directed by you and Claude, together, live.
Emulsion is a Claude Code skill that ships its own three.js app. You block scenes with rough primitives and blocky people, keyframe the action and a shot camera, and export a motion/camera reference clip for AI video models (Seedance 2 and friends). The agent works inside the app while you watch β every edit it makes streams into your browser, it narrates as it goes, and you can grab anything and change it by hand.
From blocking to film β a reference clip exported from Emulsion (left) and the frame a video model generated from it (right):
You talk to Claude in the terminal; the app runs beside it:
- "Block me a funeral procession on a winding country road, 1930s camera." β the scene assembles in front of you, narrated with toasts.
- Drag a person somewhere better; the agent sees your edit before its next change.
- Click π Annotate, click the thing that bugs you, paste the copied token
into chat: "
@person#2 t=4.20sβ slower here." - βΊ Export video renders the shot camera to MP4, straight into the project's asset shelf β that's your reference clip for the video model.
npx skills add dennisonbertram/emulsion # via skills.sh
# or manually:
git clone https://github.com/dennisonbertram/emulsion ~/dev/emulsion
ln -s ~/dev/emulsion ~/.claude/skills/emulsionThen in any Claude Code session: "storyboard a chase scene for me" β the
agent starts the bridge (python3 server.py, port 8741), opens the app in
your browser, and directs.
Run it without an agent: python3 server.py and open http://localhost:8741 β
it's a perfectly good manual blocking tool.
- Objects: box / sphere / cylinder / cone / person. Drag a body to slide it
on the ground, gizmo (
W/E/R) for precise moves. Non-uniform scale turns boxes into roads, walls, props. People auto-walk when their keys move them. - Keyframes:
Kkeys the selected object at the playhead; keyed objects re-key when you drag them. Eased by default,linearfor constant speed.,/.step through every key. Markers: blue = camera, orange = object. - Camera: frame your view and press
Cto key it, or enter Shot view (Tab) and operate it like a camera:WASDdolly/truck,Q/Eboom, drag to pan/tilt, FOV slider zooms,Ckeys the framing.camera.followauto-tracks a subject. - π Lock (
L) freezes the blocking while you browse. - π¬ Shots save whole layouts; π Sets save just the scenery β load a set to stage a new shot in the same place. π Assets collects every reference image, prompt, and export (exports save versioned β nothing is overwritten).
Through the shot camera:
Everything on one table β shots, sets, and assets, with one-click staging:
- Block the scene β objects, keyframes, camera move (by hand, by agent, or both).
- Export the shot camera to MP4 β the motion/camera reference.
- Reference stills β generate style frames with your image model of choice; they collect in the asset shelf.
- Prompt β a beat-by-beat description matching the blocking timeline.
- Generate β feed reference clip + stills + prompt to a video model.
A complete worked example (blocking exports, stills, prompts, generated film, and a promo cut made entirely through this pipeline) lives in the media release.
index.html + app.js the editor (three.js from CDN, no build step)
server.py stdlib bridge: static hosting + op log (the app polls),
scene state, shot/set libraries, annotations, assets
qa.mjs headless CDP probe for verifying frames
export.mjs headless export driver (records the shot camera to MP4)
SKILL.md the agent-facing manual (op catalog, spec format,
camera-rig recipes)
shots/ sets/ assets/ your project, as plain JSON and files
The sync design is deliberately simple: agents POST full scene specs to /op,
browsers poll and apply them (sequence numbers drop stale ops), the app pushes
user edits back to /state, and last writer wins. No CRDTs, no build step, no
dependencies beyond Python 3, Node (for the headless helpers), and a browser.
PRs are very welcome; the skill even instructs agents to contribute improvements back upstream automatically. Rough priorities:
Motion
- Spline paths with timing handles β separate the walked path from the schedule ("arrive later" without re-authoring keys)
- Pose presets (sit, kneel, carry, point, embrace) blended over the walk cycle
- Secondary motion: walk bob, torso counter-rotation, camera damping
Editing controls
- A sequence timeline: order shots into a cut, trim in/out points per shot, export the whole sequence as one reference video
- Versioned cuts with side-by-side compare
- EDL/JSON export for real NLEs
Audio controls
- Beat/dialogue markers on the timeline that flow into the generation prompt ("line lands at 4.2s")
- Temp ambience/music tracks under preview and export
- Audio annotations β click a moment, describe what it should sound like
Camera
- Rig presets in the UI (orbit / dolly / crane / push-in) that bake ordinary keyframes
- Handheld/shake flavor, DOF and framing guides (thirds, headroom)
Sets & world
- A richer prop kit (stairs, arches, vehicles, terrain/elevation)
- Lighting presets: time of day, key/fill direction, weather
Collaboration & agents
- Per-object patch ops (merge instead of replace), interaction leases during drags
- Range/path annotation targets (
@camera:2.0β6.0s), pulse highlight on whatever the agent just changed - An MCP server exposing the op catalog so any agent framework can direct
- Pluggable generation backends (bring your own image/video model CLI)
Open an issue with your use case, or just send the PR.
MIT β free for anyone to use and modify.




