Fill the gaps in your Bazarr subtitle library
Subtitlarr translates subtitles you already have — English, say — into the languages you're missing, using a local or cloud LLM. Bazarr stays the only thing that ever touches your media files.
How it works
Polls Bazarr's wanted list
On a schedule you control, Subtitlarr checks Bazarr for subtitles it's still missing.
Finds an existing source language
If the item already has a subtitle in one of your preferred languages (e.g. English), that becomes the translation source — read entirely through Bazarr's own API.
Translates with your engine cascade
Walks an ordered list of engines you configure — local (Ollama, llama.cpp) or cloud (Gemini, NVIDIA, OpenRouter, Groq) — falling back automatically on rate limits or failures.
Reattaches original timing and uploads
The LLM only ever sees dialogue text, never timestamps — translated text is reassembled onto the source subtitle's original timing, then uploaded back to Bazarr.
Why it's built this way
No media access
Subtitlarr never mounts your media library. All reading and writing goes through Bazarr's own REST API — Bazarr stays the only thing with filesystem access.
Multi-engine cascade
Mix any number of local and cloud engines in one ordered fallback list, with automatic rate-limit cooldowns and per-item model tracking.
Regional language variants
Spanish, Portuguese, English, French, and Chinese each get explicit regional-standard control — no more guessing which dialect a bare language code means.
Runs anywhere Docker does
Ships as a container with a published GHCR image, a Docker Compose example, and a ready-to-use Unraid Community Applications template.
How this compares to Lingarr
Lingarr is another subtitle-translation tool worth knowing about — the two take different approaches, and which fits depends on your setup.
| Subtitlarr | Lingarr | |
|---|---|---|
| Media/filesystem access | None — reads and writes subtitles entirely through Bazarr's own API | Requires mounting your media library directly (e.g. /movies, /tv) and writes subtitle files to disk itself |
| When it triggers | After Bazarr's own subtitle search has had a chance to find a real, existing translation — age-gated by default, so Bazarr's providers get first shot | Fires as soon as Radarr/Sonarr detects new media, ahead of Bazarr ever getting a chance to find a legitimate subtitle |
| Setup surface | One container, one connection (Bazarr's URL + API key) — everything else (engines, languages, schedule) is configured from its own web UI afterward | Connects separately to Radarr, Sonarr, and needs media volumes mapped correctly for every library |
Comparison based on Lingarr's own public documentation as of this writing — worth double-checking their current docs if something here looks out of date.