• v2.5.72
    All checks were successful
    Release / Test backend (push) Successful in 44s
    Release / Check ui (push) Successful in 44s
    Release / Docker / caddy (push) Successful in 43s
    Release / Docker / backend (push) Successful in 2m46s
    Release / Docker / runner (push) Successful in 3m19s
    Release / Docker / ui (push) Successful in 3m12s
    Release / Gitea Release (push) Successful in 1m22s
    Stable

    gitea-actions released this 2026-04-04 21:17:55 +05:00 | -375 commits to main since this release

    Downloads
  • v2.5.66
    All checks were successful
    Release / Test backend (push) Successful in 39s
    Release / Check ui (push) Successful in 47s
    Release / Docker / caddy (push) Successful in 45s
    Release / Docker / backend (push) Successful in 2m35s
    Release / Docker / runner (push) Successful in 2m36s
    Release / Docker / ui (push) Successful in 2m25s
    Release / Gitea Release (push) Successful in 43s
    Stable

    gitea-actions released this 2026-04-04 20:18:19 +05:00 | -369 commits to main since this release

    Both 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
    All checks were successful
    Release / Test backend (push) Successful in 40s
    Release / Check ui (push) Successful in 46s
    Release / Docker / caddy (push) Successful in 42s
    Release / Docker / backend (push) Successful in 2m35s
    Release / Docker / runner (push) Successful in 2m38s
    Release / Docker / ui (push) Successful in 2m12s
    Release / Gitea Release (push) Successful in 41s
    Stable

    gitea-actions released 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
  • v2.5.64
    All checks were successful
    Release / Test backend (push) Successful in 48s
    Release / Check ui (push) Successful in 44s
    Release / Docker / caddy (push) Successful in 44s
    Release / Docker / backend (push) Successful in 3m22s
    Release / Docker / runner (push) Successful in 2m51s
    Release / Docker / ui (push) Successful in 3m17s
    Release / Gitea Release (push) Successful in 1m12s
    Stable

    gitea-actions released this 2026-04-04 19:57:16 +05:00 | -367 commits to main since this release

    Add 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
    All checks were successful
    Release / Test backend (push) Successful in 42s
    Release / Check ui (push) Successful in 46s
    Release / Docker / caddy (push) Successful in 41s
    Release / Docker / backend (push) Successful in 2m46s
    Release / Docker / runner (push) Successful in 3m12s
    Release / Docker / ui (push) Successful in 2m19s
    Release / Gitea Release (push) Successful in 36s
    Stable

    gitea-actions released this 2026-04-04 19:55:05 +05:00 | -366 commits to main since this release

    PocketTTS 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
    All checks were successful
    Release / Test backend (push) Successful in 37s
    Release / Check ui (push) Successful in 44s
    Release / Docker / caddy (push) Successful in 48s
    Release / Docker / backend (push) Successful in 4m38s
    Release / Docker / runner (push) Successful in 2m49s
    Release / Docker / ui (push) Successful in 2m13s
    Release / Gitea Release (push) Successful in 57s
    Stable

    gitea-actions released this 2026-04-04 19:49:53 +05:00 | -365 commits to main since this release

    Previously 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
    All checks were successful
    Release / Test backend (push) Successful in 39s
    Release / Check ui (push) Successful in 46s
    Release / Docker / caddy (push) Successful in 48s
    Release / Docker / backend (push) Successful in 3m16s
    Release / Docker / runner (push) Successful in 2m53s
    Release / Docker / ui (push) Successful in 2m30s
    Release / Gitea Release (push) Successful in 49s
    Stable

    gitea-actions released 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
  • v2.5.60
    All checks were successful
    Release / Test backend (push) Successful in 37s
    Release / Check ui (push) Successful in 56s
    Release / Docker / caddy (push) Successful in 41s
    Release / Docker / backend (push) Successful in 2m53s
    Release / Docker / runner (push) Successful in 3m13s
    Release / Docker / ui (push) Successful in 2m25s
    Release / Gitea Release (push) Successful in 50s
    Stable

    gitea-actions released this 2026-04-04 18:22:09 +05:00 | -363 commits to main since this release

    Without 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
  • v2.5.59
    All checks were successful
    Release / Test backend (push) Successful in 41s
    Release / Check ui (push) Successful in 43s
    Release / Docker / caddy (push) Successful in 51s
    Release / Docker / backend (push) Successful in 2m45s
    Release / Docker / runner (push) Successful in 2m50s
    Release / Docker / ui (push) Successful in 2m14s
    Release / Gitea Release (push) Successful in 44s
    Stable

    gitea-actions released 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
  • v2.5.58
    All checks were successful
    Release / Test backend (push) Successful in 40s
    Release / Check ui (push) Successful in 45s
    Release / Docker / caddy (push) Successful in 42s
    Release / Docker / backend (push) Successful in 2m55s
    Release / Docker / runner (push) Successful in 3m3s
    Release / Docker / ui (push) Successful in 2m31s
    Release / Gitea Release (push) Successful in 43s
    Stable

    gitea-actions released this 2026-04-04 13:16:10 +05:00 | -361 commits to main since this release

    Adds 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