Image: ghcr.io/kkodecs/livrarr:0.1.0-alpha6
Digest: sha256:2617690cdc825dd3989da155be00e923d903afb7713a28c2c62f1fecf2271a17 (linux/amd64 + linux/arm64)
Back up before upgrading. Alpha6 migrates the database on first start. To roll back to alpha5 you must restore your pre-upgrade copy of
livrarr.db— an alpha5 binary cannot run against an alpha6 database. Copy yourlivrarr.db(in the config volume) before pulling this tag.
🚀 Features
- (work-creation-consistency) Identity federation + Layers 0-2 + Stage-5 review fixes
- (work-creation-consistency) Stage-5 green — resolver fan-out wired + Readarr seam + PO-testing fixes
- (metadata-modularization) Extract livrarr-external-data crate (canary GO)
- (metadata-modularization) Extract livrarr-identity crate (Track-1 move)
- (metadata-modularization) 4b step 1 — identity_status foundation (domain + DB)
- (metadata-modularization) 4b step 2 — RED behavioral tests for the status two-state split
- (metadata-modularization) 4b step 3 — text-only enrichment classifier (REQ-019)
- (metadata-modularization) 4b step 4 — derive/persist + gate the identity badge (REQ-014/015/016)
- (metadata-modularization) 4b step 5 — surface identity_status through the API (plumbing)
- (metadata-modularization) 4b step 6 — Book Information UI (two-state badges)
- (metadata-modularization) WCC chunk D — run_quorum anchored-cluster winner rule (REQ-018/020)
- (metadata-modularization) WCC chunk A — discovery fan-out adds Goodreads (autocomplete) + interleave
- (metadata-modularization) WCC chunk B — cached-payload reuse + trust-the-pick (instant add)
- (metadata-modularization) WCC chunk C — Tier-A manual-import auto-match (#97)
- (metadata-refactor) S4 — enrich_work one-road core (reuse + zero-LLM + resolve_status)
- (metadata-refactor) S7 — run_unified materialize + door-cutover + fork deletion
- (metadata-refactor) Add-from-search door onto the one road (Option A)
- (metadata-refactor) S6 — delete background retry job; user-triggered "Retry Incomplete" (REQ-001/REQ-011)
- (architecture) Author the canonical model — entity spine, seams, data flow
- (search) Add directly from results — drop the pre-add cover picker
- (sprint-b) Metadata correctness — anchor-grounded enrichment, dissents, identity completion
- (sprint-c) Series reconcile — full catalog, stubs, rosters, promotion
- (sprint-d) Seeds & doors — single SeedBuilder, per-door language, junk screen, F8 cleanup
- (sprint-e) Gate per-refresh identity re-chase for confirmed works
- (identity) Unified-identity-path engine + code-review fixes (R-001/R-002/R-003)
- (identity) Id-completeness — settle/converge wiring, background convergence job, affirm API + UI
- (perf) Diagnostics layer, GR identity fix, single cover decode
- (metadata) Phase 3 — outbound rate-limit queue engine (packet 1)
- (metadata) Phase 3 B0 — Goodreads anti-ban (1.5s pacing, drop ISBN /search tier)
- (metadata) Phase 3 B2 — circuit breaker at the outbound queue
- (metadata) Phase 3 B3 — cover pacing + cover paths onto the queue
- (metadata) Phase 3 B4 — request priorities wired end to end
- (config) Phase 5 H — per-install default language for new books
- (domain) Phase 5 A — identity matching authority (inert) + trap corpus
- (test) Phase 5 C — old-vs-new matching decision-diff harness
- (work) Phase 5 I — merge-two-works action with preview
- (identity) Phase 5 D — identity engine rewired onto matching authority
- (matching) Phase 5 F — recognition matcher fixes
- (metadata) Phase 5 G — GR unlock, HC Tier-2 LLM pick deleted, dead scaffolding removed
- (matching) Phase 5 E — one stored identity key, authority-routed adopt and dedup, key recompute
- (ui) Phase 5 J2 — identity review surface, conflicts wiring, RSS language-skip notifications
- (covers) Consolidate the cover pipeline — one rank, crash-safe write gate, honest provenance, single layout
- (convergence) Enable background convergence by default
- (import) Consolidate manual/Readarr/scan imports onto one core
- (convergence) Spawn an immediate attempt when a batch door creates a work
- (hardcover) Fetch-by-hc_key enrichment path (#145)
- (docker) Configurable PUID/PGID + Unraid & Proxmox support (#158, #105, #106)
- Responsiveness (fast add, provider cache, versioned covers) + author-dedup (adoption gate, merge)
🐛 Bug Fixes
- (ui) Narrow the possible-match link lookup for the strict tsc gate
- (goodreads) Discover books via the WAF-free autocomplete endpoint
- (discovery) Book search fans out across all providers (#97)
- (metadata-refactor) S4 review — candidate-reuse falls back to network on any DB error
- Keep qBit add-failure body check alongside 2xx acceptance
- Dispatch resolved magnet to download client instead of original URL
- (manual-import) Never fuse loose m4bs into a same-directory group
- (identity) Different work-keys veto a fuzzy-title merge (C1)
- (identity) Respect user picks in conflict detection; make resolve/dismiss take effect
- (enrichment) Readarr import metadata now reaches the merge (M-010)
- (identity) Affirming an anchor sets the badge synchronously (M-020)
- (identity) Remediate Phase 0 cross-family review findings
- (identity) Close round-2 review items — TOCTOU guard, typed error, gap-fill dedup
- (metadata) Phase 4 A-C — delete dead pacing_queue; empty-list guard + GR cover gate at the merge chokepoint
- (db) Phase 4 D — merge_generation predicate on the apply_enrichment_merge UPDATEs
- (metadata) Phase 4 E-F — honest ConvergeOutcome + error backoff; bulk refresh rides the queue at Low
- (goodreads) One malformed autocomplete entry no longer erases the whole hit list
- (goodreads) Payload title prefers GR's own bare form over search-card decoration
- (materialize) First cover acquisition works on every door
- (materialize) A changed cover pick replaces the stale file from the prior URL
- (goodreads) Autocomplete queries title only — the appended author poisoned ranking
- (goodreads) Series-page parser rewritten for the 2026-07 React layout
- (goodreads) Picker routes title decisions through the matching authority
- Scrub leaked PII from tracked files, add a pre-commit PII check
- (matching) Gate RSS auto-grab on the existing no-author hard gate (#162)
- Trivial batch — poster series line (#109), drop dead enrichment_retry_count (#137)
- (works) Refresh-All honors the active filters + surfaces the real error (#135)
- (bibliography) Guard LLM title cleanup against garbled rewrites (#53)
- (enrichment) Guard all non-audio merge fields against wrong-language editions (#133)
- Audiobook cover upload button (#139) + normalize locale tags before language gate (#96)
- (hooks) Use absolute path for pii-check PreToolUse hook
- (rss) Cap RSS auto-grab retries so a failing import stops re-downloading
- (import) Advance Readarr import progress per-item, not after the phase
- (metadata) Stop foreign-language editions leaking onto author pages (#112)
- (logging) Redact secrets from URLs in logs (#76)
- (rss) Score-gate before language check so skip count reflects real matches
- Quality wave 2 — six behavior fixes, red-pinned first (probe #2,#3,#9p1,#23,#33-#35,#36-adjacent)
- Quality wave 2a — one shared qBit state classifier (probe #1, D1 ratified table)
- Quality wave 2d + #36 — swallowed-writes sweep (D2) + one-tx work+anchor creation
- Indexer citizenship — origin-keyed pacing, 429 cooldown, live search cache
- Identity-fix unit — settle-road title trust, try-again wiring, honest tooltip
- Matching-conformance — one shared authority picker, kill the loose 0.75 scorers
- Openlibrary edition picker — prefer title+language match over first-ISBN
- Series list — dedup partially-linked series + unify promote UI
- Import completeness — count all on-disk files, not just recognized media
- SABnzbd path mapping — strip trailing slashes before joining
- Openlibrary search — log a dropped tier-3 result instead of failing silently
- (covers) Failed add-time downloads no longer create permanent user-locks
- (goodreads) ISBN-first search tier + detail parser for the Next.js page shape
- (ui) Series monitor keys, non-linear EPUB covers, notification toast dismissal
- (identity) Make the possible-matches surface trustworthy
💼 Other
- (metadata-modularization) Phase 1 artifacts — spec + IR v1/v2 (C′ structured extraction)
- Merge feat/metadata-modularization into wcc-stage5-green
Lands the metadata-pipeline modularization + the full WCC re-integration:
- 3-crate extraction (livrarr-external-data / -identity / -enrichment) on a
shared substrate, one-way identity->enrichment boundary. - WCC chunks D (run_quorum winner rule) / A (4-way Add-Work discovery + Goodreads
autocomplete) / B (cached-payload reuse + trust-the-pick) / C (Tier-A
manual-import auto-match, #97). - 4b two-state-machine status split + the status-backport-drop: EnrichmentStatus
is enrichment-only; IdentityStatus owns identity incl. NotFound (Unverified).
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Conflicts:
crates/livrarr-external-data/src/provider_client.rs
- Audiobook sync test
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
- Merge pull request #140 from kkodecs/wcc-stage5-green
Wcc stage5 green
- Support qBittorrent 5.2 session cookies in qbit_login
- Use returned qBittorrent auth cookie in server callers
- Accept qBittorrent 5.2 session cookies and 2xx responses
- Fix qBittorrent 5.2 authentication in download client test
- Fix qBittorrent 5.2 authentication in queue service
- Merge pull request #113 from Jandalslap/qbt-5.2-fix
Qbt 5.2 fix - Fix qBittorrent 5.2 authentication compatibility
- Merge pull request #136 from Vandypointe2/fix-qbit-magnet-redirect
Handle Prowlarr magnet redirects for qBittorrent
- Merge p5/unit-a: Phase 5 Unit A — identity matching authority
- Merge p5/unit-j: Phase 5 Unit J — AC-012 pin test
- Merge p5/unit-i: Phase 5 Unit I — merge-two-works action
- Merge p5/unit-d: Phase 5 Unit D — identity rewire onto matching authority
- Merge p5/unit-f: Phase 5 Unit F — recognition matcher fixes
- Merge p5/unit-g: Phase 5 Unit G — GR unlock, Tier-2 delete, dead code
- Merge p5/unit-e: Phase 5 Unit E — identity key, adopt/dedup, recompute
- Merge p5/unit-j2: Phase 5 Unit J2 — grey-park review surface
- Merge branch 'p6/n3-cover-fastfail' into metadata-remediation
- Merge branch 'p6/n2-cover-consolidation' into metadata-remediation
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01D3CYzhHwXJTSuVcQWC1tDX
- Merge metadata-remediation into main — the 2026-06-28 audit remediation epoch
Phases 0-5 (stuck-state fixes, cleanup, provider gateways, global outbound
queue, data completeness + convergence, one matching authority) plus the
post-phase N-units (GR series parser rewrite, cover fast-fail, picker via
authority, cover pipeline consolidation) and the id-completeness feature.
Workspace 1331/0 at merge.
Co-Authored-By: Claude Fable 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01D3CYzhHwXJTSuVcQWC1tDX
- Merge pull request #161 from kkodecs/import-consolidation
Consolidate import workflow, cover write-gate, and convergence defaults
- Merge bugfix/trivial-jul05 into main — poster series line (#109) + drop dead enrichment_retry_count (#137)
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01D3CYzhHwXJTSuVcQWC1tDX
- Merge pull request #165 from kkodecs/bugfix/135-refresh-filter
fix(works): Refresh-All honors filters + surfaces real error (#135)
- Merge pull request #166 from kkodecs/bugfix/53-biblio-title-guard
fix(bibliography): guard LLM title cleanup against garbled rewrites (#53)
- Merge pull request #167 from kkodecs/bugfix/145-hc-fetch-by-key
feat(hardcover): fetch-by-hc_key enrichment path (#145)
- Merge pull request #168 from kkodecs/bugfix/133-language-merge-guard
fix(enrichment): guard all non-audio merge fields against wrong-language editions (#133)
- Merge pull request #169 from kkodecs/chore/canonical-s1-amendment
docs(canonical-model): record S1 conformance closure (#143)
- Merge pull request #170 from kkodecs/bugfix/easy-96-139
fix: audiobook cover upload button (#139) + normalize locale tags before language gate (#96)
- Merge pull request #171 from kkodecs/chore/hook-abspath
fix(hooks): use absolute path for pii-check PreToolUse hook
🚜 Refactor
- (metadata-modularization) AC-021 — drop external-data shim, direct imports
- (metadata-modularization) 4a — extract livrarr-enrichment (behavior-preserving carve)
- (metadata-modularization) Status-backport-drop — EnrichmentStatus sheds identity variants
- (metadata-refactor) S3b — complete download_cover_to_disk relocation (D-002)
- (metadata) Phase 2 — dedup provider code, shrink the god file
- (metadata) Phase 3 Step A — route fetcher onto the outbound queue
- (metadata) Phase 3 B1 — Hardcover onto the outbound queue (template)
- (metadata) Phase 3 B1 — all five remaining providers onto the outbound queue
- (metadata) Phase 3 C — enrichment queue sheds its transport duties
- (domain) Phase 4 G — delete stranded PacingLane/ProviderCallOutcome
- (dead-code) Delete the AR-08 batch + AR-13 dead trait, with cascade
- (startup) Startup passes on JobRunner rails; drop dead LLM merge-engine args
- (metadata) S1 — drop dead fields, shrink WorkServiceImpl to <D,E,H,L>
- (metadata) S2a — discovery concern extracted to discovery_service.rs
- (metadata) S2b — DiscoveryService trait; god struct down to <D,E,H>
- Delete idle suppression machinery + door-gate behavioral suite
- Quality wave 1 — dead code, dedup, workspace deps (probe #4-#18, #38, #39a)
- Quality wave 3 items 1-5 — five pure moves (probe #24,#25,#27,#28,#29)
- Split series_query_service into cohesive submodules
- Split WorkDetailPage into per-component files
- Extract update-notifier version check into a tested util
📚 Documentation
- Update llm-context.md for accuracy
- Refresh README to alpha5 (Quick Start pin, multi-arch, built-in readers)
- Update llm-context.md for accuracy
- (goodreads) Record live validation of the autocomplete fix
- (metadata-modularization) Phase 2 — analytical canary assessment (GO, no cycle)
- (metadata-modularization) Fold PO design review (2026-06-03)
- (metadata-modularization) Rename crate livrarr-providers → livrarr-external-data (PO)
- (metadata-modularization) Pre-build verification scenarios (grounded in live DB)
- (metadata-modularization) E/F reconcile — align spec + IR to as-built
- (metadata-modularization) Mark status-backport-drop Delivered in the spec
- As-built status + domain wiki page for audiobook sync
- (wiki) Metadata-refactor retro lessons — door→road wiring + System Truths
- (wiki) 13->17 crate corrections + canonical-model pointers
- (wiki) Post-merge addendum — audit baseline, conformance issues, gate-friction directive
- Land session working artifacts from the modularization/WCC/audit arcs
- (roadmap) Alpha-6 restructure + 2026-06-10 reality sync
- (roadmap) Alpha-6 sprint structure — audit-grounded statuses (A–F)
- Backfill CHANGELOG for alpha5; draft alpha-6 release notes
- (roadmap) A6 release gate — cut moves behind Sprint B + scatter parallelization
- (roadmap) Correct the a6 release gate — cut when Sprints A-F all complete
- (wiki) Series stubs/rosters/promotion domain law (sprint-c follow-up)
- (convergence) Persist stage-0 verdicts + convergence spec-notes; correct insight 55
- (architecture) Land architecture-review, reconciled-plan, stage-0 work-order + wiki updates
- Add metadata system audit (2026-06-28)
- (metadata) Phase 3 queue design (locked v4) + Phase 1/3 handoffs
- (metadata) Phase 3 foundation plan (rev 5) + build handoff
- (wiki) Phase 3+4 insights and change log; Phase 4 handoff
- (phase5) Matching authority — spec, inventory, precedent research, wiki
- (wiki) Log N3 close-out
- (wiki) N2 close-out — insight 63, amendments 51/52, pathway corrections
- Architecture-review prep — briefing doc, wiki corrections (trait count, import_pipeline network claim, canonical-model path)
- Land the flow contract — roads.md + its adversarial verification record
- Move principles.md into tracked docs/ (was gitignored under build/)
- Architecture review 2026-07-04 + type-visibility rule
- Fold product principles into ARCHITECTURE.md Part 1, retire the duplicate
- (canonical-model) Record S1 conformance closure in amendments log (#143)
- (tests) Review fix — test headers name DiscoveryService for the moved seams
- Work-service-split + orphan-cleanup record; audit reconciliation; wiki updates
- PO ratifications (D1, D2, wave-3 scope) + wiki fix-up post quality waves
- Record #36 as incomplete (pinned, not implemented) — caught at plan audit
- Insight 73 — subtitle-trust-gaps findings
- Move stray design/spec/plan artifacts out of repo root into docs/
- (changelog) Regenerate for 0.1.0-alpha6, stop dropping non-conventional commits
- (wiki) Insights 63/73 amendments + insight 74 (session findings 2026-07-17)
- (changelog) Fold the post-bump fix set into 0.1.0-alpha6
⚡ Performance
- (covers) Phase1 fails fast on dead hosts — 600ms connect budget + per-run negative host cache
🧪 Testing
- (behavioral) Land + register the cross-format-resume, S6-retry, and IDU bulk-identity suites
- (behavioral) Phase 5 J — AC-012 pin: parked works never enrich via convergence
- (import-consolidation) Catch up behavioral coverage for 50ac82b
- (e2e) Add Playwright browser-E2E runner + smoke test (#159)
- (behavioral) Orphan cleanup — register 7, park 3, delete 20, add manifest guard
- (behavioral) Close the parked-test list — port e2, drop g2/cup/phase3a
⚙️ Miscellaneous Tasks
- (metadata-refactor) Green base for parallel S3b–S8 build
- (metadata-refactor) Signature-lock — implement has_pending_or_running (REQ-011)
- Native arm64 runner, per-platform buildx caches, 45m timeout; node24 action bumps
- Repo cleanup + add PRINCIPLES.md and ARCHITECTURE.md
- (metadata) Freeze in-flight metadata WIP as pre-remediation baseline
- (metadata) Phase 1 cleanup — dead code, dead cache, audiobook cover dims
- (docker) Cache Rust dependency builds with cargo-chef (#163)
- Stop tracking the PII deny-list; the hook reads it from local disk only
- Demote per-tick job 'tick completed' log to trace
- (release) 0.1.0-alpha6