A native macOS typing trainer built with Rust & React.
Practice touch typing with timed sessions, live WPM/accuracy feedback, an on-screen keyboard with finger zones, idle detection with sound alerts, and a full statistics dashboard.
| Practice setup | Typing session |
|---|---|
![]() |
![]() |
| Statistics dashboard | Dark theme |
|---|---|
![]() |
![]() |
- Timed sessions β 10 / 15 / 20 / 25 / 30 minutes with an animated countdown ring
- Two text sources β generated random words (English & Russian word banks) or your own pasted text
- Live feedback β color-coded characters, blinking caret, real-time WPM Β· accuracy Β· error count
- Virtual keyboard β QWERTY β ΠΠ¦Π£ΠΠΠ layouts, pressed-key highlight, next-key hint glow, optional touch-typing finger zones
- Idle detection β stop typing for 5s and you get a warning toast + chime; 15s brings up an alert modal
- Completion screen β confetti, animated WPM count-up, and a WPM-over-time chart
- Best & average WPM / accuracy, total practice time, day streak
- 30-day speed and accuracy trend charts
- Recent session history with per-session details
- Everything stored locally in SQLite (
~/.rusttype/stats.db) β no accounts, no cloud
- Word-bank language (English / Π ΡΡΡΠΊΠΈΠΉ) and keyboard layout
- Light / dark theme
- Sound toggle β mutes everything including Rust-side key clicks
- All preferences persisted between launches
All sound effects (key click, error buzz, idle chimes, timer done, whoosh) are
synthesized at build time by build.rs and embedded into the binary β the app ships
with zero audio assets and zero runtime dependencies.
βββββββββββββββββββββββββββββββ invoke / events ββββββββββββββββββββββββββββββββ
β React 19 + TypeScript β βββββββββββββββββββββββββΊ β Rust (Tauri v2) β
β β β β
β Practice Β· Stats Β· Settingsβ register_keystroke, β typing_engine WPM/accuracy β
β Tailwind v4 Β· Framer Motionβ timer://tick, β timer daemon+idle β
β Recharts Β· Howler β timer://idle-*, ... β sound rodio thread β
β β β stats_db rusqlite β
βββββββββββββββββββββββββββββββ ββββββββββββββββββββββββββββββββ
typing_engine.rsβ sessions, per-keystroke validation, WPM (chars/5 Γ· min) and accuracy math, word bankstimer.rsβ countdown daemon thread emittingtimer://tick|done|idle-warning|idle-alerteventssound.rsβ dedicated rodio audio thread; all.wavs embedded viainclude_bytes!stats_db.rsβ SQLite persistence: session history, best scores, daily aggregates, streak
git clone https://github.com/<you>/RustType.git
cd RustType
npm install
npm run tauri devnpm run tauri buildOutputs a ready-to-use app and DMG installer:
src-tauri/target/release/bundle/macos/RustType.app
src-tauri/target/release/bundle/dmg/RustType_<version>_aarch64.dmg
The bundle is ad-hoc signed. For distribution outside your own machine, configure a Developer ID certificate and notarization in
tauri.conf.json.
βββ src/ # React frontend
β βββ components/
β β βββ practice/ # TimerPanel, TypingArea, VirtualKeyboard,
β β β # TextSourcePanel, IdleOverlay, CompleteScreen
β β βββ Sidebar.tsx
β β βββ TopBar.tsx
β βββ pages/ # Practice / Stats / Settings
β βββ lib/ # api.ts (typed invoke), settings.tsx, keyboardLayouts.ts
β βββ types.ts # Mirrors of the Rust structs
βββ src-tauri/ # Rust backend
βββ src/ # lib.rs, typing_engine, timer, sound, stats_db
βββ build.rs # Synthesizes .wav assets before compilation
βββ generate_sounds.rs
MIT



