Releases: richardr1126/openreader
Releases · richardr1126/openreader
Release list
v4.4.0
✨ What's New
⚡ Improved
- Server-Backed User Data (Full Migration): All remaining user state — folders, reading progress/last location, toolbar & list-view preferences, onboarding/first-visit tracking, and recently-opened timestamps — has moved from the browser's local IndexedDB (Dexie/RxDB) to the server database. The server is now the single source of truth for all user data; the browser keeps only an ephemeral cache for document blobs, previews, and audio. (PR #125)
- Faster, More Reliable Media Caching: Document previews, blobs, and TTS audio now use the browser's Cache Storage with versioned keys, priming faster and evicting stale entries more reliably.
- Consistent Loading, Error, and Empty States: A unified query-state layer now drives every list and reader view — a slow or failed folders/preferences fetch no longer blanks or blocks the document list, and a proper skeleton always appears on genuine cold loads.
- Per-Session Data Isolation: Query keys are now scoped per user session, preventing any stale or cross-account data from leaking in after switching accounts in the same browser.
🐛 Fixed
- Loopback Storage Playback: Fixed audio, previews, and downloads failing to load when object storage (S3/SeaweedFS) sits behind a reverse proxy on a loopback address — these now use the existing same-origin fallback route instead of an unreachable direct URL. (PR #127 by @fluffyspace)
- HTML/Markdown Read-Aloud Segmentation: Fixed the HTML/Markdown reader collapsing an entire document into one paragraph for text-to-speech, which merged headings and unrelated paragraphs into run-on segments and broke per-paragraph highlighting. Each block is now read and highlighted individually. (PR #128 by @fluffyspace)
- Corrupted Long-Segment Audio Playback: Fixed some OpenAI-compatible TTS servers (e.g. DeepInfra's Kokoro) streaming long segments as multiple concatenated MP3 chunks with an inaccurate duration header, which caused playback to stop early and skip ahead. These files are now detected and automatically repaired. (PR #129 by @fluffyspace)
⚠️ Upgrading from v4.3.0
- The new database migration (0012, adding
user_folders/user_onboardingtables anddocuments.folder_id/documents.recently_opened_atcolumns) runs automatically on startup for Docker,pnpm dev, andpnpm start. If you've disabled automatic migrations (RUN_DRIZZLE_MIGRATIONS=false) or manage schema changes outside the startup flow, runpnpm migratebefore serving traffic. - Breaking: User-supplied TTS provider API keys (BYOK) are no longer supported. TTS providers must be configured by an admin as shared providers; previously stored per-user TTS credentials will stop working after upgrade.
- This is a hard cutover from the legacy browser-side Dexie/IndexedDB state — no in-browser data migration is performed.
Full Changelog: v4.3.0...v4.4.0
v4.3.0
✨ What's New
🚀 New
- Speech SDK Integration: Added
speech-sdkas a fifth built-in TTS provider backed by@speech-sdk/core. This enables direct connection to providers like ElevenLabs, Cartesia, Deepgram, Google, Inworld, and more using your own API credentials (resolves #117, PR #118 by @btpod). - Enhanced Worker Monitoring: Implemented detailed periodic idle status logging and reason-based activity tracking inside the compute worker to simplify troubleshooting of idle and disconnect states.
⚡ Improved
- Modular Monorepo Architecture: Decoupled the database schema, migrations, and initialization code into a separate
@openreader/databasepackage, and isolated the compute worker (packages/compute-worker) with a defined OpenAPI contract, decoupling PDF parsing/rendering and Whisper alignment from the Next.js API server bundle (PR #122). - Path Resolution & Docker Support: Standardized workspace root resolution for database migrations, bootstrap scripts, and
docstorefile storage, and added unified Docker Compose configurations (local-slim,local-full) and setup guides (resolves #120, PR #122).
🐛 Fixed
- Viewport Resize Highlight Restoration: Restored PDF text highlights dynamically after a viewport resize event, maintaining stable progress and visual positioning (resolves #119, PR #123).
- Logout Session Management: Prevented unwanted anonymous sessions from being generated during the logout redirect flow, protecting user preferences and global settings.
Full Changelog: v4.2.2...v4.3.0
v4.2.2
✨ What's New
🚀 New
- Web Page Article Import: You can now import documents directly from any public webpage using their URL. OpenReader retrieves the page, cleans up headers, ads, and sidebars, and converts the content into clean Markdown (part of PR #116).
- Custom Document Creator: Added a new tab to create clean Markdown or Plain Text documents from scratch directly in the app. This addresses the request to manually add text rather than always uploading a file (resolves #108, PR #116).
- SSRF Prevention & URL Safety: Integrated the Microsoft AntiSSRF library to validate all web imports. The system prevents server-side request forgery (SSRF) and DNS rebinding attacks, ensuring safe imports by manually tracking redirects and blocking access to internal network IP ranges (PR #116).
⚡ Improved
- Modern Modal & Sidebar Layouts: Redesigned the settings panel and document upload flow using a new
SidebarDialogcomponent, offering a unified, responsive design that works beautifully on both desktop and mobile devices (PR #116). - Optimized Text Preview Cards: Redesigned text and markdown file preview cards in the document finder window. They now feature a stylized radial dot pattern, smoother visual fade gradients, and better text alignment to let you preview document snippets at a glance (PR #116).
- Smart Worker Connection Handling: The compute worker's server-sent event (SSE) stream now advises client connections to back off before reconnecting. When the worker is disconnected or goes idle, this delay prevents the client from immediately waking up the server, allowing the compute environment to sleep efficiently (PR #115).
- Optimized Default Reader Width: Changed the default HTML reader page layout width to 50% instead of 100% to significantly improve readability out of the box (PR #116).
🐛 Fixed
- Uploader Click bug: Fixed a bug introduced with the new document uploader menu where the "Click to select files" box in the "Upload Files" tab did not register mouse clicks.
- Docker Webpack Build compilation: Resolved webpack compilation failures in Docker environments by dynamically excluding the native
canvaspackage on the server and fallback-aliasing to@napi-rs/canvas. - Speech Generation Bullet Marker Cleanup: Added a clean-up pattern that strips bullet points, asterisks, list markers, and other non-spoken symbols (e.g.
•,▪,★) from input text before sending it to speech engines. This prevents strict TTS servers (such as Supertonic) from failing due to unsupported character errors (resolves #113, PR #114). - Replicate Audio Output SSRF Prevention: Guarded speech generation against SSRF vulnerabilities by ensuring that audio files generated by Replicate models are strictly retrieved from
replicate.deliveryand its subdomains.
Full Changelog: v4.2.1...v4.2.2
v4.2.1
🚀 New
- Supertonic Local Speech Integration: Added full compatibility and a step-by-step configuration guide for connecting Supertonic (a fast, local, on-device voice engine) to OpenReader.
- WAV & OGG Audio Support: OpenReader now automatically detects and converts WAV and OGG audio from custom local voice servers into standard MP3 format. This guarantees that track durations are calculated accurately, making audio playback continuous and progress tracking reliable.
⚡ Improved
- Seamless EPUB Playback & Page Transitions: Overhauled how EPUB files are processed during Text-to-Speech playback. Text is now planned chapter-wide, meaning sentences that cross page boundaries read continuously without stuttering, repeating, or pausing.
- Smarter Voice Auto-Discovery: Custom voice servers are now scanned across multiple standard routes to automatically populate available voice lists in your settings. If the server does not publish its own voice list, OpenReader automatically falls back to standard voice presets so playback is always functional.
- More Robust Custom Server Support: Setting up third-party or local speech engines is easier. OpenReader now supports servers requiring no API key and automatically bypasses common connection errors (such as unsupported request parameters) with silent fallbacks.
- Smoother Word Highlighting: Highlight tracking is more responsive and will no longer freeze during silences between sentences. Highlights also automatically adapt and align when you resize your browser window or change reader layouts.
🐛 Fixed
- Improved Authentication Security: Stopped guest session creation on login and signup pages, preventing session leaks and database clutter.
- Compute Worker Docker Builds: Enabled proper dependency resolution during compute worker builds when using private packages or registries.
- Playback Cancel Reliability: Resolved a rare race condition that could cause local voice server requests to hang when playback was canceled immediately after starting.
Full Changelog: v4.2.0...v4.2.1
v4.2.0
✨ What's New
🚀 New
- Multilingual Reader & Speech Support:
- Added full support for reading multilingual documents in PDF, EPUB, and HTML viewers, passing the document language down to the segmenters and text tokenizers.
- Implemented automatic EPUB metadata language detection.
- Added warning alerts in the reader UI and audiobook creation panel if the document language mismatches the selected voice's language.
- Integrated
Intl.Segmenterfor word/sentence tokenization, allowing proper parsing of non-space-separated languages (e.g. Japanese, Chinese). - Forwarded detected/selected language options dynamically to capable TTS providers (OpenAI, Replicate).
- Background Tasks Engine: A database-backed task runner featuring atomic claims/leases, execution tracking, in-process self-hosted loops, and daily Vercel cron route endpoints (
/api/admin/tasks/tick). - Admin Tasks UI: An administrative control panel in Settings to view background tasks, trigger runs manually, and configure execution intervals.
- Document Blob Leasing & Mutation Locks: A concurrency locking mechanism using S3/object storage leases with exponential backoff and jitter to prevent race conditions during upload finalization.
⚡ Improved
- User Data Management (Export & Claiming):
- Expanded data exporting to package and download new metadata types (job events, document settings, auth sessions, linked accounts, and TTS segment cache tables) and download generated TTS segment audio files from S3/object storage.
- Upgraded guest-to-account claiming to copy S3 synthesized speech assets and document settings to the new account.
- Preferences Inheritance & Syncing: Decoupled preference architecture where users can inherit global admin configurations, synced automatically between local Dexie and server-side profiles.
- Replicate Parameter Mapping: Graph-walking OpenAPI parser that dynamically resolves voice and language parameter inputs for custom Replicate models (Kokoro, Gemini, Minimax, Qwen, Inworld) with LRU caching.
🐛 Fixed
- Preview generation: fix document preview generation issue #106
- Highlighting Performance: Added a fast linear scan optimizer that resolves exact highlight matches instantly, preventing UI thread freezes on large documents.
- TTS API Gateway Fallback: Automatically catches 400/422 errors from OpenAI-compatible gateways that reject custom
languageparameters, retrying and caching the request without the parameter. - User Storage Deletion Cleanup: Overhauled account deletion to purge user-scoped S3 asset prefixes (audiobooks, segments, and temp uploads) before database rows cascade-delete, preventing orphaned storage files.
⚠️ Upgrading from v4.1.2
- If using self-hosted nodes, the task scheduler starts in-process automatically; Vercel deployments use a daily cron route (
/api/admin/tasks/tick).
Full Changelog: v4.1.2...v4.2.0
v4.1.2
✨ What's New
🐳 Document previews fixed in Docker
- Fixed document preview/thumbnail generation in Docker deployments, which had stopped working because the PDF engine couldn't find its bundled fonts at runtime. Previews now render again out of the box.
⬆️ Smoother, more reliable uploads
- Rebuilt the document upload flow to be more reliable across all file types.
- Word document (.docx) uploads now convert to PDF as part of a single upload step, with a timeout so a stuck conversion fails cleanly instead of hanging.
- Avoided redundant work by reusing already-converted documents.
🖱️ Better drag-and-drop
- Dragging documents (into folders and between views) now shows a proper drag preview in both gallery and list layouts.
🧩 More dependable PDF parsing
- Moved PDF parsing and playback-readiness tracking to the background worker, with versioning so documents are automatically re-parsed when the parser improves.
- Prevented duplicate parse jobs from being queued for the same document.
🔊 Reader fix
- Text-to-speech playback and text selection now reset immediately when you switch documents, instead of carrying over from the previous one.
Full Changelog: v4.1.1...v4.1.2
v4.1.1
✨ What's New
🛠️ Runtime, Recovery & Cleanup
- 🐳 Improved runtime packaging so deployed images include the embedded migration tools, compute worker, and more reliable PDF font assets they need at startup.
- 🔄 Added recovery for legacy PDF parse records missing operation IDs so older pending or running documents can reconnect to the right operation.
- 🧹 Removed the risky legacy local-file deletion path and now clean up claimed filesystem sources through the user-claim flow instead.
Full Changelog: v4.1.0...v4.1.1
v4.1.0
✨ What's New
🧠 More resilient PDF parsing
- Improved layout parsing for PDFs with non-zero viewport origins, decorative initials, overlapping glyphs, and malformed model outputs.
- Added stale in-flight job recovery so worker restarts fail or recover stuck
pdf_layoutandwhisper_alignoperations instead of leaving documents hanging.
🖥️ Clearer reader feedback
- Added animated PDF layout scan progress with an explicit "parse halted" state when parsing fails.
- Refined the reader loader and range slider UI for cleaner progress feedback and more precise controls.
Full Changelog: v4.0.3...v4.1.0
v4.0.3
✨ What's New
🐳 Docker Fix by @AlexErrant in #97.
- Fixed a breaking container startup crash by switching the app image from Alpine to Debian slim so
onnxruntime-nodehas glibc. - Changed compute worker model prewarming defaults to avoid downloading ONNX models during startup.
Full Changelog: v4.0.2...v4.0.3
v4.0.2
✨ What's New
🐜 Settings & Parse State Fixes
- Fixed major bug for worker-backed PDF parse state persistence and stale-state healing.
- Removed legacy runtime flag and its related admin/settings UI.
Full Changelog: v4.0.1...v4.0.2