A take on disk
demo.mp4 + demo.take/ — the postable master and its working directory.
A take is two things on disk: the postable master at exactly your --out
path, and a working directory beside it holding everything else.
demos/
myapp.mp4 ← the one you post
myapp.take/ ← the working dir
composition.json the whole cinematic layer, editable
capture.mp4 the KEPT raw screen capture
capture.json the ground-truth event log of the shoot
review.mp4 badged review copy (render --review)
draft.mp4 clean fast draft (render --draft)
ab.mp4 the last A/B reel
prev.mp4 the master this one replaced — mechanical revert
prev.composition.json the composition that rendered prev.mp4
frames.png beat-aware contact sheet (frames)
dossier.md the exploration harvest — the app, remembered
notes.md director's notes from the editor's Agent panel
notes.cursor how far notes has readPost the mp4; ignore, .gitignore (*.take/) or delete the folder. Deleting
it keeps the video and gives up re-rendering — the recording is not
regenerable.
Resolution
Wherever a command takes <take>, you can pass the master mp4, the .take/
directory, any file inside it, or a directory holding exactly one take — the
rest resolves by convention. Two *.take/ directories in one folder is an
error rather than a guess.
Where takes live
The default --out is demos/take.mp4. Keep takes together in one folder and
name each after the app or the cut — demos/myapp.mp4,
demos/myapp-pricing.mp4 — so their masters sit side by side, which is how you
compare and pick one.
make refuses to overwrite a take that was shot from a different app; the
honest case (same app, new dev-server port) is --force.
The composition is the source of truth
composition.json holds framing, background look, cursor feel, and every beat
with its zoom decision — real coordinates, real timings:
{
"kind": "press",
"label": "Deploy",
"bbox": { "x": 640, "y": 220, "w": 640, "h": 248 },
"zoom": { "enabled": true, "scale": 1.8, "center": { "x": 960, "y": 344 } }
}The mp4 is a render of this file over the kept capture. Change a value,
render again — the app is never re-driven.