v1.4.5 - annuals and collected editions join their series, a library that knows what it's missing, and a September security round
๐ Highlights
- Annuals live with their series: an annual gets its own numbering, so "Batman Annual #1" never fights "Batman #1" again. Attach a provider's annual volume from the series page and its issues join the run - claimed by issue id, or by name for one-offs like "The Amazing Spider-Man '96 #1" that carry no "Annual" token. Every attached row names its volume ("The Amazing Spider-Man '96 ยท Annual #1"), and a new sort control orders the series by number or by release date, where annuals fall into place between the issues they were published among. The Duplicate Resolver understands that seven annual volumes' "#1"s are seven comics, not one group to delete. (#203, requested and field-tested across five rounds by anacronismo)
- Collected editions get a shelf: attach a trade or omnibus volume to its series and its books sit on their own shelf, numbered in the order you want to read them. A trade the provider doesn't know can be attached by name alone - from the Smart Matcher's new "Attach to Series", or from the shelf - and Standardize keeps its books named after the edition. (field reports by robotshavehearts2)
- A trade you own counts everywhere: each collected book has a Covers field, prefilled from ComicVine's "Collects #1-6" line and hand-editable. Issues covered by a trade you own leave Missing on the series page, hide in Missing Issues behind a toggle, drop out of Discover's "Request Missing", a volume request, and the monitor's automatic asks. (robotshavehearts2)
- Missing Issues, front and center: a linkable Missing Issues view for the whole library, one door on the front page and one in the library toolbar, with Request on every card and "Request all shown" for whatever you've filtered to. (robotshavehearts2)
- For Your Library: the front page's new shelf reads the writers and characters across the series you own and suggests series you don't have, each card saying who it's there for. Monitor adds one straight to Missing Issues; Not interested hides it, with undo. A full page sits behind See All. (robotshavehearts2)
- Smart Matcher, sharpened: Ignore sticks (a dismissed item stays dismissed and out of automatic matching), the bulk mapping table shows each bound issue's cover from one provider call, auto-scan suggestions are scored by name with the year only breaking ties instead of taking the provider's first result, and two series can never share a folder - when a match would land in another series' folder you choose: attach it there as a collected edition, or give it a folder name of its own. (robotshavehearts2)
- Half-issues are one issue: ComicVine's "13ยฝ" and your file's "13.5" no longer split into a missing row and a present one - detection, the matcher's cross-reference, matching, and the series page all agree, and an existing split heals the next time you open the series. (#205, reported by BeepbopbeepityBop with a database analysis that nailed the shape)
- September security round: Next.js 15.5.25 (two critical unauthenticated remote-code-execution fixes), sharp, nodemailer, adm-zip and brace-expansion on the Node side; on the engine, reqwest 0.12 retires an entire old TLS stack (rustls 0.21, webpki 0.101, hyper 0.14), and the crates that parse ComicInfo from downloaded archives and encode every cover move to fixed versions. Production audit: zero findings on both sides. The August round (undici, sanitize-html, nanoid) is in here too.
๐ ๏ธ More fixes and improvements
- An expired session sends you to sign in with a note saying why, and signing back in returns you to the page you were on - no more "Unauthorized Access" dead-ends in the Smart Matcher after a day away (#204, reported by de6oliveira-droid)
- Admins can close the front door: a self-registration toggle in Access & Security; manual account creation stays
- Issue reports reach the admins as a notification event (Discord, email, Pushover, Telegram, Apprise) with the series context
- A "Scan library" button on the front page, always visible - the moment you want it is before anything is unmatched
- Bare rows created by the series page finally read their own ComicInfo.xml, so an annual's synopsis is its own, not its parent's (#203)
- Attached annuals stopped growing twin rows on every series-page visit, and a Library Scan heals any twins an earlier beta made (#203)
- An owned trade whose filename parses to a run number is never flagged as a duplicate of that issue
- series.json remembers attached volumes, their books and what each covers, so a wipe-and-rescan restores them with zero provider calls
๐ฆ Upgrading
Standard three-service compose: docker compose pull && docker compose down && docker compose up -d. Schema changes are additive (attached volumes, collected-edition coverage, the credits ledger behind For Your Library, per-user recommendation dismissals) and apply automatically on boot; SQLite and PostgreSQL both covered. No new environment variables. The For Your Library shelf builds with the Discover sync and fills as the scheduled sweep backfills volume credits, so give it a sweep or two - or press Run Now on the Jobs page.
Thanks to anacronismo for the Series-Annual Integration request and five rounds of same-day field testing on #203, plus the #205 verification; to robotshavehearts2 for three thorough write-ups that became fourteen betas; to de6oliveira-droid for #204; and to BeepbopbeepityBop for #205.