Rapid Serial Visual Presentation — A browser-based speed reading tool that uses the Optimal Recognition Point (ORP) algorithm to train your eyes to read faster with better comprehension.
┌─────────────────────────────────────────────────────────┐
│ ⚡ RSVP Rapid Serial Visual Presentation │
├─────────────────────────────────────────────────────────┤
│ │
│ [ Drop PDF / DOCX / TXT here ] │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ ● Playing 142 / 3,847 │ │
│ │ │ │
│ │ con CEPT ual │ │
│ │ ↑ focal point │ │
│ │ │ │
│ │ ...reading quickly through [CONCEPT] allows │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ Speed ━━━━━━●━━━━━ 300 WPM [▶ Play] [⏸ Pause] │
└─────────────────────────────────────────────────────────┘
Zero installation required. Download and open in your browser:
# Option 1: Clone the repo
git clone https://github.com/LSaiko/rsvp-speed-reader.git
cd rsvp-speed-reader
open speed-reader.html # macOS
start speed-reader.html # Windows
xdg-open speed-reader.html # Linux
# Option 2: Direct download
# Click "speed-reader.html" above → Download RawOr use the Live Demo →
| Feature | Description |
|---|---|
| 📄 Multi-format file support | PDF, DOCX, DOC, TXT, Markdown |
| 🎯 ORP focal letter | Highlights the Optimal Recognition Point per word |
| ⏱️ Adjustable WPM | 60–1,000 words per minute with live slider |
| ⏸️ Smart punctuation pauses | Auto-slows on .!?;:, for natural rhythm |
| 📍 Context strip | Shows surrounding words for spatial awareness |
| ⌨️ Full keyboard control | Space, arrows, no mouse required |
| 📊 Reading stats | Word count, estimated time, live progress |
| 🌐 Offline-capable | Works with no internet after first load |
| Key | Action |
|---|---|
Space |
Play / Pause |
← → |
Step backward / forward one word |
↑ ↓ |
Increase / decrease speed by 50 WPM |
The Optimal Recognition Point is a research-backed concept: each word has one letter that, when fixated upon, allows the brain to decode the entire word most efficiently.
Word length → Focal letter position (0-indexed)
─────────────────────────────────────────────────
1–2 chars → position 0 (e.g., "at" → "at")
3–5 chars → position 1 (e.g., "read" → "rEad")
6–9 chars → position 2 (e.g., "faster" → "fAster")
10–13 chars → position 3 (e.g., "understand" → "unDerstand")
14+ chars → position 4 (e.g., "implementation" → "implEmentation")
Combined with RSVP (words displayed one at a time, center-screen), this eliminates saccadic eye movement — the back-and-forth scanning that consumes ~30% of normal reading time.
rsvp-speed-reader/
├── speed-reader.html # ← The entire application (single file)
├── README.md # This documentation
├── LICENSE # MIT License
├── ARCHITECTURE.md # Deep-dive technical documentation
└── .github/
└── workflows/
└── deploy.yml # GitHub Pages auto-deploy
The app is intentionally a single HTML file — a deliberate engineering choice for maximum portability. Here's the high-level structure:
speed-reader.html
├── <head> Google Fonts (DM Mono, Bebas Neue, DM Sans)
├── <style> ~350 lines of CSS with custom properties
├── <body> Semantic HTML layout
└── <script> ~280 lines of vanilla JS
├── State words[], idx, playing, timer, wpm
├── ORP Engine getFocalIndex(word) → position
├── Renderer renderWord() → DOM manipulation
├── Scheduler showWord() → recursive setTimeout loop
├── File Parser PDF.js + Mammoth.js (CDN loaded)
└── Event Layer keyboard, slider, buttons, drag-drop
See ARCHITECTURE.md for full annotated code walkthrough.
| Library | Purpose | Size | Why CDN? |
|---|---|---|---|
| PDF.js | Parse PDF files client-side | ~400KB | Large; only loaded when needed |
| Mammoth.js | Parse DOCX files client-side | ~180KB | Large; only loaded when needed |
Both are loaded via cdnjs.cloudflare.com. The app is fully functional offline for TXT/MD files even if CDN is unreachable.
This project showcases the following engineering competencies:
Algorithms & Data Structures
- ORP positional algorithm with variable-length word mapping
- Recursive
setTimeoutscheduler with dynamic interval recalculation - Real-time WPM adjustment without restarting playback
Browser APIs
FileReader/ArrayBufferfor binary file handlingrequestAnimationFramefor smooth focal guide positioningDragEventAPI for native drag-and-dropKeyboardEventhandler with input-context awareness
UI/UX Engineering
- CSS custom properties for full theme consistency
- CSS
@keyframesflash animation with reflow trick (offsetWidth) - Responsive font scaling with
clamp() - Accessible keyboard-first navigation
Software Design
- Zero build-step, zero runtime dependencies architecture
- Clean separation: state → render → schedule → events
- Graceful degradation (offline TXT mode if CDN fails)
- Parse speed: ~50,000 words/second (tokenization)
- DOM updates: Single innerHTML write per word
- Memory: O(n) word array, no duplication
- Startup: < 200ms to interactive (no bundler, no hydration)
- Highlight multi-word phrases at lower speeds
- Persistent progress (localStorage bookmarks)
- Font size and theme customization panel
- Sentence mode (display full sentence, highlight current word)
- Browser extension version
MIT — free for personal and commercial use. See LICENSE.
Issues and PRs welcome. Please read CONTRIBUTING.md if you'd like to improve the ORP algorithm or add a new file format parser.
Built with zero dependencies, maximum intentionality.