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.
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 display modes
- reading benchmarks and progress tracking
- local-first persistence with no account required
- profile sharing and installable PWA support
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.
- 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, Arrows, R, Escape, ?
- 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
- 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
- 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
- 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
- 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
- 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
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
- 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
- pdfjs-dist — PDF parsing
- mammoth — DOCX/DOC parsing
- JSZip — EPUB and ODT archive parsing
- idb — IndexedDB wrapper
- html-to-image — share card export
- qrcode — donation QR generation
- Biome — linting and formatting
- Vitest — unit testing
- jsdom — browser-like test environment
- Husky — Git hooks
- lint-staged — pre-commit file checks
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
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 previewpnpm 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
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 tests (Playwright):
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
Run E2E tests: pnpm e2e (requires the dev server to start automatically).
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
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 -->
<script defer src="https://cloud.umami.is/script.js" data-website-id="YOUR-ID-HERE"></script>To remove analytics entirely, delete that <script> tag. Speeedy functions identically without it — no features depend on Umami being present.
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
See CHANGELOG.md for the full release history.
See CONTRIBUTING.md for setup instructions, code style, and PR guidelines.
MIT — free to use, modify, and distribute.