Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions templates/openreader-slim/assets/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added templates/openreader-slim/assets/screenshot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
112 changes: 112 additions & 0 deletions templates/openreader-slim/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
import {
Output,
Services,
randomPassword,
randomString,
} from "~templates-utils";
import { Input } from "./meta";

export function generate(input: Input): Output {
const services: Services = [];
const authSecret = randomString(32);
const minioRootUser = randomString(16);
const minioRootPassword = randomPassword();

const runtimeSeedJson = JSON.stringify({
version: 1,
runtimeConfig: { defaultTtsProvider: "kokoro" },
providers: [
{
slug: "kokoro",
displayName: "Kokoro",
providerType: "custom-openai",
baseUrl: `http://$(PROJECT_NAME)_${input.appServiceName}-kokoro:8880/v1`,
defaultModel: "kokoro",
enabled: true,
},
],
});

services.push({
type: "app",
data: {
serviceName: input.appServiceName,
source: {
type: "image",
image: input.appServiceImage,
},
env: [
`BASE_URL=https://$(PRIMARY_DOMAIN)`,
`AUTH_SECRET=${authSecret}`,
`USE_EMBEDDED_WEED_MINI=false`,
`S3_ENDPOINT=http://$(PROJECT_NAME)_${input.appServiceName}-s3:9000`,
`S3_BUCKET=openreader-documents`,
`S3_REGION=us-east-1`,
`S3_ACCESS_KEY_ID=${minioRootUser}`,
`S3_SECRET_ACCESS_KEY=${minioRootPassword}`,
`S3_FORCE_PATH_STYLE=true`,
`RUNTIME_SEED_JSON=${runtimeSeedJson}`,
].join("\n"),
mounts: [
{
type: "volume",
name: "docstore",
mountPath: "/app/docstore",
},
],
domains: [
{
host: "$(EASYPANEL_DOMAIN)",
port: 3003,
},
],
},
});

services.push({
type: "app",
data: {
serviceName: `${input.appServiceName}-kokoro`,
source: {
type: "image",
image: input.kokoroServiceImage,
},
env: [
`ONNX_NUM_THREADS=8`,
`ONNX_INTER_OP_THREADS=4`,
`ONNX_EXECUTION_MODE=parallel`,
`ONNX_OPTIMIZATION_LEVEL=all`,
`ONNX_MEMORY_PATTERN=true`,
`ONNX_ARENA_EXTEND_STRATEGY=kNextPowerOfTwo`,
`API_LOG_LEVEL=INFO`,
].join("\n"),
},
});

services.push({
type: "app",
data: {
serviceName: `${input.appServiceName}-s3`,
source: {
type: "image",
image: input.s3ServiceImage,
},
env: [
`MINIO_ROOT_USER=${minioRootUser}`,
`MINIO_ROOT_PASSWORD=${minioRootPassword}`,
].join("\n"),
deploy: {
command: "server /data --console-address :9001",
},
mounts: [
{
type: "volume",
name: "s3-data",
mountPath: "/data",
},
],
},
});

return { services };
}
90 changes: 90 additions & 0 deletions templates/openreader-slim/meta.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: OpenReader (Slim)
description:
OpenReader is an open-source, self-host-friendly text-to-speech document
reader built with Next.js. It supports EPUB, PDF, TXT, MD, and DOCX with
multilingual, synchronized read-along playback. Features include layout-aware
PDF parsing with PP-DocLayoutV3 (ONNX), word-by-word highlighting via ONNX
Whisper alignment, segment-based read-along with cached audio, multi-provider
TTS support (self-hosted and cloud), audiobook export in m4b/mp3, and flexible
storage backends. The slim variant bundles the Kokoro-FastAPI CPU TTS engine
for fully local text-to-speech without external API keys.
instructions:
After deployment, open the web UI at your configured domain. On first access
you will be prompted to set up an account using the AUTH_SECRET you provided.
The Kokoro TTS service starts automatically alongside the reader — allow a
minute for the model to load before playing audio.
changeLog:
- date: 2026-06-30
description: first release
links:
- label: Website
url: https://openreader.richardr.dev
- label: Github
url: https://github.com/richardr1126/openreader
- label: Documentation
url: https://docs.openreader.richardr.dev
contributors:
- name: Ahson Shaikh
url: https://github.com/Ahson-Shaikh
schema:
type: object
required:
- appServiceName
- appServiceImage
- kokoroServiceImage
- s3ServiceImage
properties:
appServiceName:
type: string
title: App Service Name
default: openreader-slim
appServiceImage:
type: string
title: OpenReader Image
default: ghcr.io/richardr1126/openreader:v4.3.0
kokoroServiceImage:
type: string
title: Kokoro TTS Image
default: ghcr.io/remsky/kokoro-fastapi-cpu:v0.2.4
s3ServiceImage:
type: string
title: S3 Storage Image
default: minio/minio:RELEASE.2025-09-07T16-13-09Z
benefits:
- title: Fully Local Text-to-Speech
description:
The slim variant ships with Kokoro-FastAPI on CPU so you get high-quality
TTS narration without sending your documents to any external API. Your
content stays entirely on your own server.
- title: Read-Along Synchronization
description:
Word-by-word and sentence-level highlighting keeps pace with the audio
playback, making it easy to follow along with complex documents at any
reading speed.
- title: Broad Document Support
description:
Upload EPUB, PDF, TXT, Markdown, and DOCX files. Layout-aware PDF parsing
detects headings, paragraphs, and columns so reading order is always
correct.
features:
- title: Kokoro TTS Engine
description:
Powered by the Kokoro-82M model running via ONNX on CPU, delivering
natural-sounding narration without a GPU or cloud subscription.
- title: Audiobook Export
description:
Export any document as an m4b or mp3 audiobook with resumable chapter
processing, ready for playback in any podcast or audiobook app.
- title: Multi-Provider TTS
description:
Add cloud TTS providers (OpenAI, ElevenLabs, Deepgram, and more) alongside
the local Kokoro engine via the provider settings screen.
- title: Device Sync and Library
description:
Built-in document library with server-side storage and device sync so your
reading progress follows you across browsers and devices.
tags:
- Documents
- Text-to-Speech
- AI
- Self-Hosted