Save articles from URLs or paste text directly. Read them in a clean, distraction-free view. Listen to them with AI-generated text-to-speech.
- Save from URL — extracts article content using Mozilla Readability
- Paste text — supports markdown and plain text
- Text-to-Speech — generates audio using Kokoro-82M (runs locally, no API keys)
- Code blocks — syntax highlighted with Shiki
- Search, filter, sort — find articles by title, filter by read status or favourites
- Docker and Docker Compose
- pnpm (if running outside Docker)
docker compose up -d --buildOr via pnpm:
pnpm docker:startOpen localhost:3000. PostgreSQL, the Next.js app, and TTS all run from this single command.
cp .env.example .env
docker compose up -d postgres # start just the database
pnpm install
pnpm prisma generate
pnpm prisma migrate deploy
pnpm dev| Layer | Tech |
|---|---|
| Framework | Next.js 16 (App Router), React 19, TypeScript |
| Styling | Tailwind v4, shadcn/ui |
| Database | PostgreSQL 16, Prisma 7.3 |
| Article extraction | Mozilla Readability, JSDOM |
| Text-to-Speech | Kokoro-82M via kokoro-js + onnxruntime-node |
| Code highlighting | Shiki |
- User submits a URL or pastes text
- URLs are fetched, cleaned (popup removal, paywall detection), and parsed with Readability
- Content is split into typed sections (paragraphs, headings, code blocks, tables, lists, images, videos, blockquotes)
- Sections are stored as JSON in PostgreSQL
- TTS spawns a Node.js child process that runs Kokoro-82M locally — the ONNX model (~92MB) auto-downloads on first use
- Audio is saved as WAV and served statically with sentence-level alignment for highlighted playback
Set these environment variables to customize TTS (all optional):
| Variable | Default | Description |
|---|---|---|
KOKORO_VOICE |
af_heart |
Voice name |
KOKORO_SPEED |
1 |
Speech speed |
KOKORO_DTYPE |
q8 |
Model precision |
