A feature-rich terminal-based typing speed test application written in Rust. Practice your typing skills with customizable tests, audio feedback, and detailed statistics tracking.
-
Multiple Test Modes
- Time Mode: Type for a set duration (15s, 30s, 60s, 100s)
- Words Mode: Complete a specific number of words (10, 25, 50, 100)
- Zen Mode: Practice without constraints
-
Multi-Language Support
- Practice typing in multiple languages: English, German, Spanish, French, Japanese
- 172,000+ real words from built-in dictionaries
- No external word files needed - all embedded in the application
- Switch languages instantly from settings
-
Keyboard Support
- Multiple keyboard layouts: QWERTY, AZERTY, DVORAK, QWERTZ
- Visual on-screen keyboard with real-time key highlighting
- Caps Lock detection and warning modal
-
Audio Feedback
- Mechanical keyboard sound samples
- Multiple switch types: MX Black, MX Blue, MX Brown, Topre, Holy Pandas, and more
- Toggle audio on/off
-
Statistics & Tracking
- Real-time WPM (Words Per Minute) and accuracy metrics
- Historical test results stored in SQLite database
- Profile view with recent test history
- Leaderboard showing top performances
- Graphical WPM progression during tests
-
Customization
- Fully themeable interface (see THEMING.md)
- Multiple preset themes included
- Toggle individual UI panels (mode, speed, timer, keyboard, etc.)
- Persistent settings across sessions
-
Terminal UI
- Clean, distraction-free interface
- Smooth rendering with crossterm backend
- Color-coded typing feedback (correct/incorrect characters)
- Rust 1.70 or higher
pkg-config(orpkgconfig)- ALSA development libraries (for audio support on Linux)
The provided script automatically detects your Linux distribution and installs the appropriate dependencies:
sudo ./scripts/install-deps.shThis script supports the following distributions:
- Debian-based: Ubuntu, Debian, Pop!_OS, Linux Mint, Elementary OS
- Red Hat-based: Fedora, CentOS, RHEL, Rocky Linux, AlmaLinux
- Arch-based: Arch Linux, Manjaro, EndeavourOS, Garuda Linux
- SUSE-based: openSUSE Leap/Tumbleweed, SUSE Linux Enterprise
- Others: Alpine Linux, Gentoo, Void Linux
If the automatic script doesn't work or you prefer manual installation:
Debian/Ubuntu/Pop!_OS/Mint:
sudo apt-get update
sudo apt-get install -y pkg-config libasound2-devFedora/CentOS/RHEL/Rocky Linux:
# Fedora 22+ (using dnf)
sudo dnf install -y pkgconfig alsa-lib-devel
# Older versions (using yum)
sudo yum install -y pkgconfig alsa-lib-develArch Linux/Manjaro/EndeavourOS:
sudo pacman -S pkg-config alsa-libopenSUSE:
sudo zypper install -y pkg-config alsa-develAlpine Linux:
sudo apk add pkgconfig alsa-lib-devGentoo:
sudo emerge dev-util/pkgconfig media-libs/alsa-libVoid Linux:
sudo xbps-install -y pkg-config alsa-lib-devel- Clone the repository:
git clone https://github.com/husseinhareb/term-typist.git
cd term-typist- Build and install:
make build
sudo make installThis will:
- Build the release binary with embedded word dictionaries
- Install the binary to
/usr/bin/
Simply run:
term-typist- Launch
term-typist - Select your test mode and parameters using arrow keys
- Press
Enterto start typing - Type the displayed text as accurately as possible
- Press
Escto restart or view results
Ctrl+C- Quit applicationEsc- Restart test / Return to main viewTab- Toggle menu (from main view)F1orm- Open menu
Arrow keys/hjkl- Navigate mode and optionsEnter- Start typing testp- Open profile (test history)l- Open leaderboards- Open settings
Backspace- Delete previous character- Type normally to complete the test
Arrow keys/hjkl- Navigate menu itemsEnter- Activate selected menu itemEsc- Close menu
Arrow keys/hjkl- Navigate settingsLeft/Right- Change selected optionl- Cycle keyboard layouts (QWERTY, AZERTY, DVORAK, QWERTZ)Left/Right on Language- Cycle test languages (English, German, Spanish, French, Japanese)t- Cycle themesk- Cycle keyboard switch soundsa- Toggle audio on/offEsc- Return to main view (applies language change)
Arrow keys/hjkl- Navigate test historyPage Up/Down- Fast navigationHome/End- Jump to start/endEsc- Return to main view
Shift+1- Toggle mode displayShift+2- Toggle value displayShift+3- Toggle state displayShift+4- Toggle speed displayShift+5- Toggle timer displayShift+6- Toggle text displayShift+7- Toggle keyboard display
term-typist stores its configuration and data in:
- Config:
~/.config/term-typist/ - Data:
~/.local/share/term-typist/
On first run, term-typist creates a default theme configuration at ~/.config/term-typist/theme.toml.
You can customize colors, UI elements, and visual appearance. See THEMING.md for a comprehensive guide.
term-typist includes several predefined themes that you can switch between in the settings:
- Catppuccin Mocha - Soothing pastel theme with mauve and teal accents
- Gruvbox Dark - Retro groove with warm, earthy tones
- Dracula - Dark theme with vibrant purples and cyans
- Solarized Dark - Precision colors for optimal readability in low light
- Solarized Light - Precision colors for optimal readability in bright light
- Nord - Arctic, north-bluish color palette
- One Dark - Atom's iconic One Dark theme
- Monokai - Sublime Text's classic color scheme
- Terminal - Plain black and white terminal colors for a minimalist look
To change themes, press s to open settings and use t to cycle through themes, or use the Left/Right arrow keys on the Theme setting row.
Example custom themes are available in the examples/ directory:
theme-dark.toml- Dark theme with muted colorstheme-colorful.toml- Vibrant theme with RGB colors
Keyboard switch sound samples are embedded in the application. Available switches include:
- MX Black, MX Blue, MX Brown
- Topre, Holy Pandas
- Buckling Spring
- Alps variants (Blue, Cream, etc.)
- And more...
term-typist/
├── src/
│ ├── main.rs # Entry point
│ ├── lib.rs # Main application loop
│ ├── app/ # Application state & input handling
│ ├── ui/ # UI rendering modules
│ ├── assets/audio/ # Embedded keyboard sound samples
│ ├── audio.rs # Audio playback system
│ ├── caps.rs # Caps Lock detection
│ ├── config.rs # Configuration management
│ ├── db.rs # SQLite database operations
│ ├── generator.rs # Text generation for tests (using random-word crate)
│ ├── graph.rs # WPM graph rendering
│ ├── theme.rs # Theme system
│ ├── themes_presets.rs # Built-in themes
│ └── wpm.rs # WPM calculation
├── examples/ # Example theme configurations
└── Cargo.toml # Rust dependencies
cargo build
cargo runcargo testmake cleanTo remove term-typist from your system:
sudo make uninstall
rm -rf ~/.config/term-typist
rm -rf ~/.local/share/term-typist- crossterm - Cross-platform terminal manipulation
- tui - Terminal UI framework
- rusqlite - SQLite database bindings
- rodio - Audio playback
- random_word - Multi-language word generation
- serde - Serialization framework
- toml - TOML parser
- chrono - Date and time handling
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENCE file for details.
Hussein Hareb
- Inspired by Monkeytype - A minimalistic typing test
- Keyboard sound samples inspired by kbs.im - Keyboard sounds simulator
- Mechanical keyboard sound samples from kbs.im








