Self-hosted · Local-first · Split-native
Velocitype is a self-hosted, adaptive touch-typing trainer built for the Ferris Sweep and Corne. An AI coach runs inside your own Docker stack, finds the keys and finger-fumbling letter pairs that slow you down, and drills them away — and not a single keystroke ever leaves your machine.
The loop
Every number you see is computed on your machine, in code. The AI never scores you — it reads the numbers and turns them into plain-language advice and a drill aimed at your weakest keys.
Start with a handful of keys; each new one unlocks as you reach a share of your target speed. Monkeytype-style timed sessions whenever you want them.
Speed, accuracy, per-key latency, same-finger bigrams and rhythm consistency — all computed locally and deterministically, never by the model.
A local LLM reads the numbers and names the keys, letter pairs and rhythm hitches that hold you back — which finger, which hand — in a few honest sentences.
It writes a fresh word list built around exactly your weak keys or letter pairs, verified to actually contain them. Then you go again.
The app
A clean, keyboard-first interface that runs entirely on your machine. Click any shot to enlarge.
Why Velocitype
Most trainers treat a keyboard as one flat QWERTY slab. Velocitype knows your board has two halves, that your layout is Colemak-DH, and that the fix for a slow key depends on the finger that owns it.
Real finger and hand maps for Colemak-DH and QWERTY on both the Ferris Sweep and the Corne — so it spots the same-finger bigrams and awkward rolls that generic trainers can't even see. The heatmap is shaped like your actual board, not a row-stagger slab.
The coach is an Ollama model in your own stack. Pull and switch models straight from the web UI. There is no account with us, no telemetry, no phone-home — because there is no “us” in the loop at all.
Want a stronger coach without running a big local model? Optional Mistral support is built in — chosen deliberately as a European provider under EU data protection, rather than a US or Chinese frontier lab.
The coach
The provider, the model, and even the coaching prompts are per-user settings. Start fully offline; reach for the cloud only if and when you want to.
A local model runs in the Ollama container beside the app. Nothing leaves your computer.
Prefer a larger model? Add a Mistral key per user and switch provider in settings.
What's inside
keybr-style: you start on a few keys and unlock the next once every active key holds its share of your target speed. Threshold and window are yours to tune.
Same-finger bigrams, inward/outward rolls, redirects, inter-key rhythm consistency and hesitation hitches — measured per letter pair, with SFBs flagged.
A Ferris/Corne heatmap that colours each key by how much it's holding you back — cool for solid, hot for weak — with locked keys shown until you unlock them.
Tick weak keys or bigrams in the Analysis tables and generate a coach drill aimed at exactly those — coverage-verified, with a deterministic fallback.
Don't like the coaching voice? The analysis and drill prompts are yours to rewrite, per user, right in the settings.
Sessions and stats live in your own Postgres and sync across your browsers. One password-confirmed click really deletes all of it — rows gone, not flagged.
Quickstart
Clone it, copy the example environment file, and bring the stack up. Then open the app, create a local account, and pull a coaching model from the AI settings — all from the browser.
# grab the source git clone https://github.com/one7two99/velocitype.git cd velocitype # configure, then generate the JWT keypair cp .env.example .env ./secrets/keygen.sh # bring up the whole stack docker compose up --build # open the app, register, then pull a # coaching model in Settings → AI open http://localhost:8080/
On the workbench
Everything above ships today — including full bigram, same-finger-bigram and rhythm analysis. These are the next ideas in the queue, not yet built.