• v1.15.0
    Release / build-and-push (push) Successful in 3m36s
    Stable

    john-okeefe released this 2026-10-17 22:13:00 -04:00 | 77 commits to main since this release

    Bug Fixes

    • (audio player + dashboard) Markdown bookmark notes, horizontal volume, transport glyphs, client-side badges (2c714dc)
    • (media-items) Normalize NOT NULL narrators on every write path (a222ef5)
    • (stats) Unambiguous chart x-labels + unit-carrying tooltips (b4ae423)
    • (conflicts) Resolution writes funnel through SaveProgress — audio position survives (8fc74c9)
    • (tests) Scope the sync_queue cleanup wipe to the test devices (d16ca4a)
    • (sync) The offline queue flush never processed anything — fix the enumerator + the dropped payload (6808c1b)
    • (bruno) Convert drifted body keys to body.data — CLI scenario runs now carry bodies (09b6693)
    • (annotations) Note LWW re-save 500'd — UserID missing from the sync update params (ff029f1)
    • (annotations) Bookmark and note PUTs land through the sync service (LWW by id) (7d698ea)
    • (annotations) LWW applies coalesce omitted fields — partial payloads no longer erase stored locators (edb4e60)
    • (sync) Offline detector wiped device name, auto_sync, and metadata on every transition (082a3e0)
    • (css) Native select popups follow the theme — color-scheme per scheme + themed option entries (8f05f11)
    • (api) Honor the request's origin as the writer label — app rows stop wearing "web" (45b8542)

    Documentation

    • (agents) Test-failure triage discipline — suspect the test first, but test edits stay asymmetric (de9e666)

    Features

    • (audiobooks) Batch A — foundation, m4b ingest, playback sync, web player (902cbe5)
    • (audiobooks) A2 — narrator metadata, audio-aware UX, player polish, bookmarks (86f0af6)
    • (audio player) Canonical audiobook transports + dropdown settings + volume panel (5cf3410)
    • (annotations + player) Bookmark rows in the banner, stacked volume panel, badge parity for comics/manga (89665fb)
    • (reader) Fullscreen mode; revert stacked volume; fix manga badges + ghost sidebar (73ae178)
    • (stats) Library tab — per-library inventory stats + audio-aware Reading tab (ce366b1)
    • (cards) Stamp active conflicts on collections, series, and preview JSON (b2b89ba)
    • (db) SearchMediaItemsUnifiedRow carries abridged + audio_metadata (c538efe)

    Miscellaneous Tasks

    • Delete dead progress handlers, no-op scar, split fused helper line (721139d)
    • (db) Sqlc regen — querier interface comment for the flush-enumerator fix (63a20dc)
    • (db) Retire the nine dead annotation plain queries + duplicate SQL line (00305ff)

    Refactor

    • (progress) SaveProgressRequest becomes the canonical PUT payload; GET serializes from the row (28bd323)
    • (progress) ProgressService required at construction; delete the 9 unreachable erase-fallbacks (e83c00f)
    • (cards) H2 foundation — cards.go, the one BookInfo construction site (1ce1b79)
    • (cards) Collections JSON detail + preview-adjacent ladder through the builder (2376593)
    • (cards) Smart-collection preview through the builder (c07dba4)
    • (cards) Series books JSON through the builder (2f9d5b8)
    • (cards) BuildSections through the builder (5adfb45)
    • (cards) Template search grid through the builder (0971e7d)
    • (cards) SSR series and tag pages through the builder (8c56c9d)
    • (cards) Bookshelf SSR through the builder — badges return to the bookshelf (bdad40e)
    • (cards) SSR collection detail ladder through the builder (a13b268)
    • (annotations) AnnotationService is a required constructor dependency (c579179)
    • (annotations) One LWW decision core + one tombstone gate + typed queue decoders (11609d1)
    • (utils) One PgTextString for the four pgtype.Text unwrappers (188ae07)
    • (devices) One Devices->DeviceInfo mapper for the five hand-built copies (58fbe37)
    • (conflicts) One ConflictDetail builder for the three row shapes (b47a2b8)
    • (collections) Rule evaluators take the real row; both 45-field converter twins deleted (18727fe)
    • (db) GetCollectionItemsForDashboard embeds the media row; excluded filter moves into SQL; third converter dies (77cf0b8)
    • (router) One WeekStatsData mapper for the dashboard page and week-widget fragment (87fc89a)
    • (hash-conflicts) One usage-counts reader for the API and SSR surfaces (2ba1e09)
    • (reader) One comic-likeness predicate — panel detection was a byte-identical twin (6b3bdef)
    • (opds) One acquisition-entry builder for the catalog and search feeds (29a5462)
    • (vis) H4.5 step 1 — LibraryService.VisibleLibrarySet, the canonical resolver; media endpoints migrated (1d12a64)
    • (vis) H4.5 step 2 — series endpoints on the canonical resolver (d2d92ef)
    • (vis) H4.5 step 3 — collections endpoint and the SSR helper on the canonical resolver (8dbaa8f)
    • (vis) H4.5 steps 4-5 — statistics and the three reader gates on the canonical resolver; core goes package-level (454938c)

    Tests

    • (contracts) Pin wire shapes before the canonical-types migrations (a2ea342)
    • (bruno) Sweep the collection against the actual route table (a85bc8a)
    • (contracts) CFI/context winner must land intact through conflict resolution (14cdbe7)
    • (contracts) Whitelist the unified row's two new keys on search rows (010c0cb)
    Downloads