-
v2.5.72
StableAll checks were successfulRelease / Test backend (push) Successful in 44sRelease / Check ui (push) Successful in 44sRelease / Docker / caddy (push) Successful in 43sRelease / Docker / backend (push) Successful in 2m46sRelease / Docker / runner (push) Successful in 3m19sRelease / Docker / ui (push) Successful in 3m12sRelease / Gitea Release (push) Successful in 1m22sreleased this
2026-04-04 21:17:55 +05:00 | -375 commits to main since this releaseDownloads
-
v2.5.66
StableAll checks were successfulRelease / Test backend (push) Successful in 39sRelease / Check ui (push) Successful in 47sRelease / Docker / caddy (push) Successful in 45sRelease / Docker / backend (push) Successful in 2m35sRelease / Docker / runner (push) Successful in 2m36sRelease / Docker / ui (push) Successful in 2m25sRelease / Gitea Release (push) Successful in 43sreleased this
2026-04-04 20:18:19 +05:00 | -369 commits to main since this releaseBoth vars were present in Doppler but never injected into the ui service
environment, causing all checkout requests to fail with 500 and webhooks
to be silently rejected.Downloads
-
v2.5.65
StableAll checks were successfulRelease / Test backend (push) Successful in 40sRelease / Check ui (push) Successful in 46sRelease / Docker / caddy (push) Successful in 42sRelease / Docker / backend (push) Successful in 2m35sRelease / Docker / runner (push) Successful in 2m38sRelease / Docker / ui (push) Successful in 2m12sRelease / Gitea Release (push) Successful in 41sreleased this
2026-04-04 20:12:24 +05:00 | -368 commits to main since this release- Add /subscribe route with hero, benefits list, and pricing cards
(annual featured with Save 33% badge, monthly secondary) - Add 'Pro' link in nav for non-Pro users
- Add 'See plans' link in profile subscription section
- i18n keys across en/fr/id/pt/ru for all subscribe strings
Note: checkout still requires POLAR_API_TOKEN with checkouts:write scope.
Regenerate the token at polar.sh to fix the 502 error on subscribe buttons.Downloads
- Add /subscribe route with hero, benefits list, and pricing cards
-
v2.5.64
StableAll checks were successfulRelease / Test backend (push) Successful in 48sRelease / Check ui (push) Successful in 44sRelease / Docker / caddy (push) Successful in 44sRelease / Docker / backend (push) Successful in 3m22sRelease / Docker / runner (push) Successful in 2m51sRelease / Docker / ui (push) Successful in 3m17sRelease / Gitea Release (push) Successful in 1m12sreleased this
2026-04-04 19:57:16 +05:00 | -367 commits to main since this releaseAdd 5 admin sections to /books/[slug] for admins:
- Book cover generation (CF AI image-gen with preview + save)
- Chapter cover generation (chapter number input + preview)
- Description regeneration (preview + apply/discard)
- Chapter names generation (preview table + apply/discard)
- Audio TTS bulk enqueue (voice selector, chapter range, cancel)
Also adds /api/admin/audio/bulk and /api/admin/audio/cancel-bulk proxy routes,
and all i18n keys across en/fr/id/pt/ru.Downloads
-
v2.5.63
StableAll checks were successfulRelease / Test backend (push) Successful in 42sRelease / Check ui (push) Successful in 46sRelease / Docker / caddy (push) Successful in 41sRelease / Docker / backend (push) Successful in 2m46sRelease / Docker / runner (push) Successful in 3m12sRelease / Docker / ui (push) Successful in 2m19sRelease / Gitea Release (push) Successful in 36sreleased this
2026-04-04 19:55:05 +05:00 | -366 commits to main since this releasePocketTTS emits 16-bit PCM WAV (16 kHz mono). WAV is natively supported
on all browsers including iOS/macOS Safari, so the ffmpeg MP3 transcode
is unnecessary for the streaming path.Using format=wav for PocketTTS voices eliminates the ffmpeg subprocess
startup delay (~200–400 ms) and a pipeline stage, giving lower latency
to first audio frame. Kokoro and CF AI continue using MP3 (they output
MP3 natively or via the OpenAI-compatible endpoint).The runner (MinIO storage) is unaffected — it still stores MP3 for
space efficiency.Downloads
-
v2.5.62
StableAll checks were successfulRelease / Test backend (push) Successful in 37sRelease / Check ui (push) Successful in 44sRelease / Docker / caddy (push) Successful in 48sRelease / Docker / backend (push) Successful in 4m38sRelease / Docker / runner (push) Successful in 2m49sRelease / Docker / ui (push) Successful in 2m13sRelease / Gitea Release (push) Successful in 57sreleased this
2026-04-04 19:49:53 +05:00 | -365 commits to main since this releasePreviously all voices waited for full TTS generation before first byte
reached the browser (POST → poll → presign flow). For long chapters this
meant 2–5 minutes of silence.New flow for Kokoro and PocketTTS:
- tryPresign fast path unchanged (audio in MinIO → seekable presigned URL)
- On cache miss: set audioEl.src to /api/audio-stream/{slug}/{n} and mark
status=ready immediately — audio starts playing within seconds - Backend streams bytes to browser while concurrently uploading to MinIO;
subsequent plays use the fast path
New SvelteKit route: GET /api/audio-stream/[slug]/[n]
- Proxies backend handleAudioStream (already implemented in Go)
- Same 3 chapters/day free paywall as POST route
- HEAD handler for paywall pre-check (no side effects, no counter increment)
so AudioPlayer can surface upgrade CTA before pointing at URL
CF AI voices keep the old POST+poll flow (batch-only API, no real streaming
benefit, preserves the generating progress bar UX).Downloads
-
v2.5.61
StableAll checks were successfulRelease / Test backend (push) Successful in 39sRelease / Check ui (push) Successful in 46sRelease / Docker / caddy (push) Successful in 48sRelease / Docker / backend (push) Successful in 3m16sRelease / Docker / runner (push) Successful in 2m53sRelease / Docker / ui (push) Successful in 2m30sRelease / Gitea Release (push) Successful in 49sreleased this
2026-04-04 18:34:41 +05:00 | -364 commits to main since this release- AudioPlayer: add 'compact' playerStyle prop — slim seekable player with
progress bar, skip ±15/30s, play/pause circle button, and speed cycle - Chapter reader settings gear panel: new Listening section with player
style picker (Standard/Compact), speed control (0.75–2×), auto-next
toggle, and sleep timer — all persisted in reader_layout_v1 localStorage - audioStore.speed/autoNext/sleep now accessible directly from settings
panel without opening the audio player
Downloads
- AudioPlayer: add 'compact' playerStyle prop — slim seekable player with
-
v2.5.60
StableAll checks were successfulRelease / Test backend (push) Successful in 37sRelease / Check ui (push) Successful in 56sRelease / Docker / caddy (push) Successful in 41sRelease / Docker / backend (push) Successful in 2m53sRelease / Docker / runner (push) Successful in 3m13sRelease / Docker / ui (push) Successful in 2m25sRelease / Gitea Release (push) Successful in 50sreleased this
2026-04-04 18:22:09 +05:00 | -363 commits to main since this releaseWithout explicit setActionHandler('play'/'pause'/...) the browser uses
default handling which on iOS Safari stops working after ~1 min of
pause in background/locked state (AudioSession gets suspended and the
lock screen button can't resume it without a direct user gesture).Registering handlers in the layout (where audioEl lives) ensures:
- play/pause call audioEl directly — iOS treats this as a trusted
gesture and allows .play() even from the lock screen - seekbackward/seekforward map to ±15s / ±30s
- playbackState stays in sync so the lock screen shows the right icon
Downloads
- play/pause call audioEl directly — iOS treats this as a trusted
-
v2.5.59
StableAll checks were successfulRelease / Test backend (push) Successful in 41sRelease / Check ui (push) Successful in 43sRelease / Docker / caddy (push) Successful in 51sRelease / Docker / backend (push) Successful in 2m45sRelease / Docker / runner (push) Successful in 2m50sRelease / Docker / ui (push) Successful in 2m14sRelease / Gitea Release (push) Successful in 44sreleased this
2026-04-04 13:43:29 +05:00 | -362 commits to main since this release- Default max_tokens to 4096 for chapter-names so large chapter lists
are not cut off mid-JSON by the model's token limit - Rewrite system prompt to clarify placeholder semantics ({n} = number,
{scene} = scene hint) and explicitly forbid echoing the number inside
the title field — prevents "Chapter 1 - 1: ..." style duplications - UI: surface raw_response in the error area when chapters:[] is returned
so the admin can see what the model actually produced
Downloads
- Default max_tokens to 4096 for chapter-names so large chapter lists
-
v2.5.58
StableAll checks were successfulRelease / Test backend (push) Successful in 40sRelease / Check ui (push) Successful in 45sRelease / Docker / caddy (push) Successful in 42sRelease / Docker / backend (push) Successful in 2m55sRelease / Docker / runner (push) Successful in 3m3sRelease / Docker / ui (push) Successful in 2m31sRelease / Gitea Release (push) Successful in 43sreleased this
2026-04-04 13:16:10 +05:00 | -361 commits to main since this releaseAdds backend handlers and SvelteKit UI for an admin text generation tool.
The tool lets admins propose and apply AI-generated chapter titles and book
descriptions using Cloudflare Workers AI (12 LLM models, model selector shared
across both tabs).Downloads