OpenReader logo

OpenReader

Self-hosted text-to-speech document reader with synchronized highlighting

Alternative to: speechify, natural reader, elevenlabs reader


OpenReader turns EPUB, PDF, DOCX, TXT, and Markdown files into read-along audiobooks with word-by-word highlighting powered by ONNX Whisper alignment. It supports fully offline text-to-speech via local engines like Kokoro-FastAPI, or cloud providers such as OpenAI and ElevenLabs for narration. Documents can be exported as audiobooks, making it a self-hosted alternative to commercial TTS reading apps.

OpenReader Docker Compose example

Self-host OpenReader on your own server, homelab, or VPS starting from this Docker Compose example. It runs OpenReader in Docker containers using the official ghcr.io/richardr1126/openreader:latest image, with persistent volumes and automatic restarts preconfigured. Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.

services:
  openreader:
    image: ghcr.io/richardr1126/openreader:latest
    volumes:
      - docstore:/app/docstore
    restart: unless-stopped
    environment:
      # Externally facing URL where users reach OpenReader. Used for auth/session cookies and callbacks.
      BASE_URL: "http://localhost:3003"
      # Secret used to sign auth sessions (required in v4+). Generate one with: openssl rand -base64 32
      AUTH_SECRET: "changeme"
      # Additional trusted origins for auth, comma-separated. BASE_URL is always trusted.
      AUTH_TRUSTED_ORIGINS: ""
      # First-boot seed only: default OpenAI-compatible TTS endpoint (e.g. a Kokoro-FastAPI server). Managed from the admin UI afterwards.
      API_BASE: "http://localhost:8880/v1"
      # First-boot seed only: API key for the default TTS provider (encrypted at rest). Leave empty if the provider needs none.
      API_KEY: ""
      # Comma-separated emails auto-promoted to admin (unlocks the Settings -> Admin tab).
      ADMIN_EMAILS: ""

volumes:
  docstore:

Values set to changeme are required — replace them with your own values before starting OpenReader.

Prefer a managed setup? WinterFlow installs, configures, and updates OpenReader for you using this same Docker Compose configuration.