CAPRA Download GitHub ↗

Models

Capra speaks the OpenAI protocol and nothing else, which is why almost anything works: LM Studio, Ollama, llama.cpp's server, vLLM, Google, OpenAI, OpenRouter, a company gateway. If it answers POST /chat/completions, it will do.

The four roles

Settings shows which model is filling each, and what happens when nothing is.

RoleWhat it doesWithout one
VisionDescribes individual frames — who is in them, what they are doing, what is in the room.Capra still finds shots, scenes, dialogue and sound, but cannot say what is in the picture. This is the one that matters.
TextReconstructs scenes and writes the screenplay.Capra assembles the script from what it measured. Readable, and noticeably plainer than a model writing it.
AudioTranscribes speech when you have no subtitle file.Bring an .srt. Subtitles are better than transcription anyway: they carry the writer's own words.
EmbeddingSearch, and matching characters across shots.Search falls back to a substring scan. Character matching leans harder on faces.

Local

Free, private, and slower. Load a model, then press Find local servers in Settings — Capra probes localhost for the usual ports and asks each one what it has.

ModelVRAMNotes
qwen2.5-vl-7b~6 GBWhat this project was developed against. Good at people and posture.
gemma-3-12b-it~9 GBBetter at text inside the frame — signs, screens, subtitles burned into the picture.
internvl3-8b~7 GBStrong on objects and layout.

The one thing worth knowing before you start: a 7B vision model and a 27B text model will not both fit on a 12 GB card. Loading the second evicts the first and the analysis stops mid-pass. Either load the vision model and let it take both roles — it is worse at prose and it works — or point the text role at a cloud provider. The two are configured independently for exactly this reason.

Capra probes each model when you add it and records what it actually supports rather than what it claims: whether it accepts images, whether it honours a JSON schema, and how long it took. A model that fails the probe is still usable — the requests simply degrade to plain JSON and then to a prompt instruction.

Cloud

Settings offers three by name, with the URL filled in:

ProviderBase URL
Google Geminihttps://generativelanguage.googleapis.com/v1beta/openai
OpenAIhttps://api.openai.com/v1
OpenRouterhttps://openrouter.ai/api/v1

Anything else: Add provider, and paste the URL yourself. If it already carries a path, Capra leaves it exactly as you typed it; only a bare host gets /v1 appended.

About the key

It is encrypted with the operating system's own keystore — DPAPI on Windows, Keychain on macOS, libsecret where there is one — and never leaves the main process. The renderer is given a reference, never the key itself, and nothing about a request is cached except the model's answer.

If you move a project to another machine the key does not travel with it. Keys live in the application's preferences, never in the project directory, so copying a project folder never carries a credential.

Speed

Two thirds of an analysis is vision calls. On the test film that was 319 of them at a mean of 6.4 seconds — about 34 minutes of model time on one local GPU.

Against a cloud provider those calls are latency rather than compute, so they overlap almost perfectly. The presets ask for six at a time, which is inside the free-tier limits of all three and turns that forty-minute pass into a few minutes. Local providers stay at one, where the GPU is the constraint and more requests only add queueing.

You can change the number per provider in Settings.