the first cut is always clumsy
Clumsy turns a prompt into a timeline, then a timeline into an MP4. It arranges footage you already own — no diffusion, no generated pixels, no black box. The plan is JSON you can read, diff, and re-render.
The model never writes ffmpeg. It emits a declarative timeline, and a compiler turns that into a filter graph. Generated shell commands can't be tested, diffed, cached, or re-rendered at another resolution. A JSON plan can be all four.
Two run once per asset. Three run once per video. The index is the seam between them.
Most of the difficulty in automated editing isn't stitching clips together. It's these.
Nothing retrieves well at file granularity. Ingest cuts every source at its scene boundaries, so the unit of search is a single shot with its own caption and embedding.
Every clip stores where it came from and where it lands, separately. Nothing is positional, so clips render in parallel, cache independently, and two plans diff cleanly.
The single largest gain in perceived quality per line of code. Ordinary shot choices cut on the beat read as deliberate; excellent ones cut off it read as accidental.
The same seed always produces the same file. Read it, edit it by hand, commit it next to your code.
// clumsy plan "dawn in an empty city" --dur 32 --ar 16:9 { "schema_version": "1.0", "seed": 8412, "canvas": { "w": 1920, "h": 1080, "fps": 30 }, "tracks": [{ "id": "v0", "clips": [{ "asset_id": "shot_0412", "src_in": 3.200, // where in the source "src_out": 6.100, "t_start": 0.000, // where on the timeline "t_end": 2.900, "transition_in": { "kind": "xfade", "dur": 0.5 } }] }] }
This is a crowded category. Here's the honest map, so you can tell quickly whether Clumsy is the wrong tool for you.
| Footage agents | Render APIs | Clumsy | |
|---|---|---|---|
| Input | What you upload for one project | JSON you write by hand | A prompt and a library you keep |
| Understanding | Speech transcripts | None — you bring the plan | Visual embeddings and captions |
| Silent footage | Struggles without dialogue | Not applicable | Works the same either way |
| Generated pixels | Usually yes | No | Never — by design |
| Same input, same file | No | Yes | Yes, seeded and versioned |
Point it at a folder. Ingest runs once and caches. After that, a render is a single command.