A 3D character that acts on cue

Write what happens as a JSON spec: the shots by type, the acting as verbs. Blender builds the set, checks every camera and the body, and renders. No keyframes and no coordinates.

Mara, from the kitchen example: eight shots and twelve beats of JSON

Why not generate the clip?

An image-to-video model gives you a few seconds of a person who looks about right and does roughly what you asked. It cannot hold a face across twenty shots, put a mug down on a word, or do the same thing again tomorrow. A rigged character can: the same person in every shot, and every move on the frame the spec names.

A cartoon man at a kitchen table drinking tea, turned to a small computer with a face on the counter
Just a Quick One, the toolkit's trailer: 45 seconds of kitchen from two specs

Model, rig, render

  1. A model is a shape and its colours. It cannot move. The built-in cast is described in JSON; a fitted character starts as a model from an image-to-3D service.
  2. The rig makes it a character: joints, a face, fingers, and verbs such as walk, sit_down, carry and sip. Every character shares it, so a verb written once works on all of them.
  3. A render is one film: the character in a set, acting on cue, drawn frame by frame.
A generated model of a woman, the same model with the rig's joints drawn on it, and a rendered frame of her holding a mug in a kitchen
The model, the joints fitted to it, and a frame of the film

How it works

  1. Write the spec, or have Claude Code write it from a brief: a set, a cast, shots (wide, closeup, side) and beats in seconds or on narration words.
  2. Run check. In seconds it verifies every camera by geometry and measures the body: a hand inside the body, a limb through a table, a sliding foot, a mug that tips. A camera that fails is moved by a solver. You read a contact sheet before anything renders.
  3. Render a whole film with its sound on the motion, or one clip per shot for a Remotion video, transparent if you ask.
  4. Revise from notes. A film like the trailer takes a few sessions, each started from a prompt the last one wrote, with your notes pasted in.
{"at": 0, "do": "carry", "prop": "cup"},
{"at": "T2_walk+0.1", "do": "walk",
 "to": [0, 0.41], "curve": true},
{"at": "T4_sit+0.1", "do": "sit_down"},
{"at": "T4_sit+3.5", "do": "put_down",
 "prop": "cup"},
{"at": "T6_sip+1.5", "do": "sip"}
A contact sheet of eight labelled stills, one per shot, each marked ok
The contact sheet check writes: one still per shot, and what the solver moved

What it needs

Blender 4.2 or later, which is free, and nothing else in the toolkit depends on it. The limit is your machine. On an Apple M4 a frame at 1080p takes 1.6 seconds for the built-in cast and about 2.2 for a fitted character in a lit room, so the 27-second kitchen example is 25 minutes and a trailer with revisions is an evening. Without a GPU it still renders, far more slowly. Run doctor first: it finds Blender and times a frame on your machine.

It has been run in full on macOS, and the first examples on Linux. Windows is untested. Fitted characters, the kitchen and the lecture hall are experimental: the fit still wants its joints read off a picture by hand.

uv run tools/blender_render.py doctor
ok    Blender 5.3.0 at /opt/homebrew/bin/blender
ok    ffmpeg
ok    test render: 1.60 s/frame at 1920x1080

Start

Four examples run from the repository: a character film, a product stage, clips inside a Remotion video, and the kitchen with a fitted character. The format and every verb are in the blender skill; setup, timings and how a film is made over several sessions are in docs/blender.md.

uv run tools/blender_render.py check \
  examples/blender-disk-panic/spec.json
# then, in Claude Code:
Make a 20 second 3D short: a developer
finds the disk is full and panics.
A wide shot of a kitchen at night: a woman at the table with a laptop and a mug, and a small computer with a face typing on the counter
The last shot of the kitchen example, a camera put where the spec says