• 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
  • v2.6.66
    All checks were successful
    Release / Test backend (push) Successful in 48s
    Release / Check ui (push) Successful in 1m51s
    Release / Docker (push) Successful in 6m21s
    Release / Gitea Release (push) Successful in 36s
    Stable

    gitea-actions released this 2026-04-11 10:21:20 +05:00 | -488 commits to main since this release

    Remove all decorative SVG icons (checkmarks, chevrons, stars, fire,
    external-link arrows, empty-state illustrations). Replace icon-only
    interactive elements with text (avatar hover shows 'Edit', voice sample
    buttons show 'Play'/'Stop', danger zone toggle shows 'Open'/'Close').
    Replace SVG avatar placeholder with the user's initial. Strip emoji
    from stats cards and genre chips. Tighten playback toggle descriptions.

    Downloads
  • v2.6.65
    All checks were successful
    Release / Test backend (push) Successful in 45s
    Release / Check ui (push) Successful in 1m53s
    Release / Docker (push) Successful in 6m13s
    Release / Gitea Release (push) Successful in 37s
    Stable

    gitea-actions released this 2026-04-11 09:35:25 +05:00 | -487 commits to main since this release

    Add og:title, og:description, og:image (book cover), og:url, og:type,
    og:site_name, twitter:card, twitter:image, and rel=canonical to the
    book detail and chapter reader pages so link previews in Telegram,
    WhatsApp, Twitter/X, Discord etc. show the cover image instead of
    the site logo.

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

    gitea-actions released this 2026-04-11 09:01:28 +05:00 | -486 commits to main since this release

    Unify the duplicated chapter picker overlays from AudioPlayer and
    ListeningMode into a single ChapterPickerOverlay component.
    Both callers keep their own onselect handlers; the overlay owns
    search state internally and includes safe-area insets + scrollIfActive.

    Downloads
  • v2.6.63
    All checks were successful
    Release / Test backend (push) Successful in 1m2s
    Release / Check ui (push) Successful in 1m46s
    Release / Docker (push) Successful in 6m9s
    Release / Gitea Release (push) Successful in 29s
    Stable

    gitea-actions released this 2026-04-10 22:30:44 +05:00 | -485 commits to main since this release

    • Replace voice with a two-column card grid grouped by engine (Kokoro GPU / Pocket TTS CPU / Cloudflare AI); each card has a per-voice sample play/pause button matching AudioPlayer behaviour Add Announce chapter and Audio mode (Stream/Generate) toggles to a unified Playback row in Preferences; Audio mode toggle disabled for CF AI voices Remove duplicate PUT /api/settings from the profile page; all writes go directly into audioStore / theme context and the layout's single debounced effect persists them Add Danger Zone section: collapsible, requires typing username to unlock Delete account button; calls DELETE /api/profile Add deleteUserAccount() to pocketbase.ts: purges user_settings, user_library, progress, comment_votes, book_ratings, user_subscriptions, notifications, user_sessions then the app_users record Add DELETE /api/profile server route (auth-guarded)
    Downloads
  • v2.6.62
    All checks were successful
    Release / Test backend (push) Successful in 51s
    Release / Check ui (push) Successful in 2m6s
    Release / Docker (push) Successful in 6m15s
    Release / Gitea Release (push) Successful in 29s
    Stable

    gitea-actions released this 2026-04-10 20:08:23 +05:00 | -484 commits to main since this release

    Add a user-selectable playback mode stored in user_settings:

    • 'stream' (default): /api/audio-stream starts playing within seconds,
      saves to MinIO concurrently — low latency
    • 'generate': queue runner task, poll until full audio is ready in
      MinIO, then play via presigned URL — legacy behaviour

    UI toggles in two places:

    • AudioPlayer idle pill: compact '· Stream / · Generate' inline next
      to voice name and estimated duration
    • ListeningMode controls row: pill alongside Auto, Announce, Sleep;
      disabled and grayed out for CF AI voices (batch-only, no streaming)

    startPlayback() now branches on audioStore.audioMode for non-CF AI
    voices; generate mode uses the same runner task + progress bar flow
    as CF AI but without the preview clip.

    PocketBase: audio_mode text field added to user_settings on
    pb.libnovel.cc (live) and in pb-init-v3.sh (create block +
    add_field migration line).

    Downloads