Skip to main content
Version: v4.0.1

Stack

Framework

Containerization and runtime

  • Docker (linux/amd64 and linux/arm64)
  • Shared entrypoint that runs DB migrations by default and can bootstrap embedded SeaweedFS before app startup

Next.js client

Next.js server

  • APIs: Route Handlers for sync, blob/content access, migrations, audiobook export, TTS/Whisper proxying
  • State sync: request-based today (not realtime push updates)
  • Authentication: Better Auth server handlers/adapters with anonymous session support
  • Metadata DB: Drizzle ORM with SQLite (better-sqlite3) by default and optional Postgres (pg)
    • App tables are manually maintained in Drizzle schema files
    • Auth tables are auto-generated by the Better Auth CLI and migrated alongside app tables via Drizzle
  • Blob storage: embedded SeaweedFS (weed mini) by default, or external S3-compatible storage via AWS SDK v3
  • TTS providers: OpenAI-compatible API (openai SDK), Replicate (replicate client), DeepInfra, and custom OpenAI-compatible endpoints — credentials are encrypted at rest
  • Audio pipeline: ffmpeg (ffmpeg-static) for audiobook assembly, archiver for export packaging
  • Utilities: lru-cache for in-process caching, fast-xml-parser for EPUB/XML parsing, uuid for identifier generation, zod for schema validation

External compute worker (optional)

Monorepo packages under compute/:

  • @openreader/compute-core — ONNX runtime lifecycle, model management, and inference logic shared by compute worker runtime + app/worker contracts
    • ONNX runtime: onnxruntime-node with @huggingface/tokenizers
    • Whisper alignment: onnx-community/whisper-base_timestamped (q4) for word-level timestamps
    • PDF layout: Bei0001/PP-DocLayoutV3-ONNX for document block detection and layout parsing
    • PDF rendering: pdfjs-dist, @napi-rs/canvas for server-side page rasterization
    • Utilities: jszip, ffmpeg-static
  • @openreader/compute-worker — standalone Node.js worker service
    • HTTP server: Fastify v5
    • Job queue + state: NATS JetStream WorkQueue pull consumers + NATS KV (jobs.whisper, jobs.layout)
    • Storage: AWS SDK v3 S3 client for reading/writing blobs
    • Logging: Pino
    • Validation: Zod
  • Heavy compute is worker-backed via COMPUTE_WORKER_URL + COMPUTE_WORKER_TOKEN (remote queue via HTTP + NATS)

Tooling and testing

  • ESLint
  • TypeScript
  • Playwright end-to-end tests
  • Drizzle migration/generation scripts
  • Docusaurus documentation site (docs-site/)