github kkodecs/livrarr v0.1.0-alpha6
0.1.0-alpha6

pre-releaseone day ago

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 your livrarr.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

Don't miss a new livrarr release

NewReleases is sending notifications on new releases.