Terminal typing practice with code modes, replays, and a wpm chart. Inspired by Monkeytype, but it never leaves your terminal.
- For fun. I wanted to stop tabbing out to a browser to warm up, so I wrote the thing I kept opening.
- Eight text modes, including Go, SQL, Python, shell and regex snippets, where spaces and brackets are part of the practice.
- Every run is recorded keystroke by keystroke and can be watched back at the speed it was typed.
- A per-second wpm chart, a consistency score, and a heatmap of the characters you actually miss.
- Blind mode, zen mode, and a min-wpm threshold that ends the run when you slow down.
- Downloadable word lists, three themes, shell completions, and a man page.
- One static binary. No browser, no runtime, no config file to write by hand.
curl -fsSL https://raw.githubusercontent.com/alirezaudev/ttype/main/install.sh | shOr, if you would rather use wget:
wget -qO- https://raw.githubusercontent.com/alirezaudev/ttype/main/install.sh | shThe script picks the right build for your machine, checks it against
checksums.txt, and installs the binary and the man page under /usr/local —
or ~/.local, if that is where it can write. After that, ttype update does
the same thing in place. It leaves copies installed by a package manager or
go install alone and tells you the command to use instead.
Download ttype_<version>_windows_amd64.tar.gz (or _arm64) from the
latest release, unpack
it, and put ttype.exe somewhere on your PATH.
go install github.com/alirezaudev/ttype/cmd/ttype@latestThe binary lands in $(go env GOPATH)/bin, so make sure that is on your PATH.
Needs Go 1.26:
git clone https://github.com/alirezaudev/ttype.git
cd ttype
make build
./bin/ttypettype uninstall removes the binary and the man page, and --purge takes your
history with it. If the binary is already gone:
curl -fsSL https://raw.githubusercontent.com/alirezaudev/ttype/main/uninstall.sh | shttype # 60 second timed test
ttype --time 30 # a shorter one
ttype --words 25 # race a word count instead of the clock
ttype --mode go # Go snippets instead of prose
ttype --language spanish # downloaded once, cached after that
ttype --punctuation --numbers
ttype --blind # no feedback until the run ends
ttype --zen # words only, nothing else on screen
ttype --min-wpm 60 # fail the run if you drop below 60
ttype --seed 42 # same text, every timeEight modes: words sentences sql go backend python shell regex.
In the two word modes, space commits the current word and skips whatever is left of it — the same as the reference app. The code modes keep spaces literal, because indentation is part of what you are practising.
Whatever you set in the settings panel (ctrl+s, or S on the result screen)
becomes the default for next time, so the flags are for one-offs.
While typing
| Key | Action |
|---|---|
backspace |
Delete a character |
ctrl+backspace ctrl+w alt+backspace |
Delete the word and the space after it |
space |
Next word, skipping the rest of this one |
ctrl+o |
Toggle the live stats line |
ctrl+s |
Settings, without leaving the run |
tab enter |
Restart with fresh text |
? |
Help — before the first keystroke; after that it is just a character |
esc ctrl+c |
Quit |
On the result screen
| Key | Action |
|---|---|
tab enter r |
Restart |
p |
Watch the replay |
C |
Copy the result line |
S |
Settings |
M |
Mode picker |
L |
Language picker |
u |
Releases page, when there is a newer version |
esc q |
Quit |
Watching a replay (p on the result screen, or enter on a row in ttype history)
| Key | Action |
|---|---|
space |
Pause |
1 2 4 |
Speed |
r |
Start over |
esc q |
Back |
| Command | What it does |
|---|---|
ttype history |
Past runs in a table; enter plays one back keystroke by keystroke |
ttype stats |
Averages and bests — --trend draws a sparkline, --export csv dumps the lot |
ttype config |
Show or change the saved defaults |
ttype languages |
List cached word lists; languages download fetches every one |
ttype clear |
Delete history, languages, or both |
ttype doctor |
Check the terminal, locale, clipboard and data directory |
ttype update |
Update to the latest release |
ttype uninstall |
Remove the binary and man page; --purge takes your data too |
ttype completion |
Completion script for bash, zsh, fish or powershell |
Shell completions are also generated into contrib/completions/, and
contrib/zsh/ has a plugin that sets them up along with a tt alias.
- wpm — correct characters ÷ 5, over the time taken.
- raw — every character typed, right or wrong.
- accuracy — correct keystrokes as you typed them. Backspacing over a mistake fixes the text, not the accuracy.
- consistency — how even your per-second speed was. Steady beats spiky, even at the same average.
- chars — correct / incorrect / extra / skipped.
Personal bests are tracked per configuration, so a 60 second English run is never measured against a 15 second Spanish one with punctuation on.
| Path | Contents |
|---|---|
~/.config/ttype/config.json |
Saved defaults |
~/.local/share/ttype/history.json |
Every run, newest 1000 kept |
~/.local/share/ttype/bests.json |
Personal bests |
~/.local/share/ttype/replays/ |
Recorded runs, newest 50 kept |
~/.local/share/ttype/languages/ |
Downloaded word lists |
XDG_CONFIG_HOME and XDG_DATA_HOME are honoured; NO_COLOR turns the colour
off. Persian, Arabic and Hebrew are drawn right to left by ttype, except in
terminals that do it themselves (GNOME Terminal and other VTE ones, Konsole,
mlterm); if the words still come out backwards, set TTYPE_BIDI=ttype, or
TTYPE_BIDI=terminal if they are reversed twice. man ttype has the long
version of all of this.






