Pocket is a local-first typing tutor built for the MoErgo Glove 80 — an 80-key columnar split keyboard running open-source ZMK firmware, with its keys in vertical columns instead of the staggered rows every QWERTY typist has trained on for years, and heavily-used modifiers on programmable thumb clusters. Pocket reads your actual .keymap file, generates practice from five real-context corpora — LLM prompts, CLI commands, code, PII-scrubbed business email, and workplace chat — and tracks your per-key and per-bigram weakness with a recency-weighted engine, so every session drills the bigrams you're genuinely slow on rather than pseudo-words you'll never type. Local-first. No accounts. No cloud.
Reads your actual ZMK keymap
Drop your .keymap export from the MoErgo Layout Editor into keymaps/, and Pocket renders your Glove 80 live — layer by layer, Mac mod glyphs included — and generates targeted drills for each non-base layer and your thumb cluster. No other typing tutor does this for ZMK firmware.
Five corpora matching real dev work
LLM prompts (WildChat-style), CLI commands (tldr-pages style), TypeScript/Python/Bash code, PII-scrubbed Enron email, and hand-curated workplace chat — each corpus matches a real category of text you produce daily. No pseudo-words, no lorem ipsum.
Weakness engine targets your actual gaps
Every keystroke is logged and folded into per-key and per-bigram EMA stats. The text generator prefers corpus lines heavy in your worst bigrams, and the recommender shows exactly why it's suggesting today's session — or says 'not enough data yet' when it can't back a claim.
Layout fingerprint for honest A/B comparison
Every session and stat is stamped with a SHA-256 of your parsed keymap. Change your layout mid-experiment and your history stays clean — pre- and post-change results never silently blend, making keymap iteration measurable rather than impressionistic.
100% local, MIT licensed
npm start → localhost:3000. SQLite on disk, no telemetry, no cloud sync, no accounts. The full source is MIT — fork it, instrument it, run it offline indefinitely.
Pocket drilling a live Glove 80 keymap.
Key Concepts
- Weakness engine
- per-key and per-bigram recency-weighted stats built from every logged keystroke — ranks your worst bigrams by relative slowness plus error rate, then steers the text generator toward corpus lines that contain them.
- Layout fingerprint
- SHA-256 of your parsed ZMK keymap's bindings and layer names, stamped on every session row so results stay attributable to the exact layout that produced them.
- EMA fold
- exponential moving average applied to per-keystroke latency in timestamp order — gives recent sessions more weight, so the weakness engine reflects where you are today, not your week-one averages.
- Context
- one of five practice corpora (prompts, CLI, code, email, teams), each matching a real category of text you type at work; sessions, history, and the cross-context summary are all context-tagged.
- ZMK keymap awareness
- Pocket parses the .keymap file exported from the MoErgo Layout Editor, reads your layer bindings and thumb-cluster assignments, and uses them to drive both the live keyboard SVG and the layer/thumb-cluster drills.
Every corpus row carries its source and license; the Enron email seed was PII-scrubbed by hand, not regex. See PROVENANCE.md.
How It Differs
Keybr drills adaptive weak keys but uses pseudo-words and has no concept of your physical layout. Monkeytype nails flow UX but doesn't teach or adapt. ZSA's typ.ing offers live-keymap training, but only for QMK boards. Pocket is the only tutor that reads a ZMK keymap, generates practice from the real text categories you type daily, and stamps every result with a layout fingerprint — making it the only apples-to-apples measurement tool for Glove 80 owners who iterate on their keymaps.
Get Started
git clone https://github.com/stevebargelt/pocket && cd pocket
npm install && npm run seed
npm start