✨ What's New
🚀 New
- Single sign-on with any OIDC provider: Sign in through a self-hosted identity provider such as Pocket ID, Authelia, Authentik, or Keycloak. Set
OIDC_CLIENT_ID,OIDC_CLIENT_SECRET, andOIDC_DISCOVERY_URLand a sign-in button appears (name it withOIDC_PROVIDER_NAME). Discovery must usehttps://(plainhttp://is accepted only for localhost). Someone who already has an email/password account is linked to it automatically when both the provider and the local email are verified. Otherwise they are told to sign in with their password. See the sign-in guide. Thanks to @matthewbrahms for the contribution. (PR #131) - Audiobook export that you can stop, resume, and download by chapter: Exports no longer stop silently after 30 minutes or when a worker restarts. Interrupted, failed, stopped, and usage-limited runs resume from audio that was already generated. The export dialog now has Stop, Resume, and Retry skipped actions, a per-chapter list with durations, and per-chapter downloads that work while the rest of the book is still generating. Error messages now say what to do next. (resolves #148, PR #149)
- Admin System check: A new Settings → Admin → System tab checks your deployment and explains how to fix each problem. It covers the worker connection, the public worker URL browsers use for audio, and secrets that are still example values. (PR #152)
- Startup configuration check: OpenReader now reports every configuration problem at once when it starts, instead of failing on the first one. It also warns about likely playback problems, such as a worker URL browsers can't reach, https pages loading http audio, and published example secrets on a non-local
BASE_URL. (PR #152) - OpenReader for iOS beta: A dismissible banner in the library and a section on the landing page link to the TestFlight beta for the on-device iOS app.
⚡ Improved
- Changing speed, voice, language, or segmentation no longer reloads the reader: The open document stays on screen while playback is re-planned in the background. A small status shows progress, and playback resumes once the new plan is ready. Before, the reader was replaced by the loading screen.
- Audiobook generation no longer blocks the reader's playback: Whole-book generation now has its own queue and usage limit (
tts_playback_document), separate from interactive playback. Several exports queue behind each other across worker replicas. Saved limit policies pick up the new limit automatically. - Faster recovery after a worker restart: A resumed export takes over the leases and provider slots left by the killed run instead of waiting for them to expire. Provider slots now use a short renewed lease. If the worker is unreachable, the app reports a retryable error instead of an opaque failure. (PR #151)
- Export progress survives background tabs and network drops: Progress reconnects after the tab returns or the device comes back online, instead of freezing until you reload. (PR #150)
- More robust generation: Waiting for a provider slot no longer uses up retry attempts. Timed-out segments retry, and long document runs get a longer segment timeout. Skipped (silenced) segments can be retried. Repeated clicks on Start now share one export run. The export dialog also no longer shows an empty cancel button.
- Library multi-select: Documents have select checkboxes and a floating action bar with the selected count, Select all, Move, and Delete. Each document also has an actions menu. Cmd/Ctrl+A selects everything visible and Esc clears the selection.
- Finder toolbar on phones: The library toolbar is a single compact row, with search and the view/sort options in a popover.
- Clearer settings: Reader, export, and admin settings are grouped into cards with shorter copy and quieter notes about where each value comes from. Selected options in dropdowns stay legible.
- Embedded-worker secrets: When you use the built-in worker,
TTS_PLAYBACK_TOKEN_SECRETis derived fromAUTH_SECRETif you leave it unset, so you no longer have to generate one. An explicit value still wins, and external workers still need the shared value. - Clearer v4 upgrade guide and docs: The upgrade guide has been restructured, and the environment-variable and local-development docs have been rewritten to match.
- Docker image: The embedded worker now listens on all interfaces, so the published worker port (
8081) is reachable for audio playback. (PR #153)
🐛 Fixed
- Operations stuck on "Opening document": A late heartbeat could reopen an operation that had already finished, leaving PDF parsing or reading-plan readers waiting forever. This happened most often on slow CPUs. Progress writes now never overwrite a finished state. (PR #149)
- Stop racing Resume: Stopping an export can no longer cancel a newer run that was started at the same moment. (PR #149)
- Chapter downloads in Safari: Chapter files now download correctly in WebKit. (PR #149)
- Malformed chapter requests: Invalid chapter numbers are rejected with an error instead of quietly building chapter 1. (PR #149)
- Idle worker kept awake: An idle compute worker no longer polls the app for policy updates, so hosts that scale to zero (such as Railway) can sleep. The policy is refreshed when the worker wakes up.
- Library folder and selection glitches: Creating a folder from a selection no longer snaps the sidebar back to the previous filter. Esc now clears the selection even while a dialog is fading out. (PR #153)
- Docker playback: Fixed audio failing to load in a container because the embedded worker was bound to loopback. The System check hint now mentions this. (PR #153)
⚠️ Upgrading from v5.0.0
- There are no database migrations.
- If you run an external compute worker, update it to the
v5.1.0image together with the app. Audiobook export now uses a newjobs.tts_playback_documentqueue that the updated worker creates when it starts, and an older worker won't pick up exports. - Startup now exits with a full list of problems if
AUTH_SECRETorBASE_URLis missing, or if an external worker is missing its tokens. Other findings, such as an unusedADMIN_EMAILS, are logged as warnings and don't stop startup. - If you set
TTS_PLAYBACK_TOKEN_SECRETexplicitly, keep it: it keys the audio cache, and changing it makes cached audio regenerate. OIDC is opt-in and needs no action if you don't use it.
Full Changelog: v5.0.0...v5.1.0