<div align="center">
# 馃 termitype
[](https://crates.io/crates/termitype)
[](https://github.com/emanuel2718/termitype/actions)
[](https://opensource.org/license/GPL-3.0)
**Feature-rich terminal typing test**
<p align="center">
Heavily inspired by a certain typing test you might know.
<br />
<a href="#installation">Installation</a>
路
<a href="#usage">Usage</a>
路
<a href="#mappings">Mappings</a>
路
<a href="#options">Options</a>
路
<a href="#development">Development</a>
路
<a href="#contributing">Contributing</a>
路
<a href="#roadmap">Roadmap</a>
路
<a href="#acknowledgments">Acknowledgments</a>
</p>
</div>
<br />
<p align="center">
<img src="https://raw.githubusercontent.com/emanuel2718/termitype/main/assets/demo.gif" alt="Termitype demo" width="600">
</p>
## Installation
### Quick Install
Install the latest pre-built binary for your platform (recommended):
```sh
Binaries are available on the [GitHub releases page](https://github.com/emanuel2718/termitype/releases).
### Homebrew
```sh
brew tap emanuel2718/termitype
brew install termitype
```
### Arch Linux (AUR)
```sh
yay -S termitype
```
### From Crates.io
```sh
cargo install termitype
```
### From Source
```sh
cargo install --git https://github.com/emanuel2718/termitype.git termitype
```
## Usage
### Basic Usage
```sh
# Start typing
termitype
# See available CLI arg options (all options can also be configured via the in-game menu)
termitype --help
```
## Mappings
| `<C-Space>` | `Global` | Toggle Menu |
| `<C-c>` | `Global` | Quit Application |
| `<C-z>` | `Global` | Quit Application |
| `<C-o>` | `Global` | Toggle Command Palette |
| `<C-l>` | `Global` | Toggle Leaderboard Screen |
| `<C-t>` | `Global` | Randomize Theme |
| `<Esc>` | `Global` | Toggle Menu |
| `<S-N>` | `Results` | Restart |
| `<S-R>` | `Results` | Redo last test |
| `q` | `Results` | Quit Application |
| `m` | `Results` | Switch to `Minimal` Variant |
| `n` | `Results` | Switch to `Neofetch` Variant |
| `g` | `Results` | Switch to `Graph` Variant |
| `<Up>` | `Results` | Cycle to next ASCII Art |
| `<Down>` | `Results` | Cycle to previous ASCII Art |
| `<Esc>` | `Menu` | Go back |
| `/` | `Menu` | Start Search |
| `<C-y>/<CR>` | `Menu` | Confirm selection |
| `<Space>` | `Menu` | Toggle selection (if toggable item) |
| `<C-n>/<Down>` | `Menu` | Next item |
| `<C-p>/<Up>` | `Menu` | Previous item |
| `j/k` | `Menu` | Next/previous (in normal mode) |
## Options
| `-t`, `--time <SECONDS>` | Test duration in seconds. Enforces Time mode |
| `-w`, `--words <"WORD1 ..">` | Custom words for the test. Enforces Word mode |
| `-c`, `--count <COUNT>` | Number (count) of words to type |
| `-n`, `--use-numbers` | Include numbers in the test word pool |
| `-s`, `--use-symbols` | Include symbols in the test word pool |
| `-p`, `--use-punctuation` | Include punctuation in the test word pool |
| `-l`, `--language <LANG>` | Language dictionary the test will use |
| `--theme <THEME>` | The theme of the application |
| `--ascii <ASCII>` | The ASCII art used in the `Neofetch` results |
| `--cursor <STYLE>` | Cursor style variant: beam, block, underline, blinking-beam, blinking-block, blinking-underline |
| `--results <STYLE>` | Results style variant: minimal, neofetch, graph |
| `--lines <COUNT>` | Number of visible text lines [default: 3] |
| `--hide-live-wpm` | Hide live WPM counter |
| `--hide-notifications` | Hide notifications |
| `--no-save` | Do not save tests results |
| `--reset` | Resets everything back to default state |
### Examples
```sh
# All of the options below can also be changed at runtime via the menu.
termitype -t 60 # Run a 60-second typing test
termitype -c 100 # Test will contain exactly 100 random words
termitype --theme "catppuccin-mocha" # Use catppuccin-mocha theme
termitype -l spanish # Use Spanish test words
termitype -spn # Enable symbols, punctuation, and numbers
termitype --results neofetch # Use neofetch inspired results
termitype --no-save # Do not save tests results
termitype --hide-notifications # Do not show notifications
```
## Development
### Prerequisites
- Rust 1.87+
- Cargo
### Quick Start
1. **Clone the repository**:
```sh
git clone https://github.com/emanuel2718/termitype.git
cd termitype
```
2. **Run the application**:
```sh
# Development build
cargo run
# Release build
cargo run --release
```
## Themes
Termitype includes a curated collection of themes sourced from the [iTerm2 Ghostty Color Schemes Repo](https://github.com/mbadolato/iTerm2-Color-Schemes/tree/master/ghostty) repository. Themes can be previewed and changed in real-time.
## Contributing
> [!Warning]
> TODO: write out the contribution guideline just in the case there's one person interested in this.
## Roadmap
### Upcoming Features
- [ ] **Package Distribution**: Release on Homebrew, AUR, nixpkgs, etc.
- [ ] **User config file**: Have a user editable config file in `$XDG_CONFIG_HOME/termitype/config.toml`
- [ ] **Configurable Mappings**: Custom mappings
- [ ] **Custom ASCII arts**: Allow usage of custom ASCII arts
- [ ] **Custom theme**: Allow setting custom themes with names
- [ ] **Wordlist Improvements**: Improve the quality and distribution of words
- [ ] **Multiplayer**: Race other people in realtime with private rooms of sort (will use websockets for this)
- [x] **Local Results Tracking**: Track test results over time (best use case is to track highest WPM on specific modes) with opt-out option
## License
This project is licensed under the GPL-3.0 license - see [LICENSE](LICENSE) for details.
## Acknowledgments
- [Monkeytype](https://github.com/monkeytypegame/monkeytype) for the inspiration.
- [Ratatui](https://github.com/ratatui-org/ratatui) for the amazing TUI framework.
- [iTerm2 Ghostty Color Schemes](https://github.com/mbadolato/iTerm2-Color-Schemes/tree/master/ghostty) for the themes.