Patch release. Three user-facing bug fixes plus a Hardcover edition-hydration feature and the client side of the telemetry redesign.
Fixed
-
Library scan now reconciles Calibre-imported books with missing file paths (#875, #878) — Calibre import sets every book to
Status=Imported, but in container setups where Calibre's library mount differs from Bindery's view,FilePathstays empty. The library scan's candidate filter requiredStatus=Wantedso all imported epubs found zero reconciliation targets, and users had to refresh metadata per author to nudge the rows back into scope. The candidate filter now includes Imported books whose recorded paths are either empty or point at locations that no longer exist, so the canonical Calibre-import-then-scan flow just works. Also covers the related "user moved their library and re-ran a scan" case where Imported rows used to be orphaned forever. Thanks to @Jashun44 for the precise diagnosis. -
Single-word hyphenated titles no longer have every release dropped at the relevance filter (#871, #876) — titles whose entire significant content was one hyphenated token (e.g. Slaughterhouse-Five, Mother-to-Mother) failed the relevance filter against every indexer result because
SigWordskept the hyphen in the keyword whileNormalizeReleaseon the release side replaced it with a space.SigWordsnow pre-converts the same separator set asNormalizeRelease(._-()[]|) so hyphenated titles tokenise the same way multi-word titles already do. Reported with root cause and fix shape by @eliseban. -
Transmission grabs no longer time out when the daemon is behind a VPN container (#873, #877) — when Transmission runs inside
haugene/transmission-openvpnor similar, the daemon's outbound traffic routes through the VPN tunnel. Bindery was passing the indexer URL via Transmission'sfilenamearg, which makes the daemon fetch the URL itself; through the VPN that fetch never returns and Bindery's 15s deadline trips even though Test-Connection works fine. The Transmission client now fetches the.torrentfile through Bindery's own HTTP client and submits the content viametainfo(base64), matching the same shape SAB (#864) and NZBGet (#837) ship since v1.15.2. Magnet links still pass through unchanged. Samehttpsec.PolicyLANSSRF guard and 50 MB cap as the other clients. Reported by @Bclark117 with the exact fix shape this release implements.
Changed
-
Hardcover editions hydrate into the local library when a book has a confident Hardcover identity (#822) — when a book carries an
hc:foreign ID (created via Hardcover lookup, list sync, rebind, recommendations, or series fill), Bindery now fetches the full Hardcover edition list and persists those rows alongside the book. Edition fields use a COALESCE NULLIF upsert so user-curated and import-time values are never overwritten, and edition rows that already belong to another book are silently skipped (no re-parenting). When the matched audiobook edition carries an ASIN and the book has none yet, the ASIN is promoted onto the book and (if Audnex is configured) the audiobook is enriched automatically. Gated on Enhanced Hardcover being enabled (token configured + admin opt-in + env enabled), so installs without a Hardcover token see no behaviour change. Thanks to @magrhino. -
Telemetry client sends per-subsystem feature counters (#872) — the daily anonymous ping now carries an optional
featuresblock with counts of enabled indexers, download clients, notifications, and users, plus booleans for whether Calibre / Audiobookshelf / Grimmory / Hardcover / OIDC / multi-user is configured. Strictly numeric or boolean, never names or values. Lets the maintainer prioritise feature work against actual adoption rather than Discord vibes. Documented at getbindery.dev/telemetry-fields and opt-out remains unchanged (BINDERY_TELEMETRY_DISABLED=trueenv var ortelemetry.enabled=falsesetting).