joemattie
stuff
← index
build2026-07-053 min read

Texting of Isaac

Joe Mattie
software engineer · mad scientist

Before the album, before Rat Run, before Riglab, there was Texting of Isaac: the experiment I used to learn Claude Code, back in January.

I was on vacation in Hawaii and drove the entire thing from my cellphone. The name was a pun on The Binding of Isaac, but turned out more literal than intended: the whole game was built over what amounted to text messages, tapped out between beach time. I never once had a keyboard in front of me.

The Texting of Isaac title screen in a terminal, rendered in ASCII inside a bordered panel

What it is

A bullet-hell roguelike in the style of The Binding of Isaac, rendered entirely in ASCII in the terminal. Python, an Entity Component System on Esper, a 30 FPS game loop, WASD movement with twin-stick arrow-key shooting.

For a learning exercise it got surprisingly far: five enemy types with distinct attack patterns, an item system with synergies (homing, piercing, multi-shot, explosive tears), procedurally generated multi-room dungeons with doors that lock during combat, shops, bombs, coins, a minimap, three bosses, and three floors.

Then it grew a second head: a web frontend, a Python WebSocket server behind it and a Pixi.js WebGL client in front, with spectator support, particles, screen shake, a generated pixel-art spritesheet, and a retro landing page. A terminal game that also plays in a browser at 60 FPS, for no defensible reason beyond “I wondered if it could.”

The actual experiment

The game was the pretext. The real experiment was working with an agent when your only interface is a phone screen. I couldn’t run the game or watch it play. For most of the project I never saw the thing I was building. That constraint forced the habits that were the whole lesson:

  • Design docs before code. The repo’s docs/plans/ directory is a fossil record: a dated design doc and implementation plan for nearly every feature, from 2026-01-13-tui-roguelike-design.md onward. When you can’t inspect the work, the plan is what you review.
  • Small conventional commits. 238 of them, one vertical slice each. On a phone, a small diff is the difference between actually reviewing a change and pretending to.
  • Make it review itself. Commits literally titled “address code review feedback”, where one Claude session reviewed another’s work and I just adjudicated.
  • Tests as the only eyes. The suite grew to 448 tests because they were the only way I could know anything worked. I couldn’t playtest from a beach chair, but I could read a green checkmark.
  • A CLAUDE.md with standing instructions, so every fresh session started with the project’s conventions instead of relearning them.

If that sounds like the process I later used on Riglab, that’s no coincidence. This is where it came from.

It doesn’t work that well

Honestly. The difficulty is brutal in ways nobody designed, terminals fight the idea of a real-time bullet hell (held-key movement without key-release events is a losing battle, a lesson Rat Run solved properly six months later), and the web version has the polish you’d expect of a learning project’s stretch goal.

And that’s okay. The game was never the deliverable. I came out knowing a lot more than when I went in, with a working feel for where these tools are strong, where they need structure imposed on them, and what that structure should be. Every project I’ve shipped with Claude since is built on habits formed while nominally on vacation, thumb-typing a roguelike into existence next to a mai tai.

claude-codepythongames