Takes a film apart — shots, scenes, cast, dialogue, sound — and writes back a screenplay you can trace, line by line, to the frame it came from.
Every page is a view onto one analysis — the timeline, the playhead and the selection are shared, so following something from a line of the script to the second it came from is one click in any direction.
The film, the beats and dialogue beside it as they happen, and every track of the analysis underneath. Speech reads at full weight and what the camera saw a step back from it, so you can follow one without reading the other.
Everyone Capra found, named first, with the frames each of them was found in. Principals, supporting parts and extras are told apart automatically — nobody is ever asked to name a passer-by. Drag one card onto another to say they are the same person.
What Capra could not settle, asked beside the moment it is about, with the film playing. Every answer changes the script: a merge collapses two cards everywhere, an attribution rewrites the character cue on the page. It learns where your line falls and stops asking about pairs you have already refused.
The screenplay on paper, with the film beside it. Click any line and it plays the seconds it came from. Edit anything — what you write survives every rewrite — and the rail in the margin says how much of each line Capra stands behind.
Who deals with whom, drawn as faces with the weight of the claim between them. Click a relationship and the seconds it rests on play beside it, because an edge saying two people fight is a reading of a few seconds of footage.
What each scene needs before you could shoot it: cast, wardrobe, props, lighting, camera, sound, and its length in eighths of a page. Exports tab-separated for a scheduling tool. VFX and SFX are reported empty rather than guessed at.
Exports: PDF, Final Draft (.fdx), Fountain, DOCX, SRT, plain text, plus the
production sheet and a director's breakdown.
1. Install — download the latest release, or build it yourself:
npm install
npm run dev # run it
npm run dist # build an installer2. Install ffmpeg. Capra will not run without it.
winget install ffmpeg # Windows
brew install ffmpeg # macOS
sudo apt install ffmpeg # Debian/Ubuntu3. Give it a model. Settings → add a provider. Capra speaks the OpenAI protocol, so almost anything works.
Local — free, private, slower
Install LM Studio or Ollama, load a vision model, and press Find local servers in Settings.
| Role | What to load | Notes |
|---|---|---|
| Vision | qwen2.5-vl-7b |
~6 GB VRAM. What this project was developed against. |
gemma-3-12b-it |
Better on text in the frame, needs more room. | |
| Text | any 8–27B instruct model | Optional. Without one, Capra assembles the script from what it measured. |
One caveat worth knowing: a 7B vision model and a 27B text model will not both fit on a 12 GB card. Load the vision model and let it do both roles, or point the text role at a cloud provider.
Cloud — faster, costs money
Settings → Add Google Gemini / Add OpenAI / Add OpenRouter, paste the key, pick a model. The URL is filled in for you.
Your key is encrypted with the operating system's own keystore — DPAPI on Windows, Keychain on macOS — and never leaves the main process.
Vision against a cloud provider is the single biggest speed-up available: those calls are latency rather than compute, so they overlap. A pass that takes forty minutes locally takes a few minutes remotely.
4. Open a video and watch it work. The analysis runs in stages and you can read the screenplay while it is still being written.
Three layers, kept strictly apart, because conflating them is how a tool like this starts producing confident nonsense.
- Raw media — the file and its measurable properties.
23.976 fps, 3840×2160, H.265 - Observation — something Capra can point at, with a timecode.
at 00:12:31 a person is at the door - Interpretation — what was concluded from that.
"Ahmet opens the door." — inferred, 78%
Observations are append-only and never rewritten by a model. An inference is never shown as an observation: the distinction is carried in the typography rather than in badges — observed text is set solid, inferred text takes a hairline underline, a guess a dotted one.
Your edits are authoritative. Regenerating rebuilds everything except what you wrote.
Issues and pull requests are welcome. A few things that will make yours land faster:
Before you open a PR
npm run typecheck && npm run test:unitBoth must pass. CI runs exactly these.
What a good PR looks like here
- One thing. A change that fixes a bug and tidies four files is two pull requests.
- A test that fails without your change. Then check it: break the fix again and watch the test go red. A test that passes either way is worse than none.
- Say why in the code, not only in the PR. This codebase explains its reasoning in comments — what went wrong, what was measured, why the number is that number. Match it. A comment that only restates the line above it is noise; one that says what happens if you get it wrong is worth ten.
- Measure claims about behaviour. "This is faster" is a question, not a statement. Run it and put the figure in the message.
- Never invent output. If Capra cannot tell, it says so. A confident wrong answer is the one failure mode this project treats as unacceptable.
Where things are
src/main/ the Electron main process — pipeline, database, IPC
src/renderer/ the interface
src/shared/ types and logic both processes need
tests/unit/ fast, no model, no ffmpeg — these run in CI
tests/integration/ talks to a real model server, skips itself when there is none
MIT. Courier Prime and IBM Plex are bundled under the SIL Open Font Licence. FFmpeg is not bundled — Capra uses whatever is on your PATH.
Built by Emre Yavuz




