The problem
Command-line fluency does not come from reading about commands. It comes from running them, under a little pressure, until your hands know them. I wanted that fluency in the terminal, in Git, and in Claude Code, and studying a list was not getting me there. So instead of only drilling commands, I built the thing I would practise with: a small game I would actually open again. It was my first real build, and it was meant to be.
The approach
A prompt appears, four command tokens surround the Phantom, and you steer it to the right one. Arcade mode keeps score and takes a spirit for every miss. Learn mode drops the pressure and escalates instead: a hint with the first retry, a second try, then the answer. A card counts as mastered after three correct answers, which is a plain local counter rather than anything adaptive, and cards you have not mastered come up more often.
Inside the build
See it in motion.
A seeded round in motion: the same board, both themes.
Zero dependencies
The runtime is one HTML file and a deck file. No framework, no build step, no dependencies, no server. That rule meant every feature cost exactly what it weighed, and it kept the whole game readable in one sitting, which is what a practice project needed to be.
What shipped
Fifty-six cards across Claude Code, the macOS terminal, and Git (20, 20, and 16), with a decoy set for each. Keyboard-first play: number keys for the tokens, arrows to move focus, and single keys for the 50/50 lifeline, category, mode, theme, pause, and help. Touch and swipe on phones. Light, dark, and system themes with no flash on load. Progress persists in the browser under one storage key and is never sent anywhere. A GitHub Actions check validates the deck on every push, so a duplicate ID or a decoy that is also the answer cannot land. Built against WCAG 2.2 AA: a live region announces state to screen readers, reduced motion is honoured from the system setting or an in-app toggle, and high-contrast mode is supported.
Where it stands
Complete · live · no backend
My role
The reason to build it, the scope of the deck, and that rule were mine; most of the implementation, the deck validator, and the accessibility audits were the agents’, and I played every build.
Reflection
The best constraint I gave myself was “zero dependencies.”
It kept a first project the right size, and it set the pattern the later ones follow: ship something small and real, then widen it deliberately.






