Learn touch typing step by step — Persian & English
No server · Double-click to run · Local storage · Fully offline
| Area | What you get |
|---|---|
| Curriculum | 30 progressive stages per language (Persian + English) |
| Free practice | Sentences, words, random letters, quotes, proverbs, code, custom text |
| Session styles | Standard · Focus/Zen (no keyboard) · Timed challenge |
| Virtual keyboard | Next-key highlight · finger icon · hand diagram |
| Strict mode | Can't advance until you type the correct key |
| Analytics | WPM / CPM / accuracy · live sparkline · weak-key heatmap |
| Gamification | XP & levels · combo counter · achievements · daily streak · confetti |
| Settings | 6 themes · 12 fonts · separate sound toggles · daily goal |
| Data | localStorage · JSON export/import · no backend |
| Build | Link |
|---|---|
| Installer (recommended) | Touch.Typing.setup.exe |
| Portable (no install) | Touch.Typing.protable.exe |
Download, run, and start typing — no browser or server needed.
Open index.html in your browser. That's it.
# Python
python -m http.server 8080
# or Node
npx serve .Then open http://localhost:8080.
💡 No
npm installor build step required —bundle.jsis pre-built.
touch-typing-trainer/
├── index.html # Entry point
├── favicon.svg
├── build.js # Bundle ES modules → bundle.js
├── css/
│ ├── tokens.css # Themes, fonts, design tokens
│ ├── base.css # Reset & app shell
│ ├── components.css # Buttons, cards, keyboard, modal
│ └── pages.css # Page-specific styles
├── data/
│ ├── lessons/ # 30+30 curriculum stages (fa/en)
│ ├── sentences/ # Sentence banks
│ ├── proverbs.js # 30 Persian proverbs
│ └── quotes.js # Quotes & code snippets
└── js/
├── app.js # Boot & routing
├── bundle.js # Built output (ready to run)
├── state.js # Central state
├── typing-engine.js # Typing engine
├── scoring.js # WPM, accuracy, score
├── normalize-text.js # ZWNJ strip & text normalization
├── achievements.js # 16 achievements
├── streak.js # Streaks & weak keys
├── xp.js # XP / Level system
├── confetti.js # Celebration animation
├── patterns.js # Error-pattern analysis
├── audio.js # Web Audio SFX
├── storage.js # localStorage helpers
├── router.js # Hash-based router
└── ui/ # Home, curriculum, practice, session, stats, settings
1–4 Home Row
5 Home-row words
6–8 Top row + combinations
9–10 Bottom row + all three rows
11 Common words
12–13 Numbers & punctuation
14–16 Sentences, paragraphs, mastery
17–21 Focused letter drills
22–25 Numbers in sentences, punctuation flow
26–28 Speed, accuracy, full mix
29 Proverbs (Persian track)
30 Final mastery ⭐
Each stage has speed & accuracy thresholds. The next stage unlocks only after you pass.
| Key | Action |
|---|---|
Esc |
Exit session |
R |
Retry session (after finish) |
Backspace |
Delete previous character |
Enter |
New line (multi-line text) |
Space |
Space (ZWNJ is auto-stripped) |
| Theme | Type |
|---|---|
| 🌑 Dark | Default |
| ☀️ Light | Light |
| 🏜️ Sand | Warm light |
| 🌊 Sky | Cool light |
| 🌲 Forest | Dark |
| 💜 Indigo | Dark |
Persian: Vazirmatn · Noto Naskh · Noto Kufi · Amiri · Baloo · Lalezar · Markazi
English: System · Inter · Roboto · Georgia · Monospace
# After editing sources under js/ and data/
node build.jsOutput: js/bundle.js
The app is fully client-side and ready for Electron / Tauri:
// main.js (Electron)
const { app, BrowserWindow } = require("electron");
app.whenReady().then(() => {
const win = new BrowserWindow({ width: 1200, height: 800 });
win.loadFile("index.html");
});| Capability | Status |
|---|---|
| Persian (RTL) | ✅ |
| English (LTR) | ✅ |
| Mobile | ✅ |
| Tablet | ✅ |
| Desktop | ✅ |
| Offline | ✅ |
| No cookies/tracking | ✅ |
MIT — free to use, modify, and distribute.
Built with ❤️ for learning touch typing
If you find it useful, please leave a ⭐