Introduce support for external compute worker mode (`COMPUTE_MODE=worker`) using a new `WorkerComputeBackend`. This enables offloading heavy ONNX Whisper alignment and PDF layout parsing to a standalone worker service (Redis + BullMQ), improving scalability and compatibility with serverless/limited environments. - Add `@openreader/compute-core` as a shared package for ONNX inference and PDF parsing logic. - Implement `WorkerComputeBackend` and worker contract/types for remote job execution. - Update compute backend selection logic and remove previous worker mode guards. - Extend `WhisperAlignInput` and `PdfLayoutInput` types to support object keys for remote data access. - Refactor local compute backend to use `@openreader/compute-core` and support both buffer and object key inputs. - Update job runner, TTS segment alignment, and PDF layout parsing flows to use new compute backend APIs. - Add scripts, Docker workflow, and documentation for deploying and running the compute worker. - Update environment variable docs and examples for worker mode, including storage requirements and configuration. - Document published images and stack changes to reflect the new compute worker architecture. BREAKING CHANGE: `COMPUTE_MODE=worker` now requires an external compute worker service and S3-compatible object storage. Embedded SeaweedFS (`weed mini`) is not supported in worker mode. See the new documentation for deployment and configuration details.
4.1 KiB
4.1 KiB
| title |
|---|
| Stack |
Framework
- Next.js 15 (App Router, Turbopack in dev)
- React 19
- TypeScript
- pnpm workspaces monorepo
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
- UI: Tailwind CSS, Headless UI, @tailwindcss/typography
- Interactions:
react-dnd,react-dropzone - Server state: TanStack Query (React Query v5)
- Authentication: Better Auth client SDK
- Local storage/cache: Dexie.js (IndexedDB)
- Audio playback: Howler.js
- Notifications:
react-hot-toast - Document rendering:
- PDF: react-pdf, pdf.js
- EPUB: react-reader, epubjs
- Markdown/Text: react-markdown, remark-gfm
- Text preprocessing/matching: compromise, cmpstr
- Analytics: Vercel Analytics
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 (
openaiSDK), Replicate (replicateclient), DeepInfra, and custom OpenAI-compatible endpoints — credentials are encrypted at rest - Audio pipeline: ffmpeg (
ffmpeg-static) for audiobook assembly,archiverfor export packaging - Utilities:
lru-cachefor in-process caching,fast-xml-parserfor EPUB/XML parsing,uuidfor identifier generation,zodfor schema validation
External compute worker (optional)
Monorepo packages under compute/:
@openreader/compute-core— ONNX runtime lifecycle, model management, and inference logic shared between local and worker modes- ONNX runtime:
onnxruntime-nodewith@huggingface/tokenizers - Whisper alignment:
onnx-community/whisper-base_timestamped(int8) for word-level timestamps - PDF layout:
Bei0001/PP-DocLayoutV3-ONNXfor document block detection and layout parsing - PDF rendering:
pdfjs-dist,@napi-rs/canvasfor server-side page rasterization - Utilities:
jszip,ffmpeg-static
- ONNX runtime:
@openreader/compute-worker— standalone Node.js worker service- Compute mode is controlled by
COMPUTE_MODEenv var:local(in-process),worker(remote queue via HTTP + Redis), or disabled
Tooling and testing
- ESLint
- TypeScript
- Playwright end-to-end tests
- Drizzle migration/generation scripts
- Docusaurus documentation site (
docs-site/)