A cross-platform CLI and Web UI typing application built for developers to master speed and syntax.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β β β ββββββββββββ ββββββββββ ββββββββββββββββββββ β β βββββββββββββ ββββββββββββββββββββββββββββββββ β β βββ βββββββ βββββββββββββββββββ βββ β β βββ βββββ βββββββ βββββββββββ βββ β β βββ βββ βββ βββββββββββ βββ β β βββ βββ βββ βββββββββββ βββ β β β β A fast, offline typing test β β No account. No paywall. No internet required. β β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
A fast, offline typing test
No account. No paywall. No internet required.

Table of Contents
- Features
- Quick Start
- Installation
- Usage
- Terminal UI
- Web UI
- Code Mode
- Blind Mode
- Scores & Export
- Architecture
- Roadmap
- License
Features
ββββββββββββββββββββββββββββββββββ¬βββββββββββ¬βββββββββββ β Feature β Terminal β Web β ββββββββββββββββββββββββββββββββββΌβββββββββββΌβββββββββββ€ β Word Mode β 30 common words β β β β β β Time Mode β 15/30/60/120s β β β β β β Quote Mode β Literary excerpts β β β β β β Code Mode β Go/JS/Python/Rust β β β β β β Syntax Highlighting (Chroma) β β β β β β Live WPM + Accuracy Stats β β β β β β WPM Graph Over Time βSparkline β Chart.js β β Mistake Heatmap β Top-6 βKeyboard β β Blind Mode (muscle memory) β β β β β β Persistent Personal Bests β β β β β β Session History (last 200) β β β β β β Export to JSON / CSV β β β β β β Single Binary, Zero Deps β β β β β ββββββββββββββββββββββββββββββββββ΄βββββββββββ΄βββββββββββ
Installation
go install github.com/chuma-beep/typist/v2@latest
Prerequisite
- Go 1.21+ β Download here
Build from Source
# 1. Clone the repository
git clone https://github.com/chuma-beep/typist
cd typist
2. Install dependencies
go mod tidy
3. Build the binary
go build -o typist .
4. Move to your PATH (optional)
mv typist ~/.local/bin/ # Linux/Mac
or
mv typist $GOPATH/bin/ # If GOPATH is set
Quick Start with Docker
Run Typist instantly β no need to install Go or any dependencies.
Steps
1. Clone the repository:
git clone https://github.com/chuma-beep/typist.git cd typist 2. Run the application: docker compose up --build 3. Open the app in your browser: http://localhost:33241
Features
Multi-stage Dockerfile (Go β Alpine) for a small and secure image Non-root user for better security Only the compiled binary is shipped in the final image4. Stop the app with:
docker compose down Usage
typist # Launch terminal UI
typist --web # Launch web UI on random free port
typist --help # Show all options
Terminal UI
Terminal UIβββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β CONTROLS β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Menu β β β β Switch mode β β β β Switch sub-row (time/lang) β β Enter Start test β β Esc/q Quit β β β β Typing β β Ctrl+R Restart with new text β β Ctrl+B Toggle Blind Mode β β Tab Type tab (code mode) β β Enter Type newline (code mode) β β Esc Quit β β β β Results β β Enter/R Try again β β M Back to menu β β H View session history β β J Export to JSON β β C Export to CSV β β Esc Quit β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Web UI
The web interface provides a beautiful browser-based experience with:
- Chart.js WPM graphs
- Visual keyboard mistake heatmap
- Same core typing engine as TUI
- Responsive design
typist --web
The server automatically picks a free port on 127.0.0.1 β no conflicts, no firewall prompts.
Code Mode Type real snippets with syntax highlighting powered by Chroma:
ββββββββββββββ¬βββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ β Language β Snippets β Examples β ββββββββββββββΌβββββββββββΌβββββββββββββββββββββββββββββββββββββββββ€ β Go β 8 β Generics, channels, linked lists β β JavaScript β 6 β Debounce, memoize, EventEmitter β β Python β 5 β Quicksort, LRU cache, decorators β β Rust β 5 β Pattern matching, traits, generics β ββββββββββββββ΄βββββββββββ΄βββββββββββββββββββββββββββββββββββββββββ
Blind Mode
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β Ctrl+B β Every char becomes Β· (green=correct, red=wrong) β β β β Forces typing from memory. Essential for muscle memory. β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Scores & Export
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β Storage: ~/.typist/scores.json β β β β Export (from results screen): β β J β ~/typist-export-<timestamp>.json β β C β ~/typist-export-<timestamp>.csv β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Tech Stack
ββββββββββββββββββββββ¬ββββββββββββββββββββββββββ¬βββββββββββββββββββ β Component β Technology β Purpose β ββββββββββββββββββββββΌββββββββββββββββββββββββββΌβββββββββββββββββββ€ β TUI Framework β Bubble Tea β Elm architecture β β Terminal Styling β Lipgloss β Colors/layout β β Syntax Highlight β Chroma v2 β 300+ languages β β Web Charts β Chart.js β WPM graphs β β Core β Go Standard Library β HTTP, JSON, CSV β ββββββββββββββββββββββ΄ββββββββββββββββββββββββββ΄βββββββββββββββββββ
Architecture
typist/
βββ main.go # Entry point, --web flag
βββ model.go # Bubble Tea model β all states, update, view
βββ highlight.go # Chroma tokenizer β lipgloss StyleMap
βββ words.go # Word/quote/code generation + line wrapping
βββ snippets.go # Code snippet library (Go, JS, Python, Rust)
βββ scores.go # Persistent scores, PB tracking, JSON/CSV export
βββ styles.go # lipgloss styles (Catppuccin Mocha)
βββ web.go # Embedded HTTP server for --web mode
βββ web/
β βββ index.html # Single-file web UI (Chart.js, no other deps)
βββ quotes.json # Embedded literary quotes
Key Design Decisions
| Decision | Rationale | |:---|:---| | go:embed | Bakes quotes.json and web/index.html into the binary β zero runtime assets needed | | Random Free Port | Server picks a random port on 127.0.0.1 β no conflicts, no firewall issues | | Server-Side Tokenization | Syntax highlighting happens via Chroma; only token kinds sent to web UI β no duplicate tokenizer in JS | | Line Wrapping | Code uses wrapCodeLines (splits on \n, preserves indentation); prose uses wrapIntoLines (soft-wraps at 60 chars) | | Pure Value Types | Bubble Tea model returns new Model on every transition β no pointer mutation in the update loop |
Roadmap
- [ ] WPM graph in TUI (unicode sparkline β full bar chart)
- [ ] Dark / light theme toggle
- [ ] Focus mode (hide stats while typing)
- [ ] Custom text mode (paste your own code)
- [ ] WebAssembly build for browser deployment (no server needed)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β MIT License β github.com/chuma-beep/typist β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ