Changelog¶
All notable changes to this project are documented here. The format follows Keep a Changelog, and commit messages follow Conventional Commits.
[0.22.7] - 2026-09-04¶
✨ Features¶
- Reorganize stat cards into a clearer, more polished layout (#123)
🐛 Bug Fixes¶
- Lower bulk queue worker cap to 2, raise flat queues off 1 (#122)
[0.22.6] - 2026-09-03¶
✨ Features¶
- Fix dead bulk queue worker defaults, cap concurrency at 4 (#120)
- Sync a subtitle's timing against another subtitle instead of audio (ROADMAP 0.23.0) (#121)
🔧 Miscellaneous¶
- Bump version to v0.22.6 [skip ci]
[0.22.5] - 2026-09-02¶
✨ Features¶
- Search providers in parallel and pick the best match across all of them (#114)
- Add a Providers status page under System (#115)
- Split subtitle upgrade into its own daily job (#116)
- Prioritize upgrade searches by current subtitle score (#117)
- Skip subtitle acquisition when the target language is already embedded (#118)
- Scale bulk job queues with host CPU count, capped per-provider concurrency (#119)
🔧 Miscellaneous¶
- Bump version to v0.22.5 [skip ci]
[0.22.4] - 2026-09-02¶
✨ Features¶
- Add a manual extract action for skipped embedded subtitle tracks (#111)
- Add auto_translate flag to language profiles to gate automatic translation (#113)
🐛 Bug Fixes¶
- Order live tasks by execution order and cap the dashboard widget to 10 (#112)
🔧 Miscellaneous¶
- Record external-subtitle language-guess gotcha
- Record auto_translate flag and open backoff gap
- Bump version to v0.22.4 [skip ci]
[0.22.3] - 2026-08-31¶
✨ Features¶
- Sync Docker Hub repository overview on release (#103)
- Throttle periodic subtitle discovery, acquisition, and translation fan-outs (#107)
- Make each executor queue's worker count configurable (#108)
- Show media titles instead of raw job ids on the Tasks page (#109)
🐛 Bug Fixes¶
- Route uvicorn's startup and access logs through configure_logging (#104)
- Subtitle-pill dropdown fixes (#105)
- Live activity queued-task display and unbounded OCR track duration (#106)
- Don't let Docker Hub description sync block the release
- Stop mistaking a release-tag fragment for a subtitle's language (#110)
🔧 Miscellaneous¶
- Note the real legendarr instance runs on a separate host
- Bump version to v0.22.3 [skip ci]
[0.22.2] - 2026-08-31¶
📚 Documentation¶
- Add codecov badge and Installation section to README
- Inline the full Docker Compose example in the README
- Add full-HD feature screenshots (#102)
🔧 Miscellaneous¶
- Grant actions:write so the release workflow can trigger the docs redeploy
- Bump version to v0.22.2 [skip ci]
[0.22.1] - 2026-08-30¶
✨ Features¶
- Bootstrap legendarr monorepo with Screaming/VSA architecture
- Add Alembic migrations and persisted config.yaml for database location (#1)
- Add bootstrap module, split backend API from web (#2)
- Redesign web UI with sidebar nav shell, dashboard stats, and htmx polling (#5)
- Share HTTP client conventions across Radarr/Sonarr
- Back Radarr/Sonarr connection and sync settings by config.yaml (#6)
- Formalize APScheduler job registration conventions (#8)
- Formalize shared test fixtures and wire up logging (#9)
- Register, edit, and delete Radarr/Sonarr connections (#10)
- Encrypt API keys at rest instead of storing plaintext (#11)
- Persist synced media and per-connection path mapping (#12)
- Complete LanguageProfile CRUD in backend and web UI (#13)
- Add toast notifications for settings save and connection-test feedback (#14)
- Register subtitle providers with per-provider connection tests (#15)
- Proxy registration for CAPTCHA/Cloudflare bypass (#16)
- Register translation providers with per-provider connection tests (#17)
- Scan video files on disk via jobs, webhooks and history poll (#18)
- Tasks page with runtime-rescheduled job settings (#19)
- Add SubtitleProvider protocol (#20)
- Scan and persist subtitles, list media missing one (#21)
- Translate subtitles for a media file via real providers (#22) (#22)
- Manual library sync trigger (#23)
- Fetch TheTVDB/IMDb metadata on library sync (#24)
- Capture arr metadata and list movies/series in the UI (#25)
- Add movie/series detail pages with translate and scan actions (#26)
- Add library-wide wanted subtitles view (#27)
- Default translation provider, editable from web UI (#28)
- Add in-app directory browser and log viewer (#29)
- Add embedded subtitle track discovery and extraction (#31)
- Embedded-track source fallback (#33)
- Wire up OpenSubtitles search and download (#34)
- Wire up Addic7ed search and download (#35)
- Wire up YIFY Subtitles search and download (#36)
- Wire up Subdl search and download (#37)
- Wire up TVsubtitles search and download (#38)
- Wire up legendas.net search and download (#39)
- Wire up Napiprojekt search and download (#40)
- Wire up Subsource search and download (#41)
- Wire up Anime Tosho search and download (#42)
- Wire up Supersubtitles search and download (#43)
- Wire up AnimeKalesi search and download (#44)
- Wire up GreekSubtitles and BetaSeries search and download (#45)
- Manual per-subtitle timing sync (ROADMAP 0.7.0) (#46)
- Add LLM provider and batch translation requests (ROADMAP 0.8.0) (#47)
- Add pluggable translation provider plugins and custom LLM prompt templates (ROADMAP 0.9.0) (#48)
- Schedule translation and acquisition fan-out jobs (ROADMAP 0.10.0) (#49)
- Cascade Arr webhook imports through discovery, acquisition, and translation (ROADMAP 0.10.0) (#50)
- Manual search, candidate download, and subtitle upload (ROADMAP 0.11.0) (#51)
- Manual translation source pick (ROADMAP 0.11.0) (#52)
- Unify acquisition fallback into periodic translation runs (ROADMAP 0.12.0) (#53)
- Per-attribute score weighting and release-name filters (ROADMAP 0.12.0) (#54)
- Upgrade/replace and blacklist a bad subtitle (ROADMAP 0.12.0) (#55)
- Structured audit trail for acquisition attempts (#56)
- Reject broken subtitles and clean text before translation (ROADMAP 0.13.0) (#57)
- OCR pipeline for PGS embedded subtitle tracks (ROADMAP 0.14.0) (#58) (#58)
- Color subtitle pills by acquisition status (ROADMAP) (#59)
- Speech-to-text fallback via local Whisper (ROADMAP 0.15.0) (#61)
- Session-based login and API key access control (ROADMAP 0.16.0) (#62)
- Document and tag the backend REST API (ROADMAP 0.17.0) (#63)
- Notify Plex/Jellyfin after a subtitle is written (ROADMAP 0.18.0) (#64)
- I18n scaffolding + Settings General locale switcher (#65)
- Dashboard redesign, topbar search/notifications, and UI polish pass (ROADMAP 0.19.0) (#66)
- Authenticate OpenSubtitles with username/password login (#67)
- Make Anime Tosho's AniDB API Key optional (#68)
- TMDb provider, scheduler job history, and settings-page consolidation (#69)
- Local poster cache + periodic refresh/cleanup jobs (#70)
- Translation and acquisition activity view (ROADMAP 0.20.0) (#71)
- History view with translation/acquisition error status (ROADMAP 0.20.0) (#72)
- Render as a table, add the acquisition match score column (#73)
- Push live translation/acquisition progress to the dashboard (ROADMAP 0.20.0) (#74)
- Back off a failing translation/acquisition provider with a circuit breaker (ROADMAP 0.21.0) (#75)
- Reschedule a one-off job that exhausted its in-process retries (ROADMAP 0.21.0) (#76)
- Sweep orphaned temp files left behind by extraction/OCR/transcription/timing-sync (ROADMAP 0.22.0) (#78)
- Export config.yaml + Fernet key to an archive, restore from one (ROADMAP 0.22.0) (#79)
- Add per-subtitle Search and Remove style tags actions (ROADMAP 0.23.0) (#80)
- Search and upload subtitles for episodes Sonarr hasn't downloaded yet (#81)
- Configurable match score per media type (#83)
- Score candidates by content hash and hearing-impaired preference, gate on episode identity (#84)
- Add a timezone setting and localize interface timestamps (#85)
- Score embedded subtitle tracks against the language profile's forced/HI preference (#87)
- Skip extracting embedded subtitle tracks outside the language profile's source languages (#88)
- Confirm navigation away from a form with unsaved changes (#89)
- Stagger periodic jobs with a default jitter (#92)
- Search subtitles action + richer detail-page header (#94)
- Mark score improvements as an upgrade category (#95)
- Apply legendarr branding, real favicon, and simplify README/docs (#96)
- Wire up Dockerfile version labels, workspace versioning, and a release workflow (#100)
- Build+smoke-test+publish the Docker image and generate release notes (#101)
🐛 Bug Fixes¶
- Wire up pyright and resolve type errors across backend and web (#32)
- Register legendarr's real OpenSubtitles API consumer key
- Include the response body in provider request-failure errors
- Explain Anime Tosho's API Key is an AniDB client name
- Align sidebar submenu toggle padding with nav links
- Show the profile's target language as a gray pill for episodes with no file yet
- Only open the per-file subtitles dialog from the title or embedded pill
- Style the subtitle-dialog title trigger as a plain link
- Match the title trigger's font size to the rest of the row
- Restore the per-subtitle quick actions menu on external pills
- Add a manual-search button to the Actions column
- Search the profiles target languages instead of picking one manually
- Hide unwanted horizontal scrollbar in subtitle search results list
- Keep target-language casing so a pending subtitle's pill actually shows (#82)
- Simplify running-tasks badge to a solid count circle (#93)
- Use white screen artwork for the topbar brand mark
- Use the white-screen mark in the README header too
- Fix topbar brand link vertical alignment
- Shrink poster grid card width to 8-10rem
- Shrink poster grid card width to 7-8.75rem
- Trim top gap above media-detail toolbar by half
- Standardize toolbar top spacing across list and detail pages
- Align media-detail backdrop with the page padding
- Restore divider line above the media-detail backdrop
- Widen the gap between the toolbar divider and the backdrop
- Skip a target language matching the source's own language (#98)
📚 Documentation¶
- Add MkDocs documentation site
- Rewrite roadmap into dependency-ordered versions and move to ROADMAP.md
- Convert roadmap items to checkboxes (#4)
- Add Clean Code/SOLID rule, slim down AGENTS.md, track rules/skills in git
- Allow fix commits to push straight to main
- Reorder roadmap so Radarr/Sonarr + language profile setup precedes the library scan
- Record form-control specificity and multiselect height gotchas
- Pull minimal subtitle-provider acquisition into 0.3.0
- Order acquisition before discovery in 0.3.0
- Name the 8-provider target pool for subtitle acquisition
- Split 0.3.0 translation items into interface vs real implementation
- Move remaining subtitle providers into 0.6.0
- Log PR #46 and #47 roadmap-basis history (0.7.0 timing sync, 0.8.0 LLM/batching)
- Discard 0.10.0 opt-out bullet, add manual translation-source pick to 0.11.0
- Backlog periodic metadata refresh + local poster caching
- Note default cadence for the periodic metadata refresh backlog item
- Record Anime Tosho AniDB-key research and the main-revert convention note
- Record dialog centering, ffmpeg temp-suffix, and Playwright dialog-handler gotchas
- Reconcile ROADMAP 0.20.0 checkboxes with what actually shipped
- Record the per-subtitle Search/Remove-style-tags dropdown addition
- Note the scratch fix-branch and main-divergence recovery pattern
♻️ Refactor¶
- Share a MediaLibraryClient protocol between Radarr/Sonarr
- Organize shared_kernel into subject subfolders
- Reorganize slices by business domain (#7)
- Rename modules/ workspace directory to src/ (#30)
- Align backend/web with SOLID + Screaming Architecture + VSA (#77)
⏪ Reverts¶
- Move periodic-metadata-refresh backlog note to feat/tmdb-metadata-provider
🔧 Miscellaneous¶
- Translate UI and README to English, drop tool name comparison
- Build and test only, drop image publish
- Update team memory for bootstrap module split (#3)
- Update team memory with PR #12 media-library sync notes
- Update team memory with SQLite FK migration and plan-branch-task learnings
- Add docker-compose stack for testing against real Sonarr
- Note modules/ to src/ rename in team architecture memory
- Require pyright type-checking alongside lint/test
- Note 0.6.0 embedded-track source fallback completion
- Add search-strategy navigation rule
- Add legendarr i18n conventions team memory
- Capture QA and retrospective notes in team memory
- Add commit-message conventions, refresh search-strategy stats
- Refresh search-strategy stats
- Enforce conventional-commit format on PR titles (#91)
- Record .app-brand-mark shared-class gotcha
- Record reflex-PR clarification, playwright resize recurrence, and brand-asset check (#97)
- Disable Plex/Jellyfin by default in the dev compose stack (#99)
- Bump version to v0.22.1 [skip ci]