From 7810a6329a265ad7fd0bcbda0a9f2f48de19c176 Mon Sep 17 00:00:00 2001
From: Richard R
Date: Sat, 21 Feb 2026 20:19:00 -0700
Subject: [PATCH] feat: add KittenTTS-FastAPI support and update documentation
---
README.md | 3 +-
.../tts-provider-guides/custom-openai.md | 2 +
.../tts-provider-guides/kitten-tts-fastapi.md | 46 +++++++++++++++++++
docs-site/docs/configure/tts-providers.md | 5 +-
docs-site/docs/docker-quick-start.md | 2 +-
docs-site/docs/introduction.md | 3 +-
docs-site/sidebars.ts | 1 +
src/app/(public)/page.tsx | 6 +--
src/components/SettingsModal.tsx | 1 +
9 files changed, 61 insertions(+), 8 deletions(-)
create mode 100644 docs-site/docs/configure/tts-provider-guides/kitten-tts-fastapi.md
diff --git a/README.md b/README.md
index 5dcfc8f..824aac3 100644
--- a/README.md
+++ b/README.md
@@ -18,7 +18,7 @@ OpenReader is an open source, self-host-friendly text-to-speech document reader
## ✨ Highlights
-- 🎯 **Multi-provider TTS** with OpenAI-compatible endpoints (OpenAI, DeepInfra, Kokoro, Orpheus, custom).
+- 🎯 **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.cpp` timestamps.
- 🛜 **Sync + library import** to bring docs across devices and from server-mounted folders.
@@ -38,6 +38,7 @@ OpenReader is an open source, self-host-friendly text-to-speech document reader
| Configure object storage | [Object / Blob Storage](https://docs.openreader.richardr.dev/configure/object-blob-storage) |
| Configure TTS providers | [TTS Providers](https://docs.openreader.richardr.dev/configure/tts-providers) |
| Run Kokoro locally | [Kokoro-FastAPI](https://docs.openreader.richardr.dev/configure/tts-provider-guides/kokoro-fastapi) |
+| Run KittenTTS locally | [KittenTTS-FastAPI](https://docs.openreader.richardr.dev/configure/tts-provider-guides/kitten-tts-fastapi) |
| Get support or contribute | [Support and Contributing](https://docs.openreader.richardr.dev/about/support-and-contributing) |
## 🧭 Community
diff --git a/docs-site/docs/configure/tts-provider-guides/custom-openai.md b/docs-site/docs/configure/tts-provider-guides/custom-openai.md
index 6822333..132b44e 100644
--- a/docs-site/docs/configure/tts-provider-guides/custom-openai.md
+++ b/docs-site/docs/configure/tts-provider-guides/custom-openai.md
@@ -6,6 +6,8 @@ Use any custom OpenAI-compatible TTS service with OpenReader.
Use this integration when your endpoint is not directly covered by built-in dropdown defaults.
+Known compatible examples include Kokoro-FastAPI, KittenTTS-FastAPI, and Orpheus-FastAPI.
+
## Provider
- Provider: `Custom OpenAI-Like`
diff --git a/docs-site/docs/configure/tts-provider-guides/kitten-tts-fastapi.md b/docs-site/docs/configure/tts-provider-guides/kitten-tts-fastapi.md
new file mode 100644
index 0000000..d500e1c
--- /dev/null
+++ b/docs-site/docs/configure/tts-provider-guides/kitten-tts-fastapi.md
@@ -0,0 +1,46 @@
+---
+title: KittenTTS-FastAPI
+---
+
+Use [KittenTTS-FastAPI](https://github.com/richardr1126/KittenTTS-FastAPI) as an OpenAI-compatible TTS backend for OpenReader.
+
+## Provider
+
+- Provider: `Custom OpenAI-Like`
+- Typical model: `kitten-tts`
+- `API_BASE`: required (usually your KittenTTS URL ending with `/v1`)
+- `API_KEY`: set only if your deployment requires one
+
+## Run KittenTTS (CPU)
+
+```bash
+docker run -it --rm \
+ --name kittentts-fastapi \
+ -e KITTEN_MODEL_REPO_ID="KittenML/kitten-tts-nano-0.8-fp32" \
+ -p 8005:8005 \
+ ghcr.io/richardr1126/kittentts-fastapi-cpu
+```
+
+## OpenReader setup
+
+1. Start your KittenTTS-FastAPI server.
+2. In OpenReader Settings, choose provider `Custom OpenAI-Like`.
+3. Set `API_BASE` to your KittenTTS base URL (typically ending with `/v1`).
+4. Set `API_KEY` only if your deployment requires one.
+5. Choose model `kitten-tts` (or another model exposed by your deployment).
+
+## Notes
+
+:::info OpenAI-compatible API
+OpenReader expects OpenAI-compatible audio endpoints when using KittenTTS through `Custom OpenAI-Like`.
+:::
+
+:::tip Endpoint shape
+Use an `API_BASE` that points at the KittenTTS API root (typically ending with `/v1`).
+:::
+
+## References
+
+- [richardr1126/KittenTTS-FastAPI](https://github.com/richardr1126/KittenTTS-FastAPI)
+- [TTS Providers](../tts-providers)
+- [TTS Environment Variables](../../reference/environment-variables#tts-provider-and-request-behavior)
diff --git a/docs-site/docs/configure/tts-providers.md b/docs-site/docs/configure/tts-providers.md
index 296a0b1..059ef80 100644
--- a/docs-site/docs/configure/tts-providers.md
+++ b/docs-site/docs/configure/tts-providers.md
@@ -8,7 +8,7 @@ import TabItem from '@theme/TabItem';
OpenReader supports OpenAI-compatible TTS providers through a common API shape.
:::tip
-If you are running a self-hosted TTS server (Kokoro/Orpheus/etc.), use **Custom OpenAI-Like** in Settings.
+If you are running a self-hosted TTS server (Kokoro/KittenTTS/Orpheus/etc.), use **Custom OpenAI-Like** in Settings.
:::
## Quick Setup by Provider
@@ -46,7 +46,7 @@ In Settings, provider options include:
- `OpenAI`
- `Deepinfra`
-- `Custom OpenAI-Like` (Kokoro, Orpheus, and other OpenAI-compatible endpoints)
+- `Custom OpenAI-Like` (Kokoro, KittenTTS-FastAPI, Orpheus, and other OpenAI-compatible endpoints)
`API_BASE` guidance:
@@ -67,6 +67,7 @@ TTS requests are sent from the Next.js server, not directly from the browser. `A
## Provider Guides
- [Kokoro-FastAPI](./tts-provider-guides/kokoro-fastapi)
+- [KittenTTS-FastAPI](./tts-provider-guides/kitten-tts-fastapi)
- [Orpheus-FastAPI](./tts-provider-guides/orpheus-fastapi)
- [DeepInfra](./tts-provider-guides/deepinfra)
- [OpenAI](./tts-provider-guides/openai)
diff --git a/docs-site/docs/docker-quick-start.md b/docs-site/docs/docker-quick-start.md
index 0fd8902..b700e35 100644
--- a/docs-site/docs/docker-quick-start.md
+++ b/docs-site/docs/docker-quick-start.md
@@ -8,7 +8,7 @@ import TabItem from '@theme/TabItem';
## Prerequisites
- A recent Docker version installed
-- A TTS API server that OpenReader can reach (Kokoro-FastAPI, Orpheus-FastAPI, DeepInfra, OpenAI, or equivalent)
+- A TTS API server that OpenReader can reach (Kokoro-FastAPI, KittenTTS-FastAPI, Orpheus-FastAPI, DeepInfra, OpenAI, or equivalent)
:::note
If you have suitable hardware, you can run Kokoro locally with Docker. See [Kokoro-FastAPI](./configure/tts-provider-guides/kokoro-fastapi).
diff --git a/docs-site/docs/introduction.md b/docs-site/docs/introduction.md
index f3ed2a3..2dc94ad 100644
--- a/docs-site/docs/introduction.md
+++ b/docs-site/docs/introduction.md
@@ -8,12 +8,13 @@ OpenReader is an open source text-to-speech document reader built with Next.js.
> Previously named **OpenReader-WebUI**.
-It supports multiple TTS providers including OpenAI, DeepInfra, and custom OpenAI-compatible endpoints such as [Kokoro-FastAPI](https://github.com/remsky/Kokoro-FastAPI) and [Orpheus-FastAPI](https://github.com/Lex-au/Orpheus-FastAPI).
+It supports multiple TTS providers including OpenAI, DeepInfra, and custom OpenAI-compatible endpoints such as [Kokoro-FastAPI](https://github.com/remsky/Kokoro-FastAPI), [KittenTTS-FastAPI](https://github.com/richardr1126/KittenTTS-FastAPI), and [Orpheus-FastAPI](https://github.com/Lex-au/Orpheus-FastAPI).
## ✨ Highlights
- 🎯 **Multi-Provider TTS Support**
- [**Kokoro-FastAPI**](https://github.com/remsky/Kokoro-FastAPI): supports multi-voice combinations (for example `af_heart+af_bella`)
+ - [**KittenTTS-FastAPI**](https://github.com/richardr1126/KittenTTS-FastAPI): lightweight, CPU-friendly self-hosted TTS
- [**Orpheus-FastAPI**](https://github.com/Lex-au/Orpheus-FastAPI)
- **Custom OpenAI-compatible**: any TTS API with `/v1/audio/voices` and `/v1/audio/speech` endpoints
- **Cloud TTS providers**:
diff --git a/docs-site/sidebars.ts b/docs-site/sidebars.ts
index d15a6f9..1e650bd 100644
--- a/docs-site/sidebars.ts
+++ b/docs-site/sidebars.ts
@@ -21,6 +21,7 @@ const sidebars: SidebarsConfig = {
},
items: [
'configure/tts-provider-guides/kokoro-fastapi',
+ 'configure/tts-provider-guides/kitten-tts-fastapi',
'configure/tts-provider-guides/orpheus-fastapi',
'configure/tts-provider-guides/deepinfra',
'configure/tts-provider-guides/openai',
diff --git a/src/app/(public)/page.tsx b/src/app/(public)/page.tsx
index 0acf138..59c1e15 100644
--- a/src/app/(public)/page.tsx
+++ b/src/app/(public)/page.tsx
@@ -6,7 +6,7 @@ export const metadata: Metadata = {
description:
'OpenReader lets you upload EPUB, PDF, TXT, MD, and DOCX files for synchronized text-to-speech reading with multi-provider TTS support.',
keywords:
- 'PDF reader, EPUB reader, text to speech, tts open ai, kokoro tts, OpenReader, TTS PDF reader, ebook reader, epub tts, document reader',
+ 'PDF reader, EPUB reader, text to speech, tts open ai, kokoro tts, kitten tts, OpenReader, TTS PDF reader, ebook reader, epub tts, document reader',
alternates: {
canonical: '/',
},
@@ -388,7 +388,7 @@ export default function LandingPage() {
OpenReader highlights every word as it’s spoken, turning
any document into a synchronized read-along experience. Connect
any OpenAI-compatible TTS provider — including Kokoro,
- Deepinfra, or your own self-hosted endpoint.
+ KittenTTS, Deepinfra, or your own self-hosted endpoint.
@@ -403,7 +403,7 @@ export default function LandingPage() {
•
Multiple voices & providers
-
Choose from dozens of voices across OpenAI, Kokoro, Deepinfra, or any compatible endpoint.
+
Choose from dozens of voices across OpenAI, Kokoro, KittenTTS, Deepinfra, or any compatible endpoint.
-
diff --git a/src/components/SettingsModal.tsx b/src/components/SettingsModal.tsx
index 0f1a999..e8248ba 100644
--- a/src/components/SettingsModal.tsx
+++ b/src/components/SettingsModal.tsx
@@ -105,6 +105,7 @@ export function SettingsModal({ className = '' }: { className?: string }) {
case 'custom-openai':
return [
{ id: 'kokoro', name: 'Kokoro' },
+ { id: 'kitten-tts', name: 'KittenTTS' },
{ id: 'orpheus', name: 'Orpheus' },
{ id: 'custom', name: 'Other' }
];