chuma-beep
typist
Go

A cross-platform CLI and Web UI typing application built for developers to master speed and syntax.

Last updated May 28, 2026
21
Stars
2
Forks
0
Issues
0
Stars/day
Attention Score
27
Language breakdown
Go 72.7%
HTML 27.2%
Dockerfile 0.2%
β–Έ Files click to expand
README

╔══════════════════════════════════════════════════════════════════╗
β•‘                                                                  β•‘
β•‘     β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ•—   β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—               β•‘
β•‘     β•šβ•β•β–ˆβ–ˆβ•”β•β•β•β•šβ–ˆβ–ˆβ•— β–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β•šβ•β•β–ˆβ–ˆβ•”β•β•β•               β•‘
β•‘        β–ˆβ–ˆβ•‘    β•šβ–ˆβ–ˆβ–ˆβ–ˆβ•”β• β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—   β–ˆβ–ˆβ•‘                  β•‘
β•‘        β–ˆβ–ˆβ•‘     β•šβ–ˆβ–ˆβ•”β•  β–ˆβ–ˆβ•”β•β•β•β• β–ˆβ–ˆβ•‘β•šβ•β•β•β•β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘                  β•‘
β•‘        β–ˆβ–ˆβ•‘      β–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘     β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘   β–ˆβ–ˆβ•‘                  β•‘
β•‘        β•šβ•β•      β•šβ•β•   β•šβ•β•     β•šβ•β•β•šβ•β•β•β•β•β•β•   β•šβ•β•                  β•‘
β•‘                                                                  β•‘
β•‘              A fast, offline typing test                         β•‘
β•‘         No account. No paywall. No internet required.            β•‘
β•‘                                                                  β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

A fast, offline typing test
No account. No paywall. No internet required.

stars forks issues license go version


demo


Table of Contents


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

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 image

4. 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
Launch with:
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                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Back to Top

πŸ”— More in this category

Β© 2026 GitRepoTrend Β· chuma-beep/typist Β· Updated daily from GitHub