Home

Awesome

ttyper

Crates.io GitHub Stars GitHub Workflow Status GitHub commit activity Discord License

ttyper is a terminal-based typing test built with Rust and Ratatui.

Recording

chat

If you're interested in contributing to ttyper, need help with an issue, or just want to hang out, you should join the development Discord server.

installation

pre-built binaries

Pre-built binaries are available for most architectures on GitHub releases. If your system is not supported or you have another problem, feel free to open an issue.

cargo

cargo install ttyper

arch linux

pacman -S ttyper

nix

nix-env -iA nixpkgs.ttyper # or nixos.ttyper on NixOS

scoop

scoop install ttyper

usage

For usage instructions, you can run ttyper --help:

ttyper 1.5.0
Terminal-based typing test.

USAGE:
    ttyper [FLAGS] [OPTIONS] [contents]

FLAGS:
    -d, --debug             
    -h, --help              Prints help information
        --list-languages    List installed languages
        --no-backtrack      Disable backtracking to completed words
        --sudden-death      Enable sudden death mode to restart on first error
    -V, --version           Prints version information

OPTIONS:
    -c, --config <config>                  Use config file
    -l, --language <language>              Specify test language
        --language-file <language-file>    Specify test language in file
    -w, --words <words>                    Specify word count [default: 50]

ARGS:
    <contents>

examples

commandtest contents
ttyper50 of the 200 most common english words
ttyper -w 100100 of the 200 most common English words
ttyper -w 100 -l english1000100 of the 1000 most common English words
ttyper --language-file lang50 random words from the file lang
ttyper text.txtcontents of text.txt split at newlines

languages

The following languages are available by default:

namedescription
cThe C programming language
csharpThe C# programming language
english100100 most common English words
english200200 most common English words
english10001000 most common English words
english-advancedAdvanced English words
english-pirate50 pirate speak English words
french100100 most common French words
french200200 most common French words
french10001000 most common French words
german207 most common German words
german10001000 most common German words
german1000010000 most common German words
goThe Go programming language
htmlHyperText Markup Language
javaThe Java programming language
javascriptThe Javascript programming language
norwegian200 most common Norwegian words
phpThe PHP programming language
portuguese100 most common Portuguese words
portuguese200200 most common Portuguese words
portuguese10001000 most common Portuguese words
portuguese-advancedAdvanced Portuguese words
pythonThe Python programming language
qtThe QT GUI framework
rubyThe Ruby programming language
rustThe Rust programming language
spanish100 most common Spanish words
ukrainian100 most common Ukrainian words

Additional languages can be added by creating a file in TTYPER_CONFIG_DIR/language with a word on each line. On Linux, the config directory is $HOME/.config/ttyper; on Windows, it's C:\Users\user\AppData\Roaming\ttyper; and on macOS it's $HOME/Library/Application Support/ttyper.

config

Configuration is specified by the config.toml file in the config directory (e.g. $HOME/.config/ttyper/config.toml).

The default values with explanations are below:

# the language used when one is not manually specified
default_language = "english200"

[theme]
# default style (this includes empty cells)
default = "none"

# title text styling
title = "white;bold"

## test styles ##

# input box border
input_border = "cyan"
# prompt box border
prompt_border = "green"

# border type
border_type = "rounded"

# correctly typed words
prompt_correct = "green"
# incorrectly typed words
prompt_incorrect = "red"
# untyped words
prompt_untyped = "gray"

# correctly typed letters in current word
prompt_current_correct = "green;bold"
# incorrectly typed letters in current word
prompt_current_incorrect = "red;bold"
# untyped letters in current word
prompt_current_untyped = "blue;bold"

# cursor character
prompt_cursor = "none;underlined"

## results styles ##

# overview text
results_overview = "cyan;bold"
# overview border
results_overview_border = "cyan"

# worst keys text
results_worst_keys = "cyan;bold"
# worst keys border
results_worst_keys_border = "cyan"

# results chart default (includes plotted data)
results_chart = "cyan"
# results chart x-axis label
results_chart_x = "cyan"
# results chart y-axis label
results_chart_y = "gray;italic"

# restart/quit prompt in results ui
results_restart_prompt = "gray;italic"

style format

The configuration uses a custom style format which can specify most ANSI escape styling codes, encoded as a string.

Styles begin with the color specification, which can be a single color (the foreground), or two colors seperated by a colon (the foreground and background). Colors can be one of sixteen specified by your terminal, a 24-bit hex color code, none, or reset.

After the colors, you can optionally specify modifiers seperated by a semicolon. A list of modifiers is below:

Some examples:

In extended Backus-Naur form:

style     = colors, { ";", modifier }, [ ";" ] ;

colors    = color, [ ":", color ] ;
color     = "none"
          | "reset"
          | "black"
          | "white"
          | "red"
          | "green"
          | "yellow"
          | "blue"
          | "magenta"
          | "cyan"
          | "gray"
          | "darkgray"
          | "lightred"
          | "lightgreen"
          | "lightyellow"
          | "lightblue"
          | "lightmagenta"
          | "lightcyan"
          | 6 * hex digit ;
hex digit = ? hexadecimal digit; 1-9, a-z, and A-Z ? ;

modifier  = "bold"
          | "crossed_out"
          | "dim"
          | "hidden"
          | "italic"
          | "rapid_blink"
          | "slow_blink"
          | "reversed"
          | "underlined" ;

border types

The following border types are supported in the config file.

If you're familiar with serde, you can also read the deserialization code.