Own your reading data. Forever.
A free, open-source, local-first reading app that runs on Linux, macOS, Windows, and Android from a shared codebase. Read PDFs, EPUBs, MOBI, FB2, CBZ, CBR, and RSS feeds — all in one workspace. Highlight and annotate with six colors. Look up words with offline dictionaries. Listen with neural text-to-speech. Share highlights as beautiful images. Sync everything to Markdown files in your Obsidian or Logseq vault.
No cloud account. No subscription wall. No vendor lock-in.
curl -fsSL https://raw.githubusercontent.com/fundaments-work/Theorem/main/scripts/install-linux.sh | bash| Platform | Format |
|---|---|
| Linux | .deb or .AppImage |
| macOS (Intel) | .dmg |
| macOS (Apple Silicon) | .dmg |
| Windows | .msi or .exe |
| Android | .apk |
All builds on the Releases page. Website and docs at theorem.fundaments.work. Try the web demo without installing.
git clone --recurse-submodules https://github.com/fundaments-work/theorem.git
cd theorem
pnpm install
pnpm dev # Web dev server (http://localhost:1420)
pnpm dev:tauri # Desktop app in dev modePrerequisites: Node.js 22+, pnpm 10+, Rust (via rustup), and Tauri system deps.
| Command | Description |
|---|---|
pnpm dev |
Start Vite dev server |
pnpm dev:tauri |
Start Tauri desktop app |
pnpm build |
Typecheck + production build |
pnpm typecheck |
TypeScript type checking |
pnpm test |
Run Vitest unit tests |
pnpm package:linux |
Build Linux release package |
See AGENTS.md for the full repository map, conventions, and architecture.
EPUB, MOBI, AZW, AZW3, FB2, CBZ, CBR, PDF, TXT, and RSS articles. Foliate-based reflowable rendering with paged and scroll modes. PDF.js engine with zoom (50–200%), page-fit/width-fit modes, and outline navigation. Full table of contents with section progress. Estimated reading time per page and chapter. Reading progress saved per-book across sessions (page-accurate + CFI). File association — open ebooks directly from your file manager.
Three reader themes: Light, Sepia, Dark. Font family (original, serif, sans-serif, monospace). Font size (12–36), line height (1.0–2.5), margins (0–35%). Letter spacing, word spacing, paragraph spacing. Text alignment, hyphenation toggle. Page animation styles (slide, fade, instant). Page layout (single, double, auto). Reading flow (paged, scroll, auto). Brightness slider. Zoom for fixed-layout formats. Full-screen mode. Auto-hide toolbar with configurable delay. Prefetch distance, animations toggle, virtual scrolling. Per-word highlighting during TTS immersion reading.
Six color-coded highlight colors: yellow, green, blue, red, orange, purple. Notes on any highlight. Bookmarks. Overlayer drawing styles: highlight, underline, strikethrough, squiggly, outline. Annotation panel with quick navigation, editing, and deletion. Works across all formats including PDF and RSS articles.
Freehand drawing with configurable stroke width. Text notes placed anywhere on the page. Multi-line rectangular highlights. Per-page annotation rendering. PDF view state persistence (page, zoom, mode per-session).
Generate polished share-card images from any highlight. Multiple formats: Square (1080×1080) and Story (1080×1920). Multiple visual themes: match, dark, tinted, sepia. Download as PNG, copy to clipboard, native share via Web Share API, share to X (Twitter). Android: saves to MediaStore gallery.
Uses your platform's native TTS engine — no external models or cloud APIs. Android: Android TextToSpeech. Linux: speech-dispatcher (spd-say). macOS: say. Windows: PowerShell System.Speech. Per-word highlighting synchronized with audio. Voice selection depends on system-installed voices.
Look up words while reading with built-in dictionary. Offline StarDict dictionary support (import local .ifo/.idx/.dict.dz files). Download English Wiktionary (~50MB) from the app. Pronunciation display with optional audio. Vocabulary capture and review workspace.
Subscribe to feeds with full annotation tools. Article extraction via Mozilla Readability. Feed discovery from web pages. Offline article storage with caching. Per-feed unread count. Favoriting. Noise filtering (strips ads from extracted content).
Export highlights and annotations to local Markdown files. Designed for vault-based PKM workflows. Per-book Markdown pages with YAML frontmatter. Vocabulary export with definitions and phonetics. Customizable file naming. One-click export.
Book import from local files or drag-and-drop. Folder scanning for batch import. Custom collections / shelves. Favorites toggle with dedicated section. Book ratings (1–5 stars). Tags and categories. Multiple view modes: grid, list, compact. Sort by title, author, date added, last read, progress, rating. Library search by title, author, or tags. SHA-256 content hash deduplication. Concurrency-controlled batch import. Filename metadata extraction.
Reading time tracking (total and per-book). Books finished. Reading streaks: current + longest. Reading speed: average WPM. Daily activity log with 12-week heatmap. Reading goals: daily minutes and yearly books. Achievement badges. Book completion tracking.
Encrypted peer-to-peer sync between Theorem installs on local network. Syncs books, reading progress, annotations, collections, settings, and vocabulary. QR-based device pairing. Device identity management with public-key encryption. Auto-sync on peer discovery. Periodic background sync. No cloud relay — fully local and private.
Full backup bundle export: books (with binary data), annotations, collections, settings, statistics, vocabulary, dictionaries, RSS feeds. Storage usage breakdown. Cache size configuration.
Desktop: Linux (.deb, .AppImage), macOS Intel + Apple Silicon (.dmg), Windows (.msi, .exe). Mobile: Android (.apk). Web: browser fallback for development. All from a single TypeScript + Rust codebase.
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Vite 8 |
| State | Zustand 5 (persisted + versioned migrations) |
| Styling | Tailwind CSS v4, CSS design tokens |
| Desktop | Tauri 2 (Rust) |
| Mobile | Tauri 2 Android |
| PDF.js 6 | |
| Ebook | Foliate.js (vendored) |
| TTS | Platform native (Android TTS, spd-say, say, System.Speech) |
| Dictionary | StarDict |
| RSS | Mozilla Readability |
| Archive | zip.js, unrar-ng (Rust, bundled C source) |
| Testing | Vitest + jsdom |
Built for knowledge workers who want to own their reading data:
- Your data stays local — everything on your device. No cloud, no tracking, no data mining.
- Portable by design — exports are plain Markdown files. Move to any tool anytime.
- True offline-first — works completely without internet. Sync when you choose.
- No subscriptions — free and open-source. Always.
Yes. Local-first reading, annotation, and Markdown export without a paid subscription. Plus: ebook reader, RSS reader, vocabulary builder, neural TTS, LAN sync, and highlight sharing — all in one app.
Is my data safe? — Yes. Everything is stored locally. No cloud account required.
Can I migrate away? — Yes. Exports are plain Markdown files, portable to any tool.
Does it work with Obsidian and Logseq? — Yes. Markdown sync is designed for vault-based workflows.
Is there device sync? — Yes. Encrypted LAN pairing between Theorem installs, no cloud relay.
Does TTS work offline? — Yes. It uses your system's built-in TTS engine. No downloads needed.
What formats are supported? — EPUB, MOBI, AZW, AZW3, FB2, FBZ, CBZ, CBR, PDF, TXT, and RSS feeds.
Can I try it without installing? — Yes. The web demo runs in your browser.
Why MIT instead of AGPL? — MIT lets anyone use, modify, and integrate the code without forcing them to open-source their changes. For a local-first reading app that stores all data as plain Markdown, the protection AGPL offers is unnecessary — your data is already portable.
See CONTRIBUTING.md for guidelines, code conventions, and the pull request process.
MIT License — see LICENSE for details.





