Typeburn

module
v2.9.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2026 License: MIT

README

Typeburn

CI Release Go Go Reference License

A Monkeytype-style terminal typing test built with Go and Bubble Tea v2. Distraction-free, keyboard-driven, and works on any ANSI terminal.

Features

  • Four test modes: Time (15/30/60/120 s), Words (10/25/50/100 words), Quote (short/medium/long/epic), Code (your own text via --text or in-app paste)
  • Live stats: WPM, raw WPM, accuracy, and consistency updated every keystroke
  • Result screen: big wpm + acc hero, dual-axis WPM/errors line graph that fills its panel, aligned stats column, most-missed keys — the panel is capped and centred so it reads the same on a laptop and a full-screen terminal
  • Subtle motion: animated caret (blink + fade), result reveal (WPM count-up, graph draw-in), new-best celebration, and Typing→Result transition — always on, auto-adapts to NO_COLOR (layout never shifts)
  • History: scrollable table of all past tests with personal-best markers (★) for eligible runs: Time/Words by mode + length and Quote by mode; Code and Strict runs never qualify
  • Themes: default, mono, solarized-dark, solarized-light, dracula, nord, gruvbox-dark, gruvbox-light; mono is a grayscale color palette
  • Strict mode: optional letter-strict mode that blocks wrong keypresses at the cursor, logging errors for keystroke-level accuracy, and excluding strict runs from personal best (★) records.
  • Punctuation & numbers: optional Settings toggles that mix commas/periods/capitalization and random numbers into Words/Time mode tests.
  • NO_COLOR support: any non-empty NO_COLOR value forces a fully attribute-only render (reverse, bold, underline, faint; no color codes), regardless of the selected theme
  • Minimum terminal: 60 columns × 20 rows; graceful degraded notice below that
  • XDG-compliant paths: settings and history go to $XDG_CONFIG_HOME / $XDG_DATA_HOME

Installation

1. Quick install (Linux/macOS, no Go toolchain):

curl -fsSL https://raw.githubusercontent.com/bavanchun/Typeburn/main/install.sh | sh

Detects your OS/arch, downloads the matching release archive, verifies its sha256 against checksums.txt, and installs typeburn into ~/.local/bin (no sudo). Override the target with BIN_DIR=… or pin a tag with VERSION=vX.Y.Z.

Trust boundary — read before piping any script to a shell. The sha256 check defends against a corrupted or man-in-the-middled download. It does not make curl … | sh inherently safe: the script, the archive, and checksums.txt all come from the same GitHub release (and checksums.txt is unsigned), so a compromised release would be self-consistent. If that boundary matters to you, use the non-piped audit path instead:

curl -fsSL -o install.sh https://raw.githubusercontent.com/bavanchun/Typeburn/main/install.sh
less install.sh        # read it
sh install.sh          # then run it

Windows is not covered by install.sh (POSIX sh only) — use the manual archive below.

2. go install (latest tagged release):

go install github.com/bavanchun/Typeburn/v2/cmd/typeburn@latest

The module path is case-sensitive — the capital T in Typeburn is required. go install installs an executable named typeburn (lowercase) into $(go env GOPATH)/bin.

A freshly published release may lag the Go module proxy by up to ~1 hour; until the proxy ingests the tag, go install ...@vX.Y.Z can 404. Downloading the release binary (below) is immediate and unaffected.

Requires Go 1.25+.

3. Download a pre-built binary:

Grab the archive for your OS/arch from the latest release (linux/darwin/windows × amd64/arm64), verify it against checksums.txt, extract, and run the typeburn binary (all install channels produce a lowercase typeburn).

4. Build from source:

make build            # → ./bin/typeburn (lowercase, local convention)
# or
go build -o typeburn ./cmd/typeburn
make run               # run without installing (or: go run ./cmd/typeburn)

5. Homebrew (macOS/Linux):

brew install bavanchun/tap-typeburn/typeburn

A cask wrapping the prebuilt release archive (no Go/Xcode toolchain needed).

Usage

typeburn                         # open the TUI Home screen
typeburn -h                      # styled help with subcommands
typeburn run --mode time --duration 30 --theme nord
typeburn history --json
typeburn config set theme nord
typeburn replay testdata/sample-keystroke-log.json --json
typeburn --version               # v1-compatible alias
typeburn --text snippet.go       # v1-compatible Code mode alias

In Code mode you type the supplied text exactly — every space, tab, and line break — and the test finishes on an exact match. Without --text, tab to the Code row and press enter to open the in-app paste screen, bracket-paste a snippet, then press enter to start. Code runs appear in History but never set a ★ personal best.

See docs/cli-reference.md for the full subcommand surface, JSON shapes, exit codes, and raw --no-tui limitations.

Check for updates
typeburn version --check-update          # always hits network, human-readable
typeburn version --check-update --json   # machine-readable JSON

Opt-in automatic check on TUI launch (result cached 24 h):

typeburn config set update_check on

When enabled, every TUI launch runs a background check with an 800 ms timeout. If a newer stable release is found, the Result screen shows a muted footer hint: ↑ v2.1.0 available — run "typeburn update".

Self-update
typeburn update            # confirm, then download + install the latest release
typeburn update --check    # report availability only, never installs
typeburn update --yes      # skip the confirmation prompt (needed for non-interactive use)

update downloads the matching release archive, verifies it against the published SHA-256 checksums.txt over HTTPS, then atomically replaces the running binary in place. Integrity rests on TLS + checksums — the same trust model as curl install.sh | sh. Release binaries are unsigned, so this detects a corrupted or truncated download, not a compromised release host (see SECURITY.md).

Builds installed by a package manager are not self-updated: a Homebrew or go install binary prints the matching upgrade command (brew upgrade typeburn / go install github.com/bavanchun/Typeburn/v2/cmd/typeburn@latest) and exits without touching anything. On a non-interactive stream (pipe/redirect) update refuses unless --yes is passed, rather than blocking on a prompt.

The minimum usable terminal size is 60 columns × 20 rows. If the terminal is too small the app shows a resize prompt and resumes automatically once you resize.

Keybindings

Global (every screen)
Key Action
ctrl+c Quit immediately
esc Back / cancel (on Home: shows quit prompt)
ctrl+r Restart with fresh test
1 Go to Home
2 Go to Settings
3 Go to History
Home / Welcome
Key Action
tab / shift+tab Cycle mode forward / backward (Time → Words → Quote → Code)
/ h l Change length option
enter / space Start test
Typing Test
Key Action
(any printable) Type that character
backspace Delete last character
tab Restart same test
ctrl+r New test (re-pick words)
esc Abort → Home
Result Summary
Key Action
tab / enter Restart same mode and length
ctrl+r New test
esc / 1 Back to Home
3 View History
Settings
Key Action
/ k j Move selection
/ h l / enter Cycle / toggle selected value
esc / 1 Save and back to Home (auto-persists)
History
Key Action
/ k j Scroll rows
g Jump to top
G (shift+g) Jump to bottom
esc / 1 Back to Home

Configuration & Data Paths

Settings and history follow the XDG Base Directory Specification.

File Default path (macOS / Linux) Override
Settings ~/.config/typeburn/settings.json $XDG_CONFIG_HOME
History ~/.local/share/typeburn/history.json $XDG_DATA_HOME
Update-check cache ~/.local/state/typeburn/update-check.json $XDG_STATE_HOME

A history file that cannot be parsed is never overwritten: it is renamed to history.json.corrupt-<timestamp> beside the original and the app says so, so the records stay recoverable by hand.

Development

make test        # go test ./...
make test-race   # go test ./... -race -count=1
make lint        # gofmt -l check + go vet
make fmt         # gofmt -w .
make build       # ./bin/typeburn
make clean       # remove ./bin/

CI runs on ubuntu-latest and macos-latest via GitHub Actions (.github/workflows/ci.yml). Steps: build → vet → gofmt check → test with race detector.

License

MIT — see LICENSE.

Directories

Path Synopsis
cmd
typeburn command
internal
anim
Package anim holds pure, UI-free motion math: easing curves, color and value interpolation, a time-driven tween, and a clock that reports whether any animation is still live.
Package anim holds pure, UI-free motion math: easing curves, color and value interpolation, a time-driven tween, and a clock that reports whether any animation is still live.
app
Package app holds the Bubble Tea root model.
Package app holds the Bubble Tea root model.
cli
codetext
Package codetext loads and normalizes user-supplied text/code for the Code typing mode.
Package codetext loads and normalizes user-supplied text/code for the Code typing mode.
config
Package config holds user settings, key bindings, and platform paths.
Package config holds user settings, key bindings, and platform paths.
metrics
Package metrics derives all typing metrics post-hoc from a keystroke log.
Package metrics derives all typing metrics post-hoc from a keystroke log.
mode
Package mode defines typing-test modes and their selectable lengths.
Package mode defines typing-test modes and their selectable lengths.
runner
Package runner builds typing sessions shared by the TUI and CLI paths.
Package runner builds typing sessions shared by the TUI and CLI paths.
storage
Package storage handles reading and writing user data to disk.
Package storage handles reading and writing user data to disk.
theme
Package theme defines the role-based color system.
Package theme defines the role-based color system.
typing
Package typing implements the pure, UI-free typing engine and keystroke log.
Package typing implements the pure, UI-free typing engine and keystroke log.
ui
Package ui contains the Bubble Tea sub-models for each screen.
Package ui contains the Bubble Tea sub-models for each screen.
version
Package version exposes the build-time version of typeburn.
Package version exposes the build-time version of typeburn.
words
Package words produces target strings for typing tests.
Package words produces target strings for typing tests.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL