openreader is a free, open source publishing project written in TypeScript and released under MIT. It has 553 GitHub stars, 77 forks and 0 open issues, and was last pushed 40 hours ago. On this registry it ranks #50 of 54 tracked projects in Publishing, with 5 head-to-head comparisons available. It gained 31 stars over the last 30 tracked days.

What is openreader?

OpenReader is an open-source, self-hostable read-along document reader server that plays EPUB, PDF, DOCX, TXT, and Markdown documents as narrated audio with synchronized word-by-word highlighting and audiobook export, and it is built for self-hosters, tinkerers, and teams that want that capability without depending on a closed hosted service.

What it is

OpenReader is a Next.js and TypeScript application that renders documents and narrates them, keeping a single durable document timeline for audio, highlighting, and export. It was previously named OpenReader-WebUI, is licensed under MIT, and ships under the openreader repository with roughly 509 stars and 70 forks. The project lives in the TypeScript and Next.js ecosystem and depends on the surrounding OpenAI-compatible TTS ecosystem — both self-hosted servers such as Kokoro-FastAPI, KittenTTS-FastAPI, and Orpheus-FastAPI, and cloud APIs such as OpenAI, Replicate, and DeepInfra. A compute worker control plane, backed by NATS JetStream, carries the alignment and generation work.

The concrete problem it solves is turning a static document into a single seekable audio timeline that stays consistent across playback, reloads, and exports. Rather than pairing a separate text extractor with a separate TTS client and stitching the results together by hand, OpenReader keeps parsing, alignment, caching, and export inside one server. Its layout-aware parsing keeps PDF highlighting aligned to real document geometry, and its cache is reused across seeks, reloads, and audiobook export so audio is not regenerated per listener action.

Key capabilities

  • Progressive background generation and playback: listening can start as soon as the first segment is ready while the worker continues generating ahead into one durable document timeline.
  • Layout-aware PDF parsing with PP-DocLayoutV3 (ONNX), covering structured block detection, cross-page stitching, and geometry-based highlighting.
  • Word-by-word highlighting through ONNX Whisper alignment, driven by the compute worker control plane over NATS JetStream.
  • Five readable formats — EPUB, PDF, TXT, MD, and worker-converted DOCX — with generated PDF and EPUB library previews.
  • Multi-provider TTS against self-hosted OpenAI-compatible servers (Kokoro-FastAPI, KittenTTS-FastAPI, Orpheus-FastAPI) or cloud APIs (OpenAI, Replicate, DeepInfra).
  • Audiobook export in M4B or MP3, assembled by the worker from the same playback cache.
  • Flexible backend: embedded SeaweedFS or S3-compatible storage, SQLite or Postgres, server library import, and device sync.
  • Self-host friendly packaging with Docker images for amd64 and arm64, built-in auth and session support, and automatic startup migrations.

Who uses it and how

  • Individual self-hosters running the Docker Compose stack on amd64 or arm64 hardware and pointing it at a local TTS provider.
  • Readers who import a book library once on the server and rely on device sync to keep progress aligned between a desktop and a phone.
  • Operators who split the web tier from the compute worker, deploying the front end on Vercel and running the worker separately against NATS JetStream.
  • Multilingual readers who set a document language for language-aware narration and highlighting, with available languages bounded by the configured TTS provider and voice.
  • Listeners who convert documents into M4B or MP3 audiobooks for offline use rather than streaming from the interface.

Getting started

The documented entry points are Docker Compose for a self-hosted run and a Vercel deployment for the front end with an external compute worker, all described at docs.openreader.richardr.dev alongside configuration guides for auth, database, object storage, and TTS providers.

How it compares

No list of paid products that OpenReader replaces is provided in these facts, and no comparable read-along reader is named among them. On the available record it stands alone in this registry.

When to use it — and when not to

A self-hoster must operate more than one process: the web application, a compute worker, a NATS JetStream path between them, a SQLite or Postgres database, and embedded SeaweedFS or S3-compatible object storage, plus whatever TTS provider is chosen. Anyone unwilling to run that set of services, or to trust document text to OpenAI, Replicate, or DeepInfra, should either stay on a fully local provider such as Kokoro-FastAPI or pick a simpler single-process reader. Weaknesses in the visible record are limited detail in the README excerpt itself and DOCX support that depends on worker conversion, so the full documentation should be checked before committing to a deployment.

project readme (upstream, from github) — read inline

GitHub Release License Docs Playwright Tests Docs Check

GitHub Stars GitHub Forks Discussions

📄🔊 OpenReader

OpenReader is an open-source, self-host-friendly text-to-speech document reader built with Next.js for EPUB, PDF, TXT, MD, and DOCX with multilingual, synchronized read-along playback.

Previously named OpenReader-WebUI.

Get started in the docs.

✨ Highlights

  • ▶️ Progressive background generation and playback — begin listening as soon as the first segment is ready while the worker continues generating ahead into one durable document timeline; cached audio is reused across seeks, reloads, and exports.
  • 🧱 Layout-aware PDF parsing with PP-DocLayoutV3 (ONNX) — structured block detection, cross-page stitching, and geometry-based highlighting for precise read-along sync.
  • ⏱️ Word-by-word highlighting via ONNX Whisper alignment through the compute worker control plane (NATS JetStream-backed).
  • 📚 Five readable formats — synchronized EPUB, PDF, TXT, MD, and worker-converted DOCX, with generated PDF/EPUB library previews.
  • 🎯 Multi-provider TTS — self-hosted OpenAI-compatible servers (Kokoro-FastAPI, KittenTTS-FastAPI, Orpheus-FastAPI) or cloud APIs (OpenAI, Replicate, DeepInfra).
  • 🌐 Multilingual support — choose a document language for language-aware narration and highlighting. Available languages depend on the configured TTS provider and voice.
  • 🎧 Audiobook export in M4B or MP3, assembled by the worker from the same playback cache.
  • 🗂️ Flexible backend — embedded SeaweedFS or S3-compatible storage, SQLite or Postgres, server library import, and device sync.
  • 🐳 Self-host friendly — Docker (amd64/arm64), built-in auth/session support, and automatic startup migrations.

🚀 Start Here

Goal Link
Run with Docker Compose Docker Compose
Deploy on Vercel Vercel Deployment
Deploy external compute worker Compute Worker (NATS JetStream)
Develop locally Local Development
Configure auth Auth
Configure SQL database Database and Migrations
Configure object storage Object / Blob Storage
Configure TTS providers TTS Providers
Run Kokoro locally Kokoro-FastAPI
Run KittenTTS locally KittenTTS-FastAPI
Get support or contribute Support and Contributing

🧭 Community

📜 License

MIT. See LICENSE.

Frequently asked questions

Is openreader free to use?

openreader is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does openreader do?

An open-source read-along document reader server with high-quality TTS options, synchronized highlighting, and audiobook export for EPUB, PDF, DOCX, TXT, and MD

What is openreader written in?

openreader is primarily written in TypeScript. Its source is publicly available at https://github.com/richardr1126/openreader, and it has 553 GitHub stars.