• v3.0.20260413-notifications
    All checks were successful
    Release / Test backend (push) Successful in 55s
    Release / Check ui (push) Successful in 2m0s
    Release / Docker (push) Successful in 7m19s
    Release / Gitea Release (push) Successful in 26s
    Stable

    gitea-actions released this 2026-04-13 21:19:07 +05:00 | -525 commits to main since this release

    • Add bookstore.NotificationStore interface and wire it directly to *storage.Store
      in Dependencies, bypassing the Asynq wrapper that caused Producer.(*storage.Store)
      to fail with a 500 on every notification endpoint when Redis is configured
    • Replace s.deps.Producer.(*storage.Store) type assertion in all 5 notification
      handlers with s.deps.NotificationStore (nil-safe, always works)
    • Fix PocketBase filter single-quote bug in ListNotifications, ClearAllNotifications,
      and MarkAllNotificationsRead (PocketBase requires double quotes for string values)
    Downloads
  • v2.6.93
    All checks were successful
    Release / Test backend (push) Successful in 49s
    Release / Check ui (push) Successful in 2m0s
    Release / Docker (push) Successful in 7m4s
    Release / Gitea Release (push) Successful in 28s
    Stable

    gitea-actions released this 2026-04-13 21:14:33 +05:00 | -524 commits to main since this release

    The {#await ... then} + {@const} IIFE pattern for assigning to $state
    variables stopped working reliably in Svelte 5.53+. Replaced with a
    proper $effect that awaits both streamed promises and assigns to state,
    which correctly triggers reactivity.

    Also: switch library page selection mode entry from long-press to a
    'Select' button in the page header.

    Downloads
  • v2.6.92
    All checks were successful
    Release / Test backend (push) Successful in 49s
    Release / Check ui (push) Successful in 1m55s
    Release / Docker (push) Successful in 7m23s
    Release / Gitea Release (push) Successful in 53s
    Stable

    gitea-actions released this 2026-04-13 21:08:51 +05:00 | -523 commits to main since this release

    Downloads
  • v2.6.91
    All checks were successful
    Release / Test backend (push) Successful in 47s
    Release / Check ui (push) Successful in 1m54s
    Release / Docker (push) Successful in 7m15s
    Release / Gitea Release (push) Successful in 27s
    Stable

    gitea-actions released this 2026-04-13 19:57:01 +05:00 | -522 commits to main since this release

    Downloads
  • v2.6.89
    All checks were successful
    Release / Test backend (push) Successful in 58s
    Release / Check ui (push) Successful in 1m59s
    Release / Docker (push) Successful in 6m24s
    Release / Gitea Release (push) Successful in 23s
    Stable

    gitea-actions released this 2026-04-13 10:33:02 +05:00 | -520 commits to main since this release

    Downloads
  • v2.6.88
    All checks were successful
    Release / Test backend (push) Successful in 51s
    Release / Check ui (push) Successful in 1m48s
    Release / Docker (push) Successful in 6m54s
    Release / Gitea Release (push) Successful in 28s
    Stable

    gitea-actions released this 2026-04-12 22:49:26 +05:00 | -519 commits to main since this release

    Downloads
  • v3-cleanup-20260413b
    All checks were successful
    Release / Test backend (push) Successful in 48s
    Release / Check ui (push) Successful in 1m56s
    Release / Docker (push) Successful in 5m35s
    Release / Gitea Release (push) Successful in 23s
    Stable

    gitea-actions released this 2026-04-12 18:47:40 +05:00 | -515 commits to main since this release

    The SSE (non-async) chapter-names handler streamed results to the client
    but never wrote them into the PocketBase job payload — only the initial
    {pattern} stub was stored. The Review button then fetched the job and
    found no results, showing 'No results found in this job's payload.'

    Fix: accumulate allResults across batches (same as the async handler) and
    write the full {pattern, slug, results:[...]} payload when marking done.

    Downloads
  • v3-cleanup-20260413
    All checks were successful
    Release / Test backend (push) Successful in 53s
    Release / Check ui (push) Successful in 1m49s
    Release / Docker (push) Successful in 5m49s
    Release / Gitea Release (push) Successful in 21s
    Stable

    gitea-actions released this 2026-04-12 17:56:58 +05:00 | -513 commits to main since this release

    • Add notify_new_chapters_push field to AppUser, PATCH /api/profile, and profile loader
    • Fix bell panel to reload notifications on every open (not just once on mount)
    • Replace flat in-app + push toggles with structured category table (Category | In-app | Push)
    • Add browser push master subscribe/unsubscribe row above the table
    • Push column toggle disabled until browser is subscribed; shows — when unsupported/denied
    • Update Notifications row hint to summarise active channels (In-app · Push / Off)
    Downloads
  • v3-cleanup-20260412b
    All checks were successful
    Release / Test backend (push) Successful in 47s
    Release / Check ui (push) Successful in 1m41s
    Release / Docker (push) Successful in 5m40s
    Release / Gitea Release (push) Successful in 21s
    Stable

    gitea-actions released this 2026-04-12 17:42:53 +05:00 | -511 commits to main since this release

    Downloads
  • v2.6.86
    All checks were successful
    Release / Test backend (push) Successful in 1m1s
    Release / Check ui (push) Successful in 1m42s
    Release / Docker (push) Successful in 6m13s
    Release / Gitea Release (push) Successful in 21s
    Stable

    gitea-actions released this 2026-04-12 11:13:36 +05:00 | -510 commits to main since this release

    • getReadyChaptersForSlug(slug, preferredVoice) in pocketbase.ts: per-slug done jobs map, cached 60s, prefers user's voice
    • GET /api/audio/chapters?slug=&voice= endpoint
    • Chapter list (/books/[slug]/chapters): amber headphones icon on ready rows, play button for instant listen, banner showing ready count
    • Chapter reader: audioReady + availableVoice from server load; 'Audio ready — Listen now' banner shown when audio exists and player is not yet active; sets voice preference before expanding player
    Downloads