Typing While LLM Thinks
While Claude Code, Copilot, or Cursor is generating its answer, you're staring at a loading spinner. This extension turns that wait into typing practice — and gets out of your way the moment the model replies.

What it does
- A typing trainer lives in a side panel of VSCode.
- When the LLM starts generating, the trainer activates. When the LLM replies, it pauses and focus jumps back to your terminal or editor automatically.
- A linear course walks you from the home row through punctuation and sentences. Each lesson unlocks the next. There's also a free-play mode for when you already know what you're doing.
- Languages: English, Spanish, and Russian (with the ЙЦУКЕН layout).
- A small on-screen keyboard shows which finger to use for the next key.
Auto mode for Claude Code
Claude Code can fire shell hooks on lifecycle events. The extension exposes three local HTTP endpoints on 127.0.0.1:9785 and ships hooks that ping them. Add this to ~/.claude/settings.json (merge with any existing hooks block):
{
"hooks": {
"UserPromptSubmit": [
{ "hooks": [{ "type": "command", "command": "curl -s -m 1 -X POST http://127.0.0.1:9785/llm/start >/dev/null 2>&1 || true" }] }
],
"Stop": [
{ "hooks": [{ "type": "command", "command": "curl -s -m 1 -X POST http://127.0.0.1:9785/llm/stop >/dev/null 2>&1 || true" }] }
],
"Notification": [
{ "hooks": [{ "type": "command", "command": "curl -s -m 1 -X POST http://127.0.0.1:9785/llm/notify >/dev/null 2>&1 || true" }] }
]
}
}
The full example file is bundled in hooks/claude-code-settings.example.json in the repo.
Manual mode
Keybindings, in case auto isn't wired up:
| Action |
mac |
Linux / Windows |
| Start trainer |
⌘+⌥+T |
Ctrl+Alt+T |
| Stop trainer |
⌘+⌥+Y |
Ctrl+Alt+Y |
| Toggle |
⌘+⌥+U |
Ctrl+Alt+U |
Or run Typing Trainer: Open Panel from the Command Palette.
Lessons
The course is the same for every language, only the characters change:
- Home row keys
- Home row words
- Top row keys
- Top + home words
- Bottom row keys
- All letters mix
- Common words
- Longer words
- Capitalization
- Numbers row
- Punctuation
- Sentences
- Code snippets
Completing a lesson unlocks the next one. Best WPM and accuracy per lesson are saved per-user via VSCode's global state.
Settings
typingTrainer.exerciseLanguage — en, es, or ru.
typingTrainer.showFingerMap — show the on-screen keyboard with finger highlighting.
typingTrainer.autoStartFreePlay — never, whenIdle (default), or always. Decides whether free play kicks in automatically on LLM start.
typingTrainer.refocusOnStop — where focus goes when the LLM replies. Default terminal.
typingTrainer.httpPort — local port for hook signals. Default 9785.
typingTrainer.enableHttpServer — turn the hook server off if you only want manual keybindings.
Notes on Russian
The Russian course uses the standard ЙЦУКЕН layout. You need to switch your system keyboard to Russian before starting — the extension only sees the characters your OS sends. If you type Latin while the lesson expects Cyrillic, you'll see a hint banner.
Limits
- Auto mode currently works with tools that expose lifecycle hooks. Claude Code is the canonical case. Copilot Chat and Cursor don't expose comparable events yet — for those, use the manual keybindings.
- The HTTP server binds to
127.0.0.1 only. External requests are rejected.
- One VSCode window at a time can hold the port. Other windows will log a benign warning.
License
MIT.