diff --git a/templates/openreader-slim/assets/logo.svg b/templates/openreader-slim/assets/logo.svg new file mode 100644 index 000000000..4bc0d6f85 --- /dev/null +++ b/templates/openreader-slim/assets/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/openreader-slim/assets/screenshot.png b/templates/openreader-slim/assets/screenshot.png new file mode 100644 index 000000000..1e69dce5e Binary files /dev/null and b/templates/openreader-slim/assets/screenshot.png differ diff --git a/templates/openreader-slim/index.ts b/templates/openreader-slim/index.ts new file mode 100644 index 000000000..26c1026ac --- /dev/null +++ b/templates/openreader-slim/index.ts @@ -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 }; +} diff --git a/templates/openreader-slim/meta.yaml b/templates/openreader-slim/meta.yaml new file mode 100644 index 000000000..5f7a74672 --- /dev/null +++ b/templates/openreader-slim/meta.yaml @@ -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