Releases: emreyvz/capra
Release list
Capra 0.2.3
Windows and Linux. Quick start · Models
| Windows | Capra-0.2.3-setup.exe |
| Linux | Capra-0.2.3.AppImage — chmod +x and run it |
The Audio role now reaches something
Settings has offered four model roles since the beginning. Two of them were connected to anything. Transcription went to the bundled Whisper unconditionally, so a model added under Audio was stored, listed, and never asked for a thing.
It could not even be added. Adding a model probes it, probing sent a chat request, and a transcription endpoint answers that with a 404 that reads like a wrong model name. Probing is by role now, and an Audio model is verified by sending it a second of generated audio — the same way vision has always been verified with a generated image.
Add whisper-1, gpt-4o-transcribe, or a local faster-whisper server, and the dialogue is transcribed there. Without one, the Whisper in the box is still used, and the log says which one heard the film — that decides how good the dialogue is, and it should not have to be inferred from the result.
Only for films with no subtitles. A project with an .srt beside it never transcribes at all.
Cutting a feature up, and putting the timings back
The request was the easy half. A transcription endpoint takes a file with a size limit — usually 25 MB, and Capra's 16 kHz mono audio is 32 kB a second, so anything over about thirteen minutes has to be split.
That is the part that is silently wrong when it is wrong: a transcript whose timings are all ten minutes early still looks exactly like a transcript.
- Chunks are consecutive and never overlap, so every second belongs to exactly one request.
- The cut moves to the quietest moment within fifteen seconds of where it wanted to be, found by reading the samples already on disk. A cut through a word costs that word twice and neither half is a word.
- A chunk that fails does not fail the film, and the log names the minutes that have no dialogue. That is a fact about the screenplay; quietly having fewer lines is not.
- The tail of what was heard is carried forward as a spelling hint, or a character called Karahanlı comes back four ways across four chunks.
- Segments timestamped past the end of their own audio are dropped. Whisper-family models hallucinate a closing caption there, and left in it lands on top of the next chunk's real dialogue.
If nothing comes back it says so, rather than quietly using the local model instead. The substitution would be the kind thing to do and the wrong one — you chose a model, and a silent fallback means the next film transcribes differently for reasons nobody can see.
The Embedding role stays unwired, and now says so
Its description claimed search and character matching. Neither was true: only body and face vectors are ever written, both from the local appearance signature that is required to work with no model at all, and search is full-text. An OpenAI-compatible /v1/embeddings endpoint takes text, and Capra writes no text vector anywhere — so connecting it would mean building semantic search, which is a feature rather than a missing wire.
It is better to say that than to leave somebody configuring a model that nothing will ask for.
Notes
- No macOS build. An unsigned, unnotarised
.dmgis refused on arrival by recent macOS.npm run diston a Mac produces a working local build. - Neither binary is code-signed, so Windows SmartScreen will warn on first run: More info → Run anyway.
- Your API keys are encrypted with the operating system's own keystore and never leave the main process.
Capra 0.2.2
Windows and Linux. Quick start · Models
| Windows | Capra-0.2.2-setup.exe |
| Linux | Capra-0.2.2.AppImage — chmod +x and run it |
Six faults, found by using the application. Four of them were not what they looked like.
The screenplay was in Turkish and the page showed an English one
language on a screenplay meant "a translation into X", so one the model wrote in Turkish because the user asked for Turkish was filed as the untranslated original. Asking to read Turkish then went looking for a translation, found one made earlier from an English draft, and showed that — a document from before the cast was named, with MAN 4 in the action and half its headings still in English, while the current Turkish screenplay sat one button away under "Original".
A document now records what language its words are in, which is a separate fact from being a translation of another, and a new original retires the translations of the one it replaces: a translation of a draft that no longer exists cannot be traced back to anything.
Three more language faults behind that one. The scene-details prompt was the only writing prompt carrying no language instruction, so the panel describing the room came back in English beside a Turkish page. Its cached answer was keyed without the language, so switching returned the old one. And a scene heading is assembled in three parts of which the table owned two: İÇ. and GECE were translated and FORMAL MEETING ROOM between them was not. A room's name is whatever the film happened to contain, so it is translated once for the project — and changing the language after an analysis now rewrites the headings instead of requiring the whole film to be analysed again.
The script did not follow the film until you left the page and came back
The <video> element only exists once there is a proxy to play, and the effect reporting the playhead depended on a store action that never changes. It ran once, on mount, with the ref still null, and never again — nothing was ever listening to the video. Exactly the first run: the page is open while the analysis works, the proxy appears a minute in, the element mounts, and no listener goes on it. The test written for the two known cases found a third.
The same film could not be analysed twice
The project folder was named after the video and nothing else, so a second analysis was refused outright. It is numbered now — My Film (1).capra — and the earlier project is untouched. There is also a door for a project somebody hands you, which until now existed only if this copy of Capra had opened it before.
Everybody was named and the page still said MAN 4
Three characters rendered to one name. The numbering reserves inputs — a number within a noun group — and the name is built from those by another function, from a descriptor that can change after the number was issued. The output is checked now: whatever the numbering did, no two characters may be called the same thing. It matters more than it looks, because renaming replaces the old name wherever it appears — naming one of the three rewrote the other two's action lines and left them both still called what the first one used to be.
Two smaller ones
Speech has its own ink, a blue-black rather than a colour — the shift a second pen makes on a page, not a highlighter. Exports stay monochrome; that one is a screenplay, this is a reading surface.
Each scene's room and arrangement is in the document, under its own heading, instead of a list at the front nobody pages back to. Written as a note, so it reaches Fountain, PDF, DOCX, plain text and the page on screen through a type they all already lay out — and so it stays visibly not the screenplay. It is what Capra observed, written down for whoever reads it next.
Also
Provider keys written before Capra had a keystore are moved into it on the next start. They were readable in AppData by anything running as that user, and the marker that keeps an old key working also meant it stayed in the clear until the day it was next typed — which nobody does to a key that works.
Notes
- No macOS build. An unsigned, unnotarised
.dmgis refused on arrival by recent macOS.npm run diston a Mac produces a working local build. - Neither binary is code-signed, so Windows SmartScreen will warn on first run: More info → Run anyway.
Capra 0.2.1
Windows and Linux. Quick start · Models
| Windows | Capra-0.2.1-setup.exe |
| Linux | Capra-0.2.1.AppImage — chmod +x and run it |
Needs ffmpeg on your PATH and one model. Everything else is in the box.
Since 0.1.0
It says what it is doing. The analysis reported itself in three words in a corner and a two-pixel line at the top edge, while the middle of the screen — where you are actually looking — showed a still frame doing nothing. There is an account under the film now: the stage, the percentage, what has been found so far. The bar's width is a real fraction of real steps and never moves on its own; a sheen over the part already covered says the process is alive without claiming it has advanced.
Ctrl-Z. Naming a character and saying who speaks a line were not journalled at all — the two edits people most often regret. Both are reversible now, and Shift-Z puts them back.
A quarter of the analysis time. Two thirds of a run is vision calls, and a third of that was ffmpeg extracting frames it had already extracted once, from the original file rather than from the 720p proxy that exists by then. Same picture, far cheaper seek, and the extraction now overlaps the inference instead of waiting for it.
A screenplay actually in the language you asked for. Headings, times of day and the front matter of every export were assembled in code and code had them in English only, so Turkish came back as Turkish dialogue under INT. UNKNOWN LOCATION 4 - NIGHT. They use each industry's own convention now — İÇ./DIŞ. and GÜNDÜZ/GECE, INNEN/AUSSEN — and the version you last chose to read is remembered.
The speaker of a line is correctable from the page. The question queue only ever asks about lines with no speaker, so a line confidently credited to the wrong person could not be fixed anywhere. Click the name.
A cast page you can work in. Search, named characters first, extras told apart automatically and never asked about, drag one card onto another to merge them, and "Not the same person?" takes a card apart so you can regroup it.
Its own icon, instead of Electron's default.
Plus: the film beside the script and beside the relationship graph, the set of each scene written out and carried into exports, faces on the graph and in every picker, autosave on everything typed, and a page that fell over says what happened instead of going black.
Notes
- No macOS build. An unsigned, unnotarised
.dmgis refused on arrival by recent macOS, and signing needs a certificate this project does not have.npm run diston a Mac produces a working local build. - Neither binary is code-signed, so Windows SmartScreen will warn on first run: More info → Run anyway.
- Your API keys are encrypted with the operating system's own keystore and never leave the main process.
Capra 0.2.0
Superseded by 0.2.1, released a few minutes later with the analysis progress shown under the film. Take that one.
Capra 0.1.0
First public build. Windows and Linux.
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.
Install
| Windows | Capra-0.1.0-setup.exe |
| Linux | Capra-0.1.0.AppImage — chmod +x and run it |
Then:
- Install ffmpeg.
winget install ffmpeg/sudo apt install ffmpeg. Capra will not start work without one. - Point it at a model. Settings → local (LM Studio, Ollama) or cloud (Google Gemini, OpenAI, OpenRouter). The URLs are filled in for you.
A vision model is the one that matters. Without it Capra still finds shots, scenes, dialogue and sound — it just cannot say what is in the picture.
📖 Quick start · Models · Troubleshooting
What is in it
- Shot, scene and camera analysis measured from the file rather than guessed
- Cast identification across the whole film, with what it cannot settle handed back as questions beside the moment they are about
- A screenplay in standard format, every line linked to the second it came from
- Where things stand in the room, read from the frame and copyable as an instruction
- Export to PDF, Final Draft, Fountain, DOCX, SRT and plain text
- Ctrl-Z, and every change journalled with its evidence
Notes
- No macOS build. An unsigned, unnotarised
.dmgis refused on arrival by recent macOS, and signing needs a certificate this project does not have.npm run diston a Mac produces a working local build. - Neither binary is code-signed, so Windows SmartScreen will warn on first run: More info → Run anyway.
- Your API keys are encrypted with the operating system's own keystore and never leave the main process.