Skip to content

Releases: richardr1126/openreader

v4.4.0

Choose a tag to compare

@richardr1126 richardr1126 released this 03 Jul 22:42

✨ 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_onboarding tables and documents.folder_id/documents.recently_opened_at columns) runs automatically on startup for Docker, pnpm dev, and pnpm start. If you've disabled automatic migrations (RUN_DRIZZLE_MIGRATIONS=false) or manage schema changes outside the startup flow, run pnpm migrate before 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

Choose a tag to compare

@richardr1126 richardr1126 released this 13 Jun 21:32

✨ What's New

🚀 New

  • Speech SDK Integration: Added speech-sdk as 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/database package, 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 docstore file 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

Choose a tag to compare

@richardr1126 richardr1126 released this 10 Jun 20:37

✨ 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 SidebarDialog component, 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 canvas package 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.delivery and its subdomains.

Full Changelog: v4.2.1...v4.2.2

v4.2.1

Choose a tag to compare

@richardr1126 richardr1126 released this 10 Jun 00:01

🚀 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

Choose a tag to compare

@richardr1126 richardr1126 released this 07 Jun 20:11

✨ 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.Segmenter for 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 language parameters, 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

Choose a tag to compare

@richardr1126 richardr1126 released this 05 Jun 04:07

✨ 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

Choose a tag to compare

@richardr1126 richardr1126 released this 03 Jun 20:54

✨ 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

Choose a tag to compare

@richardr1126 richardr1126 released this 03 Jun 17:11

✨ 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_layout and whisper_align operations 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

Choose a tag to compare

@richardr1126 richardr1126 released this 03 Jun 03:07

✨ 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-node has 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

Choose a tag to compare

@richardr1126 richardr1126 released this 02 Jun 02:42

✨ 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