No description
- Introduce a shared tts-provider-catalog to centralize provider/model/voice defaults
and feature flags (supportsTtsInstructions, providerSupportsCustomModel, resolveProviderModels,
getDefaultVoices, etc.). Replace ad-hoc provider logic across server and client with catalog calls.
- Replace inline voice/model UI logic in SettingsModal, AudiobookExportModal, TTSContext,
generate server code, and voice hook to use catalog helpers (resolveTtsSettingsViewModel,
supportsTtsInstructions, getDefaultVoices).
- Extract audiobook generation responsibilities into a small client-side pipeline:
- Add createEpubAudiobookSourceAdapter and createPdfAudiobookSourceAdapter adapter modules
to prepare chapters from EPUB/PDF sources.
- Add runAudiobookGeneration and regenerateAudiobookChapter pipeline functions to handle
chapter preparation, progress tracking, request header construction, and retry/abort behavior.
- Wire adapters/pipeline into EPUBContext and PDFContext to simplify and centralize audiobook flow.
- Move config preference helpers out of ConfigContext into dedicated client modules:
- buildSyncedPreferencePatch (lib/client/config/preferences.ts)
- applyConfigUpdate and getVoicePreferenceKey (lib/client/config/updates.ts)
- Use these helpers in ConfigContext to keep update logic small and testable.
- Add TTS settings view model resolver (lib/client/settings/tts-settings.ts) and tests
for the tts-provider catalog and config helpers (tests/unit/tts-provider-catalog.spec.ts).
- Minor usages updated: AudiobookExportModal, SettingsModal, useVoiceManagement, TTSContext,
server tts generation, and various context files to consume the new modules.
Why: Reduce duplication, improve testability, and separate concerns for provider metadata,
UI view-model logic, and audiobook generation flow. Breaking changes: none.
|
||
|---|---|---|
| .github | ||
| docs-site | ||
| drizzle | ||
| public | ||
| scripts | ||
| src | ||
| tests | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| .npmrc | ||
| Dockerfile | ||
| drizzle.config.pg.ts | ||
| drizzle.config.sqlite.ts | ||
| empty-module.ts | ||
| eslint.config.mjs | ||
| LICENSE | ||
| next.config.ts | ||
| package.json | ||
| playwright.config.ts | ||
| pnpm-lock.yaml | ||
| postcss.config.mjs | ||
| README.md | ||
| tailwind.config.ts | ||
| tsconfig.json | ||
📄🔊 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 synchronized read-along playback.
Previously named OpenReader-WebUI.
Get started in the docs.
✨ Highlights
- 🎯 Multi-provider TTS with OpenAI-compatible endpoints (OpenAI, DeepInfra, Kokoro, KittenTTS-FastAPI, Orpheus, custom).
- 📖 Read-along playback for PDF/EPUB with sentence-aware narration.
- ⏱️ Word-by-word highlighting via optional
whisper.cpptimestamps. - 🛜 Sync + library import to bring docs across devices and from server-mounted folders.
- 🗂️ Flexible storage with embedded SeaweedFS or external S3-compatible backends.
- 🎧 Audiobook export in
m4b/mp3with resumable chapter processing. - 🐳 Self-host friendly with Docker, optional auth, and automatic startup migrations.
🚀 Start Here
| Goal | Link |
|---|---|
| Run with Docker | Docker Quick Start |
| Deploy on Vercel | Vercel Deployment |
| 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
- Questions and ideas: GitHub Discussions
- Bug reports: GitHub Issues
- Contributions: open a pull request
📜 License
MIT. See LICENSE.