✨ What's New
🚀 New
- OpenReader Desktop (first release): OpenReader now ships as a desktop app for macOS, Windows and Linux. It runs the same app, compute worker, storage and database as the Docker image entirely on your computer, with no account, sign-in, cookie banner or analytics. Opening EPUB and PDF files from your file manager sends them straight to the library. Get the right installer for your computer from the download page, or pick one from the assets below (PR #170, PR #189):
- macOS (Apple silicon):
OpenReader-Desktop-5.3.0-arm64.dmg, signed and notarized by Apple. There is no Intel Mac build. - Windows (x64 and arm64):
.exeinstallers. They are not code-signed yet, so Windows SmartScreen may ask you to confirm with More info → Run anyway. - Linux (x64 and arm64):
.AppImageand.deb. - See the desktop privacy policy for what stays on your computer and what the app contacts.
- macOS (Apple silicon):
- Desktop automatic updates: The desktop app checks GitHub Releases shortly after it starts and every 4 hours, downloads new versions in the background, and offers Restart to update in the library sidebar, the Settings sidebar and the app menu. You can check by hand from Settings or the menu, or turn background updates off in Settings → Instance → Features. Updates start working from this release onward (PR #188).
- On-device Kokoro voices: A new built-in Local voices provider runs the Kokoro-82M voice model inside the compute worker, so speech works without an API key or a separate voice server. Download the voices once from the desktop app's first-run step or from Settings → Admin → Providers → Local voices, with live progress, cancel and remove. It is available on Docker installs too (PR #170).
- Per-book voice and speed: The reader's voice panel now sets the voice and speed for the current book only, and Use default returns it to your Model & Voice settings (PR #171).
- Keyboard playback shortcuts: Space plays and pauses, ←/→ skip, and
</>change speed in every reader, including inside EPUBs. They stay out of the way while you type or use a menu, and you can turn them off in Reader Settings → Playback (PR #173, PR #174). - Audio timeline before Play: The player shows cached ranges, the total length (marked
~while estimated) and your saved position before you press Play, so you can scrub to where you want to start (PR #175). - About section in Settings: Lists the open-source licences of everything OpenReader ships, including bundled software, voices and models, with a filter (PR #170).
⚡ Improved
- Website: The landing page has a Desktop section, an OS-aware Download button and the project's GitHub star count, and the Apple app section now covers iPhone, iPad and Mac (PR #189).
- Redesigned Settings: Settings uses grouped, iOS-style lists with icons. Voice is split into Providers (shared providers, for admins) and Model & Voice, and explanations moved into ⓘ tips so each row fits on one line. Model & Voice saves everything in one request with a "Saving…" state and uses the same voice list as the reader, with a play button to preview each voice. Model & Voice and the admin pages share one save bar (PR #171, PR #172).
- Single-row reader header: The second toolbar row is gone. Contents and Find in book are one panel with search at the top, Bookmarks and Zoom moved into the ⋯ menu, and the page pager floats above the player. Icon buttons have tooltips that show their keyboard shortcut and, for combined controls, what is inside them (PR #187).
- Accessibility: Added a skip-to-content link, visible keyboard focus, keyboard-resizable library sidebar, focus that moves into and back out of reader panels, Escape to close them, arrow and Home/End keys on the playback slider, and a screen-reader status for Playing, Loading and Paused (PR #173).
- Language detection for speech: With Language set to Automatic, playback, voice previews and audiobook export now use the document's detected language instead of falling back to English, so word highlighting also works for non-English books. PDFs without language metadata are detected when opened, German and Turkish were added to Reader Settings, and voice-language warnings now agree across the player, settings and export (closes #176, PR #183). Thanks to @benginN for reporting this with a detailed diagnosis, measurements and a proposed fix.
- Faster seeks: Skipping within audio that is already downloaded reuses it instead of reloading, cached audio starts streaming sooner, and a seek away from the current spot stops generation that is no longer needed so the new position is generated first (PR #181, PR #185).
- Lighter playback updates: The timeline now updates from the live progress stream and fetches only the part of the document around your position (PR #186).
- SeaweedFS 4.48 and LGPL ffmpeg: Docker images now use SeaweedFS 4.48 and a pinned LGPL ffmpeg build. Existing embedded-storage volumes are migrated automatically on first start so every stored document stays readable (PR #170).
🐛 Fixed
- Failed sentences no longer stall playback: A sentence the voice service fails to generate plays as a short silence and playback continues (PR #186).
- Seeking while loading: Scrubbing or skipping while playback is still preparing now starts at the newest position, keeps the timeline visible, and no longer times out while audio is still arriving (PR #177, PR #178, PR #179).
- Loading indicator: The play button's loading ring keeps moving for the whole wait, and respects reduced-motion settings (PR #181).
- Slider stuck after a click: Clicking the playback slider while playing no longer leaves the playhead stuck at the click position (PR #184).
- Voice saved under the wrong provider: Picking a voice together with a new provider or model saves it under the new one (PR #172).
- Admin default provider: An env-seeded OpenAI shared provider no longer shows up as the admin default provider after saving (PR #175).
- Embedded storage port conflicts: When embedded SeaweedFS has to move off ports that are already taken (for example with the desktop app running beside a Docker or dev stack), it now keeps its internal ports paired, so it no longer logs connection errors every few seconds. Data directories already affected are repaired on the next start (PR #190).
- Reader header while preparing: Header controls stay in place, shown disabled, while a document prepares.
- Dark-theme dialogs: Modal backdrops are darker in dark themes.
Full Changelog: v5.2.1...v5.3.0