• v2.6.74
    All checks were successful
    Release / Test backend (push) Successful in 1m0s
    Release / Check ui (push) Successful in 1m42s
    Release / Docker (push) Successful in 5m55s
    Release / Gitea Release (push) Successful in 39s
    Stable

    gitea-actions released this 2026-04-11 17:20:14 +05:00 | -497 commits to main since this release

    Downloads
  • v2.6.73
    All checks were successful
    Release / Test backend (push) Successful in 52s
    Release / Check ui (push) Successful in 1m49s
    Release / Docker (push) Successful in 6m29s
    Release / Gitea Release (push) Successful in 35s
    Stable

    gitea-actions released this 2026-04-11 16:00:53 +05:00 | -496 commits to main since this release

    Float mode was broken because AudioPlayer was unmounted the moment
    audioStore.active became true — exactly when the float overlay needs
    to render. Fix: keep AudioPlayer mounted in float and minimal modes
    regardless of audioStore.active; only standard mode shows the
    'Controls below' message.

    Adds a third 'minimal' style: a compact single-row bar (skip ±,
    play/pause, seek, time) with no voice picker or chapter browser.
    Voice picker and chapter button are hidden in the idle pill too.

    Settings UI updated to show all three options with a live
    description of what each style does.

    Downloads
  • v2.6.72
    All checks were successful
    Release / Test backend (push) Successful in 46s
    Release / Check ui (push) Successful in 1m38s
    Release / Docker (push) Successful in 6m29s
    Release / Gitea Release (push) Successful in 31s
    Stable

    gitea-actions released this 2026-04-11 15:52:20 +05:00 | -495 commits to main since this release

    Up/down chevron buttons fixed to the bottom-right of the viewport.
    At the top of the chapter the up button becomes a Prev chapter link;
    at the bottom the down button becomes an amber Next chapter link.
    Hidden in focus mode (uses its own pill). Lifts above the audio
    mini-player when it is active.

    Downloads
  • v2.6.71
    All checks were successful
    Release / Test backend (push) Successful in 48s
    Release / Check ui (push) Successful in 1m53s
    Release / Docker (push) Successful in 6m22s
    Release / Gitea Release (push) Successful in 35s
    Stable

    gitea-actions released this 2026-04-11 15:47:05 +05:00 | -494 commits to main since this release

    • Replace bell dropdown with full-screen NotificationsModal (mirrors SearchModal pattern)
    • Notifications visible to all logged-in users (not just admin)
    • Admin users excluded from new-chapter fan-out (dedup vs Scrape Complete notification)
    • Users with notify_new_chapters=false opted out of new-chapter in-app notifications
    • Toggle in profile page to enable/disable in-app new-chapter notifications
    • PATCH /api/profile endpoint to save notification preferences
    • User-facing /notifications page (admin redirects to /admin/notifications)
    Downloads
  • v3-cleanup-20260411b
    All checks were successful
    Release / Test backend (push) Successful in 48s
    Release / Check ui (push) Successful in 1m53s
    Release / Docker (push) Successful in 6m22s
    Release / Gitea Release (push) Successful in 35s
    Stable

    gitea-actions released this 2026-04-11 15:31:49 +05:00 | -494 commits to main since this release

    • Replace bell dropdown with full-screen NotificationsModal (mirrors SearchModal pattern)
    • Notifications visible to all logged-in users (not just admin)
    • Admin users excluded from new-chapter fan-out (dedup vs Scrape Complete notification)
    • Users with notify_new_chapters=false opted out of new-chapter in-app notifications
    • Toggle in profile page to enable/disable in-app new-chapter notifications
    • PATCH /api/profile endpoint to save notification preferences
    • User-facing /notifications page (admin redirects to /admin/notifications)
    Downloads
  • v2.6.70
    All checks were successful
    Release / Test backend (push) Successful in 49s
    Release / Check ui (push) Successful in 1m47s
    Release / Docker (push) Successful in 6m8s
    Release / Gitea Release (push) Successful in 36s
    Stable

    gitea-actions released this 2026-04-11 15:13:40 +05:00 | -493 commits to main since this release

    Downloads
  • v3-cleanup-20260411
    All checks were successful
    Release / Test backend (push) Successful in 4m12s
    Release / Check ui (push) Successful in 1m53s
    Release / Docker (push) Successful in 5m46s
    Release / Gitea Release (push) Successful in 35s
    Stable

    gitea-actions released this 2026-04-11 14:59:28 +05:00 | -492 commits to main since this release

    • Service worker (src/service-worker.ts) handles push events and
      notification clicks, navigating to the book page on tap
    • Web app manifest (manifest.webmanifest) linked in app.html
    • Profile page: push notification toggle (subscribe/unsubscribe)
      using the browser Notification + PushManager API with VAPID
    • API route POST/DELETE /api/push-subscription proxies to backend
    • Go backend: push_subscriptions PocketBase collection storage
      methods (SavePushSubscription, DeletePushSubscription,
      ListPushSubscriptionsByBook) in storage/store.go
    • handlers_push.go: GET vapid-public-key, POST/DELETE subscription
    • webpush package: VAPID-signed sends via webpush-go, SendToBook
      fans out to all users who have the book in their library
    • Runner fires push to subscribers whenever ChaptersScraped > 0
      after a successful book scrape
    • Config: VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT env vars
    • domain.ScrapeResult gets a Slug field; orchestrator populates it
    Downloads
  • v2.6.69
    All checks were successful
    Release / Test backend (push) Successful in 55s
    Release / Check ui (push) Successful in 2m0s
    Release / Docker (push) Successful in 5m57s
    Release / Gitea Release (push) Successful in 32s
    Stable

    gitea-actions released this 2026-04-11 12:41:04 +05:00 | -491 commits to main since this release

    Demote per-book and per-chapter-list-page Info logs to Debug — these
    fire hundreds of times per catalogue run and drown out meaningful signals:

    • orchestrator: RunBook starting (per book)
    • metadata saved (per book)
    • chapter list fetched (per book)
    • scraping chapter list page N (per pagination page per book)

    The 'book scrape finished' summary log (with scraped/skipped/errors
    counters) remains at Info — it is the useful signal per book.

    Downloads
  • v2.6.68
    All checks were successful
    Release / Test backend (push) Successful in 48s
    Release / Check ui (push) Successful in 1m55s
    Release / Docker (push) Successful in 6m5s
    Release / Gitea Release (push) Successful in 32s
    Stable

    gitea-actions released this 2026-04-11 12:33:35 +05:00 | -490 commits to main since this release

    Two bugs fixed in runScrapeTask / runCatalogueTask:

    1. FinishScrapeTask was called with the task's own context, which is
      already cancelled when the task is stopped. The PATCH to PocketBase
      failed silently, leaving all counters at their initial zero values.
      Fix: use a fresh context.WithTimeout(Background, 15s) for the write.

    2. BooksFound was double-counted: RunBook already sets BooksFound=1 on
      success, but the accumulation loop added an extra +1 unconditionally,
      reporting 2 books per successful scrape.
      Fix: result.BooksFound += bookResult.BooksFound (drop the + 1).

    Downloads
  • v2.6.67
    All checks were successful
    Release / Test backend (push) Successful in 50s
    Release / Check ui (push) Successful in 1m52s
    Release / Docker (push) Successful in 5m58s
    Release / Gitea Release (push) Successful in 33s
    Stable

    gitea-actions released this 2026-04-11 10:41:43 +05:00 | -489 commits to main since this release

    Remove the TTS voice section from the profile page — it fetched
    /api/voices on every mount, blocking paint for the full round-trip.
    Voice selection lives on the chapter page where voices are already loaded.

    Rewrite the server load to run avatar, sessions+stats, and reading history
    all concurrently via Promise.allSettled instead of sequentially, cutting
    SSR latency by ~2-3x on the profile route.

    Downloads