Skip to content

Releases: coaxk/subarr

v1.5.1 - multiple media locations, arm64, fleet crash telemetry

11 Jun 10:03
7f553a2

Choose a tag to compare

The "my library does not fit under one root" release. Mostly built from your asks. (v1.5.1 includes a same-day hotfix on top of 1.5.0, details at the end.)

Multiple media locations (libraries)

The most requested feature since launch (#134). Model each media location, whether that is a second disk, a 4K share, or an anime mount, as a library with its own filesystem root, subgen prefix, and *arr path prefix.

  • Settings > Libraries (also offered during onboarding): Sonarr/Radarr root folders not covered by any library surface as one-click "Add as library" suggestions, plus a manual add form with live path validation. Changes apply without a restart.
  • Existing single-root installs change nothing. Zero migration, zero config edits. Internally, extra libraries qualify file keys with a stable @<id>/ head while the default library keeps today''s keys.
  • Mount each location in subarr AND subgen (mirrored on the *arr side). See the README section for a compose example.

Multi-arch images: linux/arm64

ghcr.io/coaxk/subarr now publishes amd64 and arm64 (#70). Pi 4/5 installs work out of the box. No more exec-format errors or building locally.

Coverage survives restarts

A transient Sonarr/Bazarr hiccup during a coverage build (the classic stack-restart timing) used to replace your snapshot with an all-"Analyzing" wall for around 10 minutes (#167). Degraded builds are now held: the last good snapshot keeps serving until your stack is actually back, with a loud log line so nothing fails silently.

Fleet crash telemetry

When a background loop fails, subarr (telemetry on, one-click opt-out) reports the exception type, module:line, and a count. That is the entire payload. Never messages, tracebacks, or paths (#157). Full detail stays local on your Health page, and the Settings transparency panel shows the exact JSON that leaves your box. The point: a release regression that slips past CI now surfaces across the fleet in hours instead of festering silently.

Fixes

  • Hotfix in 1.5.1 (#193): the Overview showed sample/demo rows when there was no real activity yet. New installs saw fabricated "Recent activity" entries for files that do not exist, including an impossible "opensubs 429" failure, and CPU-only installs saw placeholder GPU numbers. Both now show honest empty states. Thanks to u0126 on r/Softwarr for the report; the rest of their dashboard (66k files discovered, 8k Bazarr-wanted) was real and working, the demo fallback was manufacturing the confusion.
  • Library search results drill down on click (#187). Children of a matched show were being re-filtered into nothing.
  • Coverage title/path search is a real input that filters the table (#188). It was a static placeholder.
  • Dead SONARR_PATH_PREFIX / RADARR_PATH_PREFIX config removed (#133); per-library prefixes supersede them.

Transparency note

A server-side validation bug on our telemetry endpoint had been rejecting pings fleet-wide since 2026-06-08 (a numeric docker_tier against a string-only validator). Fixed server-side, no client action needed; install stats were undercounted for about 3 days. A fair preview of why this release ships crash telemetry: silent failures are the enemy, including ours.


Upgrade: docker compose pull && docker compose up -d. No migration, no config changes.
Full changelog: CHANGELOG.md
Next epic (design locked): multiple Sonarr/Radarr/Bazarr instances, see #161.

v1.3.0 — queue authority + security hardening

07 Jun 20:00

Choose a tag to compare

subarr v1.3.0 — the queue you control, plus a security-hardening pass. Recommended upgrade for everyone (includes security fixes).

Queue authority (#66) + throttled backfill (#116)

subarr now holds its own pending queue in front of subgen and feeds it at a set depth instead of flooding it. New Pending panel on the Queue page: promote / demote / reorder + pause/resume + target-depth. Backfill gaps drains your whole verified-gap backlog gently in the background — steady catch-up, no GPU stampede. subgen's queue is treated as shared, so subarr never steps on jobs other tools queued.

Smarter coverage

  • Settle-window (#117) — optionally let Bazarr/providers land a real sub before subarr transcribes a freshly-imported file (opt-in; manual transcribe always bypasses).
  • Mis-grouped-series detector (#140) — catches a Sonarr series that's secretly two different shows (e.g. Korean + Russian episodes) via per-episode spoken-language divergence, with a per-series dismiss.

Reliability + fixes

  • Health page (#157) — background loops are supervised; a silent failure now shows up red with its traceback instead of freezing quietly.
  • Update checker (#158) — now reads the GitHub releases Atom feed, fixing the 403 rate limit exceeded that stopped update checks for users behind NAT/CGNAT.
  • GPU is now optional + uses the portable runtime: nvidia form (#162) — subarr never transcodes (subgen does); it only ran nvidia-smi for the Monitor sparkline. No more forced Swarm-style GPU block on GPU-less hosts.
  • settle_minutes + queue controls now persist on save; the Bazarr-badge probe no longer logs a stray traceback on a transient blip.

Security

A full adversarial audit — the code itself came back clean (no injection, path-traversal, XSS, or SSRF bypass; restrictive CSP; parameterized SQL; anonymous telemetry). Hardened the edges:

  • *Onboarding state no longer returns arr/Plex API keys in cleartext (masked, with a merge-guard so a resuming wizard can't clobber a stored key).
  • Supervised-task tracebacks redact credential query-string params (Tautulli ?apikey=, Plex ?X-Plex-Token=).
  • /api/health trimmed to {status, version} — no config leak; auth-disabled now warns loudly.
  • The example compose uses a read-only Docker socket-proxy by default (no raw /var/run/docker.sock) — removes the host-RCE blast radius if subarr is ever exposed/compromised. Trade-off: in-app subgen auto-restart is disabled under this default; mount the raw socket if you want it back.

Image

ghcr.io/coaxk/subarr:1.3.0 (also :1.3, :1, :latest)

Full details in CHANGELOG.md.

subarr 1.2.1 — hotfix (coverage refresh freeze on foreign libraries)

06 Jun 19:24

Choose a tag to compare

subarr v1.2.1 — hotfix

Fixes a v1.2.0 regression that could silently freeze coverage refresh on foreign-language libraries. The Bazarr-blind defense pass referenced an out-of-scope variable, so any coverage walk that produced a Bazarr-blind synthetic row crashed in the background — coverage stopped updating and resolved gaps never cleared. English-only libraries were unaffected.

Fixed; coverage walks complete and resolved files drop out as expected. Recommended upgrade for anyone with foreign-language content.

Image: ghcr.io/coaxk/subarr:1.2.1 (also :1.2, :1, :latest).

subarr 1.2.0 — the Tuning Lab and verified audio

06 Jun 16:03

Choose a tag to compare

subarr v1.2.0 — the Tuning Lab and verified audio

subarr stands beside Bazarr, never instead of it. Bazarr finds and downloads, subgen transcribes, subarr coordinates and now verifies.

Highlights

  • Tuning Lab. Pick a file, choose recipes to compare, and subarr runs each against your live subgen and lets a validated tournament judge rank them across several short clips (a recipe has to win across clips, not on a lucky one). A per-language herd view surfaces a dependable default for each language. Nothing is written to your library.
  • Audio-language verification. subarr listens with robust multi-chunk Whisper detection and tells three real situations apart: a mislabeled track (tagged one language, spoken another) with a one-click fix that flows back into coverage, a genuinely bilingual file flagged as mixed instead of collapsed, and "Whisper unsure" that keeps the existing tag. Multi-track files are handled per track. Everything it flags lands in one Audio language issues panel.
  • Library-wide audio scan. The same listening pass over your whole library, not just files you swept. Opt-in, throttled, GPU-polite, resumable.
  • Global recipe leaderboard. Per-language herds rolled into one overall ranking (mean of per-language means, so each language counts equally), with medals and a confidence signal.
  • Edit integrations in-app. Change Bazarr, Sonarr, Radarr, Tautulli URLs and API keys plus the Plex token from Settings, with test-connection and live apply. No env edit, no restart.
  • Performance and best-practices pass. gzip, a Content-Security-Policy and hardening headers, smarter static caching, and a real favicon route.

Also in this release

  • Push-based subgen completion (webhook) with polling as the fallback.
  • Series-level audio-language intent inherits to new episodes.
  • Age-based retention for tuning-lab sweeps (SUBARR_ARENA_RETENTION_DAYS, default 30).
  • ISO language-code normalization fixes (a present .ger/.deu/.eng sidecar now satisfies the matching wanted language instead of raising a phantom gap), and Icelandic added to the audio-language picker.

Full changelog: CHANGELOG.md

Image: ghcr.io/coaxk/subarr:1.2.0 (also :1.2, :1, :latest).

subarr 1.1.0 — speech-aware audio

04 Jun 06:50
9558ff4

Choose a tag to compare

🎙 subarr 1.1 — speech-aware audio

The headline: when you check a file's audio language by ear, subarr now lands the review clip on actual dialogue — instead of the old fixed 5-second window that hit silence or intro music most of the time. silero voice-activity detection picks a ~12s speech window, with a "🎙 speech-detected" badge. Opt-in (a "Speech detection" onboarding step + a Settings → System card; pulls a ~2 MB model). When it's off or undownloaded it falls back cleanly to the previous behaviour — nothing changes unless you enable it.

Added

  • Speech-aware audio (silero VAD) — review clips land on dialogue, not dead air. (#110, #111)
  • Config persistence — UI settings survive a container restart (env vars still authoritative). (#112)
  • Deterministic subtitle readability linter (CPS/CPL/timing). (#92, #108)
  • Whisper-tuning tournament — judging engine + reference-free quality judges (hallucination / looping / canned-phrase / coverage / cross-config consensus) + a Tier-B validation harness. Internal foundation this release, validated against professional-reference accuracy; the tuning lab surfaces as a user feature in v1.2. See docs/research/tournament-validation.md. (#65, #120, #121, #122)
  • Throttled library-backfill selection core (opt-in foundation). (#116)

Changed

  • Audio-review clips are now ~12s (was 5s) — long enough to reliably hear dialogue.

Upgrade

docker compose pull && docker compose up -d   # track :1.1 or :stable

New image dependency: the speech-detection runtime (onnxruntime + numpy, ~65 MB, no PyTorch) is baked in but inert until you opt in.

Full changelog: https://github.com/coaxk/subarr/blob/v1.1.0/CHANGELOG.md

subarr v1.0.2

03 Jun 08:41
eb31bf4

Choose a tag to compare

Patch release — bug fixes + dashboard polish.

Fixed

  • Coverage refresh no longer freezes the UI on larger libraries — a quadratic loop in the bazarr-blind pass was blocking the event loop for 15–20s mid-refresh (#93).
  • Multi-episode .iso disc images are flagged unsupported instead of sitting stuck in "Analyzing" forever (you can't probe a disc image per-episode) (#96, #62).

Changed

  • Dashboard polish (#97#100): transcribing card shows live per-job progress; top panels reordered (transcribing · bazarr-wanted · discovered · written-back · probing); GPU widget gains a utilisation graph + VRAM bar; recent activity tightened.

Added

  • Header "update available" pill + live running-version label (#78).
  • Architecture diagram + "how it runs" in the README (#91); full subgen surface-audit reference doc (#85).

Full detail in CHANGELOG.md.

subarr v1.0.1

02 Jun 12:41
b9f1dad

Choose a tag to compare

Point release — Plex is now a first-class integration.

  • Plex shows on the dashboard + Settings integration health with live version + status (it was previously a silent env-only dependency). Configure with PLEX_URL / PLEX_TOKEN (+ optional PLEX_SECTION) to enable instant library refresh when a sub lands + the opt-in per-show audio read (PLEX_AUDIO_HINTS=1). Details: #74.
  • Full first-class onboarding + a media-server abstraction (Jellyfin/Emby backend) are tracked for v1.1 (#71, #72).

:latest already carried this; v1.0.1 gives pinned users the fix.

ghcr.io/coaxk/subarr:1.0.1   # or :latest

subarr v1.0.0

02 Jun 11:23
c148e29

Choose a tag to compare

*The coordination layer for the arr subtitle stack. Stands beside Bazarr.

subarr decides what subtitles are actually missing across your library, which providers are worth your time, and when it's worth running Whisper. Bazarr finds and downloads. Subgen transcribes. subarr coordinates.

Highlights

  • Coverage with a probe-gate — a row only becomes an actionable gap once subarr has probed the file, so it never queues something that already has an embedded sub subgen would skip. Un-probed files wait in a visible "Analyzing" bucket; failures surface in "Couldn't analyze". Nothing silently dropped or falsely surfaced.
  • Calibrated audio-language detection — three Whisper chunks across the file, conservative majority voting, confidence-gated. Kills the "anime OP / foreign cold-open transcribed in the wrong language" failure mode. Optional per-show audio read straight from Plex.
  • A real frontend for subgen — Queue with live transcription progress, per-row and bulk requeue / remove / cancel, lost-on-restart recovery, and silent-fail surfacing.
  • Provenance ledger — which provider gave you which sub, when, why. Survives re-search runs.
  • Scheduled walks with backpressure + Tautulli playback signal into priority. Don't burn GPU on content nobody watches.
  • Embedded subs are first-class — SDH / forced / PGS / full, all distinguished.

Install

services:
  subarr:
    image: ghcr.io/coaxk/subarr:1.0.0   # or :latest
    container_name: subarr
    restart: unless-stopped
    ports: ["9922:9922"]
    environment: [PUID=1000, PGID=1000, TZ=Etc/UTC, UMASK=022]
    volumes:
      - ./subarr/config:/config
      - /path/to/media:/media/library:rw   # same path Bazarr and subgen see

Open http://localhost:9922 — the onboarding wizard auto-detects Sonarr/Radarr/Bazarr/Tautulli/subgen. Full docs + screenshots in the README.

Already run subgen?

Keep vanilla mccloud/subgen (compat mode) or swap to ghcr.io/coaxk/subarr-subgen for calibrated multi-chunk detection + queue cancel. subarr re-probes subgen every 30s and adopts new capabilities automatically.


Built with AI assistance from Claude. Code is open, every PR is human-reviewed. 336 tests, security-scanned (Bandit · Semgrep · pip-audit · Trivy). MIT.

What's Changed

  • v1.0 launch: README rewrite + pre-launch fixes + repo health by @coaxk in #7
  • #232 PRE-LAUNCH: vision pre-filter capability detection + graceful degrade by @coaxk in #8
  • v1.0 launch polish batch: #9 #10 #11 + vision frontend follow-up by @coaxk in #14
  • settings: friendly badge labels + bundle deploy/verify scripts by @coaxk in #15
  • launch-prep: README restructure (259 lines), tone-gate CI, 3 issue templates by @coaxk in #17
  • README: stats.subarr.com is live + expanded Pi-hole note by @coaxk in #18
  • README: Two ways to use subarr + de-anime'd Common questions by @coaxk in #19
  • Queue page: stop Processing/Queued rows from clipping + disambiguate skip reason by @coaxk in #22
  • dashboard: next-run buttons no longer escape card when activity is tall by @coaxk in #16
  • chrome: add Star on GitHub link to TopBar by @coaxk in #20
  • docs: add hero GIF to README by @coaxk in #26
  • chore: set version to 1.0.0 for launch by @coaxk in #24
  • perf: self-host React production build instead of CDN dev build by @coaxk in #25
  • fix(dashboard): stop Next-scheduled-run card overflowing its border by @coaxk in #23
  • feat(onboarding): apply integration config live, no restart by @coaxk in #27
  • fix(dashboard): remove fabricated GPU sparkline + fake current-file by @coaxk in #28
  • fix(security): SSRF allowlist on /api/vision/check + path guard on /api/queue/cancel by @coaxk in #29
  • chore: remove dead code + fix inaccurate DashboardCache docstring by @coaxk in #30
  • docs: add MIT LICENSE file by @coaxk in #31
  • feat(arbiter): implement movie candidate accept (was 501) by @coaxk in #32
  • fix(onboarding): env-set config is authoritative, not clobbered on complete by @coaxk in #33
  • feat(telemetry): real walks_per_day_30d + error_counts_30d by @coaxk in #34
  • fix(queue): stop in-flight queued files showing in both live + Recently-done by @coaxk in #35
  • fix(subgen): stop false "lost on restart" on connectivity blips by @coaxk in #36
  • feat(probe): persist probe failures (probe-gate foundation) by @coaxk in #37
  • feat(coverage): tag rows verification_state (verified/unprobed/probe_failed) by @coaxk in #38
  • feat(coverage): probe-gate enforcement — gate auto-queue + sticky buckets by @coaxk in #39
  • feat(coverage): probe-gate buckets in the UI (Analyzing / Couldn't analyze) by @coaxk in #40
  • fix(coverage): let the page scroll so gap + analyzing boxes get room by @coaxk in #41
  • feat(queue): bulk-select + bulk requeue/remove across history sections by @coaxk in #42
  • fix(static): revalidate bundles (no-cache) so UI updates reach users by @coaxk in #43
  • fix(coverage): .main-canvas overflow-y:auto so the page scrolls by @coaxk in #44
  • feat(coverage): eager-probe unprobed wanted files (finish the probe-gate) by @coaxk in #45
  • feat(migrate): migration 008 — full parity with init_schema (step 1 of removal) by @coaxk in #46
  • feat(coverage): Analyzing bucket above the table + Probe-now button by @coaxk in #47
  • refactor(schema): remove init_schema — migrations are the single source of truth by @coaxk in #48
  • feat(coverage): #12 Plex-direct per-show audio language (funnel L2.6, opt-in) by @coaxk in #49
  • fix(coverage): propagate Sonarr episode-file path so wanted rows aren't dead folder paths by @coaxk in #50
  • perf(chrome): single shared poller for SubRail/TopBar counts (#5/#6) by @coaxk in #51
  • perf(coverage): React.memo CoverageRow with stable onClick (#7) by @coaxk in #52
  • fix(schedule): preview reads warm coverage cache (68s → sub-second) + E2E green by @coaxk in #53
  • docs(readme): product screenshots gallery + sync README to v1.0 features by @coaxk in #54
  • fix(frontend): regenerate stale review bundle + pin bundles to LF (unblock CI) by @coaxk in #55
  • fix(ci): scope check:frontend to shipped artifacts (unblock build-and-publish) by @coaxk in #56
  • docs(readme): queue screenshot with live transcription gradient bar by @coaxk in #57
  • fix(queue): cancel passes the subgen path verbatim (was silently failing) by @coaxk in #58

Full Changelog: v1.1.0...v1.0.0

v1.0.0-rc.1 — release candidate

28 May 22:32
da4ab4a

Choose a tag to compare

Pre-release

v1.0.0-rc.1 — release candidate

First public release candidate of subarr. Install on your homelab next to Bazarr/Sonarr/Radarr/Tautulli, point it at a subgen Whisper worker, and let it coordinate which files actually need transcription instead of grinding through your whole library blindly.

What subarr does

Subarr sits between your *arr stack and subgen. It scores every file by how likely you are to want subtitles for it (Tautulli watch history × language coverage × Sonarr/Radarr metadata), queues the high-value targets, and writes results back to Bazarr — so subgen only does the work that pays off.

Highlights

  • 10-step onboarding wizard with auto-detection and capability probing
  • Compat mode for vanilla mccloud/subgen (no patch-stack required for basic use)
  • Coverage dashboard with stale-disk detection and per-language gap scoring
  • Provenance ledger tracking every subtitle's source + write-back history
  • Three deployment tiers (Tier 1 = subarr-only, Tier 2 = docker discovery, Tier 3 = auto API-key extract)
  • Schema migrations + backup/restore baked in
  • Update notifier + opt-in anonymous telemetry (see SECURITY.md for what's collected)

Install (Tier 1, ~2 minutes)

curl -fsSL https://github.com/coaxk/subarr/raw/main/install.sh | bash

Or pull the image directly: ghcr.io/coaxk/subarr:v1.0.0-rc.1

Full deployment matrix in README.md.

Known limitations in rc.1

  • Subgen v4.3 queue control patch is deferred to v1.0.x (graceful fallback in place — full features available via the subarr-subgen patch-stack)
  • Subarr.com is currently a 301 to this repo; a real landing site lands when there's something marketing-worthy to put on it
  • Telemetry stats dashboard at subarr.com/stats is wired backend-side but the public page isn't shipped yet — coming in v1.0.x

Companion releases

  • subarr-subgen — the patch-stack for mccloud/subgen that unlocks full features (per-language kwargs, deduplicated queue, language-probability logging). 8 patches against base 2026.05.3.

Reporting issues

Open a GitHub issue. For security findings, see SECURITY.md.

Acknowledgments

Built on top of: