Free, open-source, local-first RSVP speed reader for PDFs & EPUBs. Fixed focal point to reduce eye strain, OpenDyslexic + Irlen support, built-in stats and benchmark. No accounts, no tracking, fully offline.
Speeedy
Open-source RSVP speed reading app for focus, comfort, and measurable progress.
Speeedy is a local-first reading product that helps users read faster with RSVP (Rapid Serial Visual Presentation) and ORP (Optimal Recognition Point) alignment, while also supporting accessibility, benchmarking, analytics, profile sharing, and offline use.
The best free open-source alternative to Spreeder and Outread. A private, local-first speed reader for PDFs and EPUBs โ no account, no ads, no data collection. Built-in ADHD and dyslexia support.
Support the project: If Speeedy saves you time, consider supporting development โค๏ธ
Why Speeedy exists
Traditional reading is slowed down by constant eye movement across lines of text. Speeedy reduces that overhead by presenting words in a fixed focal area so the eyes stay still and the brain can process text faster.
It is not just a basic word flasher. It is a full reading system with:
- a custom RSVP engine with adaptive timing
- deep reading personalization
- accessibility-focused modes โ Dyslexia (OpenDyslexic), Bionic Reading, Irlen overlays
- ADHD support โ Pomodoro timer, focus/immersion mode, ambient noise, 20-20-20 reminders
- reading benchmarks and progress tracking
- local-first persistence with no account required
- profile sharing and installable PWA support
What is RSVP and ORP?
RSVP (Rapid Serial Visual Presentation) displays words one at a time in the same place on screen, reducing saccadic eye movement.
ORP (Optimal Recognition Point) is the letter position within a word where recognition is fastest. Speeedy aligns words to that pivot so the eye does not have to search for the word's center every time.
Key Features
Core reading engine
- RSVP playback with one-word
- ORP alignment for every displayed word
- Smart speed that adapts timing based on word complexity
- Sentence, paragraph, and contextual pause weighting
- Speed ramp to ease readers into faster sessions
- Resume from saved progress with lookback context
- Keyboard-first controls โ Space, F (toggle focus mode), Arrows, R, Escape, ?
Reading customization
- 100โ1600 WPM control
- Font size, font family, letter spacing, and font weight controls
- Pivot offset adjustment
- Pause view modes (focus / context / full-text)
- Punctuation handling options
- Peripheral context ghost words
- ORP guide markers
- Bionic reading mode
- Quote and aside colorization
- Seekable progress bar โ click or drag to jump to any position
- Focus mode (optional, off by default) โ enable in settings or press F; while playback (or the pre-roll countdown) runs, the reader hides the header, progress bar, bottom toolbar, and settings so only the word area shows. Pausing (tap the reading area or Space) brings controls back; focus mode stays enabled until you turn it off in settings or press F again
Accessibility and focus
- Dyslexia mode with OpenDyslexic-style presentation, adjusted spacing, and font weight control
- Irlen-style tinted overlays (peach, mint, parchment) with adjustable opacity
- RTL-aware reading support for Arabic, Hebrew, and other RTL scripts
- Ambient white, pink, and brown noise with crossfade loop
- Click-synchronized reading sounds with pitch control
- Countdown before playback
- Pomodoro timer with focus/break/long-break phases, progress ring, session tracking, and auto pause/resume integration
Content ingestion
- Paste text directly
- Import documents: PDF, DOCX, DOC, TXT, Markdown, RTF, HTML, CSV, ODT, EPUB
- Shared reading links for hash-based text sharing
- Local document library with resume support and deduplication
Progress, tracking, and growth
- Reading baseline benchmark with 10-question comprehension quiz
- Average WPM tracking and improvement measurement
- Session history with source title, WPM, words read, duration
- Daily word counts and 14-day activity chart
- Current streak and best streak
- Reading goals and daily progress bar
- WPM trend sparkline chart
Profile and sharing
- Local profile system with name, emoji, and avatar image
- Profile export/import as
.speeedybackup files - Shareable public reading profile links with privacy opt-in
- Share cards for stats and self-promotion
Product and platform features
- Installable PWA with offline-friendly caching
- Local-first architecture โ reading data stays in IndexedDB, no account required
- Open-source codebase
- Learn page explaining RSVP, ORP, and reading science with interactive demos
- Donation/support page with crypto wallets, QR codes, and supporters wall
- In-app changelog and project support routes
Product Surfaces
Speeedy is more than a single reader screen. The app includes:
- Marketing / landing page with animated feature storytelling
- Main app intake page with file upload and text paste
- Reader screen with full settings panel
- Stats dashboard with charts and session history
- Profile page with library management and data portability
- Benchmark test for baseline WPM + comprehension measurement
- Learn / science page with educational content
- Share view for public stat cards
- Donate/support page
- Changelog page
- Privacy and terms pages
Tech Stack
Frontend
- Lit โ web components (light DOM)
- TypeScript โ strict mode throughout
- Vite โ dev server and production bundling
- Tailwind CSS v4 โ utility-first styling
- DaisyUI v5 โ theme and UI component primitives
- Motion โ landing-page and learn-page animations
- Lucide โ icon set
Parsing and document support
- pdfjs-dist โ PDF parsing
- mammoth โ DOCX/DOC parsing
- JSZip โ EPUB and ODT archive parsing
Browser platform and utilities
- idb โ IndexedDB wrapper
- html-to-image โ share card export
- qrcode โ donation QR generation
Quality and developer tooling
- Biome โ linting and formatting
- Vitest โ unit testing
- jsdom โ browser-like test environment
- Husky โ Git hooks
- lint-staged โ pre-commit file checks
Architecture Overview
src/
โโโ components/ Lit pages, UI elements, overlays, and product surfaces
โโโ config.ts Project-level constants and public links
โโโ data/ Benchmark passages and other static content
โโโ models/ Shared TypeScript interfaces and types
โโโ services/ Engine, parsing, storage, profile, stats, theme, audio
โโโ utils/ Events, icons, and text helpers
Key implementation files:
src/services/rsvp-engine.tsโ custom RSVP playback, token timing, pause logic, ORP flowsrc/services/text-parser.tsโ document parsing across multiple formatssrc/services/storage-service.tsโ IndexedDB persistence, deduplication, import/exportsrc/services/audio-service.tsโ procedural click sounds and ambient noise generationsrc/components/rsvp-reader.tsโ main reader experiencesrc/components/settings-panel.tsโ deep reader personalizationsrc/components/benchmark-test.tsโ baseline WPM + comprehension flowsrc/components/profile-page.tsโ profile, library, and data management
Getting Started
Prerequisites: Node.js 20+ and pnpm
# Clone and install
git clone https://github.com/sami-29/speeedy.git
cd speeedy
pnpm install
Start dev server
pnpm dev
Run tests
pnpm test
Lint
pnpm lint
Build for production
pnpm build
Preview production build
pnpm preview
Scripts
pnpm devโ start local development serverpnpm buildโ type-check and build production bundlepnpm previewโ preview the production build locallypnpm lintโ run Biome checks on source filespnpm lint:fixโ auto-fix Biome issues where possiblepnpm testโ run unit tests oncepnpm test:watchโ run Vitest in watch mode
Testing
Unit tests (Vitest):
src/services/rsvp-engine.test.tsโ RSVP engine behaviorsrc/services/stats-service.test.tsโ stats calculationssrc/services/text-parser.test.tsโ text parsing behaviorsrc/utils/text-utils.test.tsโ shared text utility logic
e2e/landing.spec.tsโ marketing page loads and CTAs are visiblee2e/app-page.spec.tsโ text paste and begin reading flowe2e/reader.spec.tsโ RSVP reader playback and controlse2e/benchmark.spec.tsโ full benchmark quiz flowe2e/settings.spec.tsโ settings persistence across reloade2e/keyboard.spec.tsโ keyboard shortcut smoke test
pnpm e2e (requires the dev server to start automatically).
PWA and Deployment
Speeedy is configured as an installable PWA with cached static assets and auto-updating service worker behavior.
vite.config.tsโ PWA plugin, chunk splitting, runtime cachingpublic/manifest.webmanifestโ web app manifestwrangler.tomlโ Cloudflare-oriented asset deployment config
Analytics
Speeedy uses Umami (cookieless, privacy-first) for anonymous usage analytics. The tracking script in index.html points to the official Speeedy Umami instance.
If you self-host or fork this project, remove or replace the analytics script tag in index.html:
<!-- Remove or replace this with your own Umami instance -->
To remove analytics entirely, delete that <script> tag. Speeedy functions identically without it โ no features depend on Umami being present.
Versioning
This project follows Semantic Versioning:
- MAJOR (
1.x.x) โ breaking changes to data or public behavior - MINOR (
x.1.x) โ new backwards-compatible features - PATCH (
x.x.1) โ fixes and polish
Contributing
See CONTRIBUTING.md for setup instructions, code style, and PR guidelines.
License
MIT โ free to use, modify, and distribute.