-
v2.6.70
Stablereleased this
2026-04-11 15:13:40 +05:00 | -493 commits to main since this releaseDownloads
-
v3-cleanup-20260411
Stablereleased 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
- Service worker (src/service-worker.ts) handles push events and
-
v2.6.69
Stablereleased this
2026-04-11 12:41:04 +05:00 | -491 commits to main since this releaseDemote 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
Stablereleased this
2026-04-11 12:33:35 +05:00 | -490 commits to main since this releaseTwo bugs fixed in runScrapeTask / runCatalogueTask:
-
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. -
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
Stablereleased this
2026-04-11 10:41:43 +05:00 | -489 commits to main since this releaseRemove 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
Stablereleased this
2026-04-11 10:21:20 +05:00 | -488 commits to main since this releaseRemove 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
Stablereleased this
2026-04-11 09:35:25 +05:00 | -487 commits to main since this releaseAdd 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
Stablereleased this
2026-04-11 09:01:28 +05:00 | -486 commits to main since this releaseUnify 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
Stablereleased 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
Stablereleased this
2026-04-10 20:08:23 +05:00 | -484 commits to main since this releaseAdd 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
- 'stream' (default): /api/audio-stream starts playing within seconds,