Subarr: a GUI + coverage layer for your Bazarr/subgen subtitle stack

If you run Bazarr and subgen, you’ve probably hit two things: subgen has no interface (it’s webhook-only, you fire events at it and hope), and nothing really shows you which files across your whole library are actually missing subs. Subarr is the GUI that sits over both.

Two ways to use it:

Simple - a real queue UI for subgen. Library tab, tick a file, a folder, a whole series, or the lot, hit “queue for transcription,” watch live per-job progress, cancel or re-queue. No more curling subgen from a terminal.

Deeper - a coverage/measurement layer. It reads Bazarr’s wanted list, verifies each file on disk before calling it a gap (so it won’t queue something that already has an embedded sub), and runs calibrated multi-chunk audio-language detection so Whisper transcribes the right language instead of burning a 40-minute run on a mislabelled track. There’s a provenance trail of which provider gave you which sub, and a scheduler so subgen doesn’t get hammered by event storms.

It sits beside Bazarr and subgen and doesn’t replace either - Bazarr stays the librarian, subgen the transcriber, subarr is the coordination and the interface.

Docker, runs on a Pi if you’re patient with CPU Whisper, MIT licensed. Telemetry is anonymous and one-click-off, with the exact payload visible in Settings. Built with AI assistance (Claude), human-reviewed.

Repo and screenshots: GitHub - coaxk/subarr: The coordination, measurement, and quality layer that subgen never had. A peer service for the *arr family that adds calibrated audio-language detection, provider success leaderboards, and (v1.1) an in-app Whisper tuning lab. · GitHub

Genuinely after feedback, especially edge cases and setups I haven’t tested. Ideally drop bugs and ideas in as GitHub issues so I can track them properly.





Subarr v1.2 is out.

The big one this release: Subarr now listens to your audio and tells you the truth about the language, and there is a Tuning Lab for finding the Whisper settings that actually work on your hardware.

  • Audio-language verification: it hears a mislabelled track (tagged Danish, audio is actually Dutch), tells a genuinely bilingual file apart from a mis-label, and falls back to the tag when it is not sure. One click to confirm, and the fix flows back into your coverage.
  • Library-wide audio scan: run that same listening pass over the whole library, not just files you touched. Opt-in, throttled, GPU-polite, resumable.
  • Tuning Lab: sweep Whisper recipes against your live subgen, a validated judge ranks them across several clips, and a per-language leaderboard surfaces the dependable default for each language. Nothing is written to your library.
  • Plus: edit integration credentials in-app (no restart), a performance pass, and the usual pile of fixes.

It stands beside Bazarr, it does not replace it. Bazarr finds and downloads, subgen transcribes, subarr coordinates and verifies.

GitHub: GitHub - coaxk/subarr: The coordination, measurement, and quality layer that subgen never had. A peer service for the *arr family that adds calibrated audio-language detection, provider success leaderboards, and (v1.1) an in-app Whisper tuning lab. · GitHub

Full release notes: Release subarr 1.2.0 — the Tuning Lab and verified audio · coaxk/subarr · GitHub

Screens of new features:

As always, any dramas hit me up here or drop in an issue over on Issues · coaxk/subarr · GitHub

Enjoy!

subarr v1.5 is out.

This release is mostly built from your requests.

Multiple media locations. The most requested feature since launch. Your library no longer has to live under one mappable root. Each location, whether that is a second disk, a 4K share, or an anime mount, becomes a library with its own subgen and arr path prefixes. Subarr reads your Sonarr and Radarr root folders and suggests anything not yet covered as a one click “Add as library”, and there is a manual form for the rest, with live path validation. Changes apply without a restart. If your setup already works under a single root, nothing changes for you: zero migration, zero config edits.

arm64 images. The image is now multi-arch (amd64 and arm64), so Pi 4 and Pi 5 installs work out of the box. No more exec format errors or building locally.

Coverage that survives restarts. If Sonarr or Bazarr hiccuped while subarr was rebuilding its coverage snapshot (classic timing after a stack restart), the dashboard used to turn into an all-“Analyzing” wall for about ten minutes. Degraded builds are now held back, and the last good snapshot keeps serving until your stack is actually reachable again.

Crash telemetry, with the privacy line where it belongs.When a background loop fails, subarr now reports the exception type, the module and line, and a count. That is the entire payload. Never error messages, never tracebacks, never file paths. The full detail stays local on your own Health page, and the transparency panel in Settings shows you the exact JSON that leaves your box, with a one-click opt-out. The reason this exists: a regression that slips past CI should show up across the fleet in hours, not break installs silently for a week.

Fixes worth knowing about. Library search results now actually drill down when you click them, and the Coverage search box is a real input now (it was, embarrassingly, a decorative placeholder). And a same-day hotfix in 1.5.1: brand new installs with no activity yet were seeing sample demo rows in the Overview, fabricated filenames and all. One user reasonably concluded subarr was writing mystery files to their server. It was not, but the confusion was entirely our fault, and the dashboard now shows an honest empty state instead. Thanks to the reporter on r/Softwarr for flagging it.

A transparency note. A validation bug on our telemetry endpoint had been rejecting all pings for about three days. Fixed server-side, nothing for you to do, but if you watch the public stats page that is why the install count dipped. It is also a fair preview of why this release ships crash telemetry: silent failures are the enemy, including ours.

Upgrade is the usual docker compose pull and up. No migration, no config changes.

Release notes: Release v1.5.1 - multiple media locations, arm64, fleet crash telemetry · coaxk/subarr · GitHub
Repo and five-minute install: GitHub - coaxk/subarr: The coordination, measurement, and quality layer that subgen never had. A peer service for the *arr family that adds calibrated audio-language detection, provider success leaderboards, and (v1.1) an in-app Whisper tuning lab. · GitHub

Next up, design already locked: multiple Sonarr, Radarr, and Bazarr instances for the split anime-stack setups. Issue #161 if you want to follow or weigh in.

subarr v1.6.0 is out, and our subgen image now ships with heavily pre-tuned Whisper settings baked in

If you run subarr-subgen, you no longer have to figure out the good Whisper settings yourself. This release bakes in the tuned defaults I’ve been refining for months (the kwargs and the regroup settings that decide how lines get split and timed), so a fresh install starts from a tuned place instead of stock Whisper.

On top of that, subarr now configures the hardware side for you too. The setup wizard detects your GPU, reads its VRAM, recommends a Whisper model, and works out the right precision (float16, int8, or int8_float16), and it shows you the reasoning rather than just picking. If you’ve never been sure whether to run medium or large-v3, it tells you why. You get the config as a copy/paste block that works with any subgen, or subarr can apply it live to subarr-subgen.

A couple of other things in this release:

The dashboard now warns you if you’re running with no authentication, because subarr ships open by default and that should be a choice you make on purpose, not a surprise you find later.

You can hover any flagged subtitle to see exactly which quality signals fired on it, things like looping, hallucination over silence, ad and boilerplate junk, sync that overruns the file, and readability.

Plus the usual round of fixes: log-injection hardening, dev builds no longer nag you about a backward update, and a phantom self upgrade notice is gone.

Existing installs need nothing special. Pull the new image and you’re current, no migrations, no config changes.

Free, self-hosted, one compose file: GitHub - coaxk/subarr: The coordination, measurement, and quality layer that subgen never had. A peer service for the *arr family that adds calibrated audio-language detection, provider success leaderboards, and (v1.1) an in-app Whisper tuning lab. · GitHub

Full changelog: Release v1.6.0 — Guided subgen setup · coaxk/subarr · GitHub

subarr v2.2.0 - blacklist bad subs, fill forced-only gaps, and find every control

A bunch of you have been running subarr beside Bazarr since launch, and this release is mostly the things you asked for after living with it.

  • Blacklist a bad sub without leaving subarr. When a provider sub is broken, you can blacklist it straight from the Aftercare row or the Library tree, and Bazarr stops re-fetching that same release. It shows the file’s actual Bazarr download history so you blacklist the right one, and it only touches real provider downloads, never your manual uploads.
  • Transcribe a full sub on forced only files. If a file’s only English sub is a forced track (the kind that only covers foreign dialogue, not the whole episode), subarr used to just show it as “subgen will skip.” Now each one gets a one click
  • Transcribe full sub button that generates a complete subtitle for just that file, without you having to flip subgen’s global forced-subs setting.
  • Per title ignore. Some shows you just don’t want subs for. You can now mark a whole show or a single file as ignored, inline, and subarr stops surfacing it as a gap.
  • A home for the scattered controls. Force, ignore, and language settings live on the pages where you actually use them, which made them hard to find as a set. There’s now an “Other subtitle controls” card on the Rules page that points you to each one.
  • On demand database backup with a deep integrity check, from the Health page - a clean defragmented copy whenever you want one.
  • A real reliability pass: a UI freeze under load is fixed (it was doing filesystem work on the event loop on every poll), plus database durability, Plex-client resilience, queue reconciliation, and auth hardening, all from real-world use.

subarr stays what it’s always been: a coordination layer beside Bazarr, not a replacement. Still AI-assisted in the open, still free.

Upgrade is a normal image pull. The forced-sub feature needs the matching subgen image: GitHub - coaxk/subarr: The coordination, measurement, and quality layer that subgen never had. A peer service for the *arr family that adds calibrated audio-language detection, provider success leaderboards, and (v1.1) an in-app Whisper tuning lab. · GitHub

Full changelog: Release v2.2.0 — Bazarr-parity force/ignore controls, per-title ignore, and a deep pass on reliability · coaxk/subarr · GitHub

Happy to answer anything in the comments.

subarr v2.4.0: readable subtitles (automatic re-timing), proper multilingual audio, and you can finally see subarr’s own logs

For anyone who hasn’t run into it before: subarr is a coordination layer that sits next to Bazarr and drives subgen (Whisper) to fill the gaps Bazarr can’t. It’s a coverage dashboard over your Sonarr/Radarr/Bazarr/Plex libraries that generates, checks and cleans up subtitles. It’s not a Bazarr replacement, it works alongside it. Free, and built in the open.

This one’s mostly about subtitle quality rather than just getting a sub on disk.

Fast subtitles are readable now, automatically. You know the ones: a line pops up and it’s gone before you’ve finished reading it. subarr now goes over every subtitle it makes and stretches the cues that scroll by too fast into the silent gap before the next line, so the words actually stay up long enough to read. It never shortens a cue and never creates an overlap (it only ever uses the gap that’s genuinely there), and running it twice does nothing the second time. I tuned it offline against about 1,800 real subs from my own library before trusting it, and the cues that were too fast to comfortably read went from 23% down to around 5%, with no new overlaps at all.

One thing worth knowing: it’s on by default in 2.4.0, because on real files it was just a clear win. If you’d rather subarr leave your timings alone, set SUBARR_RETIME_ENABLED=0 and it does nothing.

Multilingual films get handled properly. Something like As Bestas (Galician, Spanish and French all in the one track) used to get flagged as if its audio were mislabelled English. Now subarr recognises when a track really is more than one language and marks it multilingual instead of nagging you with a false “suspect” warning. You can accept or fix that call right in the Review page with a multi-language picker, or tag a track zxx when there’s no actual spoken language in it (constructed gibberish, silent-film scores, that kind of thing). Multilingual and zxx files just get left for Whisper to detect per chunk instead of being forced into one language.

You can see subarr’s own logs now. If something falls over in a background task, you don’t have to go poking around inside the container anymore. The Logs page has a subgen / subarr switch so you can tail subarr’s own log live, and the Health page has a “Recent errors” panel with tracebacks you can expand. There’s a SUBARR_DEBUG=1 knob too if you want everything verbose while you’re troubleshooting. All of it stays on your box, nothing new gets sent anywhere.

There’s the usual round of smaller fixes as well. Audio languages are consistent 2-letter codes throughout now, integration calls fail cleanly instead of throwing raw errors when a client gets recycled mid-request, and the manual “fill this gap” button on a movie uploads straight to Bazarr the way the episode one already did.

Upgrading is just a normal image pull (ghcr.io/coaxk/subarr:2.4.0, or :latest). It’s multi-arch so it’ll run on a Pi too. The only thing to know going in is the re-timer default I mentioned above.

Full changelog: Release v2.4.0 — Automatic subtitle re-timing, on by default · coaxk/subarr · GitHub

Happy to answer anything in the comments.