No description
Find a file
Claude b65ebd1d51
feat(ui): add table of contents for chapter navigation
Added table of contents modal for documents with multiple chapters:

New Features:
- TableOfContents component with modal dialog
- List icon button in chapter navigation bar
- Click any chapter to jump directly to it
- Current chapter highlighted in the list
- Scrollable list for books with many chapters
- Clean modal UI with transitions

Benefits:
- Quick navigation for large documents with many chapters
- Better UX for series/textbooks with 10+ chapters
- No need to click Previous/Next repeatedly
- Shows all chapter titles at a glance

Technical Details:
- Uses Headless UI Dialog for accessibility
- Integrates with existing goToChapter function
- Matches existing design system and styling
- Added to HTMLViewer chapter navigation bar
2026-01-11 05:16:57 +00:00
.github feat(epub): Add EPUB text highlighting for the current TTS sentence with a new configuration option 2025-11-18 12:31:07 -07:00
examples feat(tts): add smart sentence continuation 2025-11-14 12:00:03 -07:00
public add DOCX support (requires libreoffice) + upload test 2025-03-04 22:47:37 -07:00
src feat(ui): add table of contents for chapter navigation 2026-01-11 05:16:57 +00:00
tests refactor(ui): make UI labels and descriptions more concise 2025-11-22 15:27:04 -07:00
.gitattributes Fix check mark in SettingsModal 2025-02-11 21:31:11 -07:00
.gitignore Add editable page number in PDF navigator view, to make it much easier to jump to specific pages 2025-06-20 08:32:53 +02:00
Dockerfile feat(ui): implement better document grid with file previews 2025-12-12 13:13:49 -07:00
empty-module.ts First push 2025-01-18 04:58:57 -07:00
eslint.config.mjs First push 2025-01-18 04:58:57 -07:00
LICENSE Initial commit 2025-01-18 00:36:14 -07:00
next.config.ts Change go to page + add Vercel Analytics integration 2025-06-30 12:10:56 -06:00
package.json feat(ui): implement better document grid with file previews 2025-12-12 13:13:49 -07:00
playwright.config.ts refactor(config): centralize app config in Dexie 2025-11-15 17:29:56 -07:00
pnpm-lock.yaml feat(ui): implement better document grid with file previews 2025-12-12 13:13:49 -07:00
postcss.config.mjs First push 2025-01-18 04:58:57 -07:00
README.md docs: update README with new features and improvements 2026-01-11 05:10:43 +00:00
tailwind.config.ts fix(tailwind): fix footer layout and tailwind config 2025-11-22 16:32:03 -07:00
template.env feat(whisper): integrate binary with build and docs 2025-11-22 00:25:13 -07:00
tsconfig.json First push 2025-01-18 04:58:57 -07:00

GitHub Stars GitHub Forks GitHub Watchers GitHub Issues GitHub Last Commit GitHub Release

Discussions

📄🔊 OpenReader WebUI

OpenReader WebUI is an open source text to speech document reader web app built using Next.js, offering a TTS read along experience with narration for EPUB, PDF, TXT, MD, and DOCX documents. It supports multiple TTS providers including OpenAI, Deepinfra, and custom OpenAI-compatible endpoints like Kokoro-FastAPI and Orpheus-FastAPI

  • 🎯 (New) Multi-Provider TTS Support
    • Kokoro-FastAPI: Supporting multi-voice combinations (like af_heart+af_bella)
    • Orpheus-FastAPI
    • Custom OpenAI-compatible: Any TTS API with /v1/audio/voices and /v1/audio/speech endpoints
    • Cloud TTS Providers (requiring API keys)
      • Deepinfra: Kokoro-82M + models with support for cloned voices and more
      • OpenAI API (): tts-1, tts-1-hd, and gpt-4o-mini-tts w/ instructions
  • 📖 (Updated) Read Along Experience providing real-time text highlighting during playback (PDF/EPUB)
    • (New) Word-by-word highlighting uses word-by-word timestamps generated server-side with whisper.cpp (optional)
  • 🧠 (New) Smart Sentence-Aware Narration merges sentences across pages/chapters for smoother TTS
  • 📚 (New) Smart Chapter Detection & Pagination automatically splits large text files into chapters
    • Detects natural chapter markers (Chapter 1, Part I, Section 1, etc.)
    • Size-based splitting for files without chapters (~50KB chunks)
    • Seamless TTS auto-advance through chapters during playback
    • Chapter navigation with Previous/Next controls
  • 🎧 (New) Reliable Audiobook Export in m4b/mp3, with resumable, chapter-based export and regeneration
    • Supports EPUB, PDF, and HTML/text documents
    • Accessible via gear icon in document viewer
  • 🚀 (Updated) Optimized Next.js TTS Proxy with enhanced audio caching and cross-browser compatibility
    • Aggressive preloading (5 sentences ahead) for seamless playback
    • 50-sentence LRU cache for efficient memory usage
    • Blob URL audio for improved Firefox compatibility
    • Seamless error recovery (skips problematic sentences automatically)
  • 💾 Local-First Architecture stores documents and more in-browser with Dexie.js
  • 🛜 Optional Server-side documents using backend /docstore for all users
  • 🎨 Customizable Experience
    • 🎨 Multiple app theme options
    • ⚙️ Various TTS and document handling settings
    • And more ...

🐳 Docker Quick Start

Prerequisites

  • Recent version of Docker installed on your machine
  • A TTS API server (Kokoro-FastAPI, Orpheus-FastAPI, Deepinfra, OpenAI, etc.) running and accessible

Note: If you have good hardware, you can run Kokoro-FastAPI with Docker locally (see below).

1. 🐳 Start the Docker container:

docker run --name openreader-webui \
  --restart unless-stopped \
  -p 3003:3003 \
  -v openreader_docstore:/app/docstore \
  ghcr.io/richardr1126/openreader-webui:latest

(Optionally): Set the TTS API_BASE URL and/or API_KEY to be default for all devices

docker run --name openreader-webui \
  --restart unless-stopped \
  -e API_KEY=none \
  -e API_BASE=http://host.docker.internal:8880/v1 \
  -p 3003:3003 \
  -v openreader_docstore:/app/docstore \
  ghcr.io/richardr1126/openreader-webui:latest

Note: Requesting audio from the TTS API happens on the Next.js server not the client. So the base URL for the TTS API should be accessible and relative to the Next.js server. If it is in a Docker you may need to use host.docker.internal to access the host machine, instead of localhost.

Visit http://localhost:3003 to run the app and set your settings.

Note: The openreader_docstore volume is used to store server-side documents. You can mount a local directory instead. Or remove it if you don't need server-side documents.

2. ⚙️ Configure the app settings in the UI:

  • Set the TTS Provider and Model in the Settings modal
  • Set the TTS API Base URL and API Key if needed (more secure to set in env vars)
  • Select your model's voice from the dropdown (voices try to be fetched from TTS Provider API)

3. ⬆️ Updating Docker Image

docker stop openreader-webui && \
docker rm openreader-webui && \
docker pull ghcr.io/richardr1126/openreader-webui:latest

🗣️ Local Kokoro-FastAPI Quick-start (CPU or GPU)

You can run the Kokoro TTS API server directly with Docker. We are not responsible for issues with Kokoro-FastAPI. For best performance, use an NVIDIA GPU (for GPU version) or Apple Silicon (for CPU version).

Docker CPU

docker run -d \
  --name kokoro-tts \
  --restart unless-stopped \
  -p 8880:8880 \
  -e ONNX_NUM_THREADS=8 \
  -e ONNX_INTER_OP_THREADS=4 \
  -e ONNX_EXECUTION_MODE=parallel \
  -e ONNX_OPTIMIZATION_LEVEL=all \
  -e ONNX_MEMORY_PATTERN=true \
  -e ONNX_ARENA_EXTEND_STRATEGY=kNextPowerOfTwo \
  -e API_LOG_LEVEL=DEBUG \
  ghcr.io/remsky/kokoro-fastapi-cpu:v0.2.4

Adjust environment variables as needed for your hardware and use case.

Docker GPU

docker run -d \
  --name kokoro-tts \
  --gpus all \
  --user 1001:1001 \
  --restart unless-stopped \
  -p 8880:8880 \
  -e USE_GPU=true \
  -e PYTHONUNBUFFERED=1 \
  -e API_LOG_LEVEL=DEBUG \
  ghcr.io/remsky/kokoro-fastapi-gpu:v0.2.4

Adjust environment variables as needed for your hardware and use case.

⚠️ Important Notes:

  • For best results, set the -e API_BASE= for OpenReader's Docker to http://kokoro-tts:8880/v1
  • For issues or support, see the Kokoro-FastAPI repository.
  • The GPU version requires NVIDIA Docker support and works best with NVIDIA GPUs. The CPU version works best on Apple Silicon or modern x86 CPUs.

Local Development Installation

Prerequisites

  • Node.js (recommended: use nvm)

  • pnpm (recommended) or npm

    npm install -g pnpm
    
  • A TTS API server (Kokoro-FastAPI, Orpheus-FastAPI, Deepinfra, OpenAI, etc.) running and accessible Optionally required for different features:

  • FFmpeg (required for audiobook m4b creation only)

    brew install ffmpeg
    
  • libreoffice (required for DOCX files)

    brew install libreoffice
    
  • whisper.cpp (optional, required for word-by-word highlighting)

    # clone and build whisper.cpp (no model download needed  OpenReader handles that)
    git clone https://github.com/ggml-org/whisper.cpp.git
    cd whisper.cpp
    cmake -B build
    cmake --build build -j --config Release
    
    # point OpenReader to the compiled whisper-cli binary
    echo WHISPER_CPP_BIN=\"$(pwd)/build/bin/whisper-cli\"
    

    Note: The WHISPER_CPP_BIN path should be set in your .env file for OpenReader to use word-by-word highlighting features.

Steps

  1. Clone the repository:

    git clone https://github.com/richardr1126/OpenReader-WebUI.git
    cd OpenReader-WebUI
    
  2. Install dependencies:

    With pnpm (recommended):

    pnpm i # or npm i
    
  3. Configure the environment:

    cp template.env .env
    # Edit .env with your configuration settings
    

    Note: The base URL for the TTS API should be accessible and relative to the Next.js server

  4. Start the development server:

    With pnpm (recommended):

    pnpm dev # or npm run dev
    

    or build and run the production server:

    With pnpm:

    pnpm build # or npm run build
    pnpm start # or npm start
    

    Visit http://localhost:3003 to run the app.

💡 Feature requests

For feature requests or ideas you have for the project, please use the Discussions tab.

🙋‍♂️ Support and issues

If you encounter issues, please open an issue on GitHub following the template (which is very light).

👥 Contributing

Contributions are welcome! Fork the repository and submit a pull request with your changes.

❤️ Acknowledgements

This project would not be possible without standing on the shoulders of these giants:

Docker Supported Architectures

  • linux/amd64 (x86_64)
  • linux/arm64 (Apple Silicon, Raspberry Pi, SBCs, etc.)

Stack

License

This project is licensed under the MIT License.