Not looking at the code

Despite the town criers' warnings, vibe coding is here to stay. Worse still—it's effective! I have not yet built a ten-billion-dollar ARR SaaS product, nor have I successfully used it to manage a 10,000 microservice cluster of pure, single-line node functions. However, I have built a profitable software agency and I just shipped a fully-featured game (with tests!), so take my experience with a pound of salt.

Claude Code has created possibilities that previously just weren't possible. The human limit of having numbered hours in the day no longer apply. I can now pursue small, trivial projects that previously would've been very labor-intensive. So, I built botnet, a game loosely inspired by LEGO's Spybotics: The Nightfall Incident (the link is to a faithful remake on Itch.io from a fan).

While the gameplay of Spybotics is hardly a novel concept, its combination of music, unique artwork, and fun difficulty-scaling created a real nostalgia from my childhood that I wanted to capture and share with my son.

I started off simple: HTML, JS, and the Phaser.js game engine (which turned out to be an over-complication right off the rip, but I'll get to that later.) I had a working prototype within 5 minutes, which quickly bloated to an unmanageable mess after 2 weeks of vibing away.

One day, I realized... I never even looked at the code.

What shape was it? Could I read it?

Turns out, not only did I not care, it didn't matter. Mistakes don't really matter because you can clean them just as easily as you create them. Notice a pattern that keeps tripping Claude up? Ask it to identify the pattern, make a note to avoid it, and move on. Just like normal human coders.

When vibe coding, the harness matters a lot. The "harness" is the combination of all the ways the model can check itself and its code.1 The problem with the Phaser.js game engine was that the entire game existed in an HTML canvas that Claude had no way to debug or check for correctness. So I buttoned up my YOLO trousers and hatched a new idea: refactor the entire game from app.js and Phaser to a React-based renderer with a pure JS game engine. Roughly ~6 hours of wall-clock time later, I had 500+ tests verifying game engine functionality, and verifying the React rendering system.

Oh... and I also built an entire new roguelite game-mode which eventually replaced the "classic" game mode.

I've played an additional 2-4 hours of the game since then and haven't noticed a single true "bug". Here and there I've tweaked UX, and I still need to do another pass on the difficulty scaling, but the core game works and is stable.

I consider myself lucky that I was never a great engineer. I can't recite algorithms very well, nor am I particularly good at building.

But, I do love building. And it's never been easier (or more fun) to build.


  1. An interesting detour: it seems to me (and I am NOT an AI engineer so here be more salt) that the new "Recursive Language Model" (RLM) concept is largely just harness engineering. Put the important bits in the environment with context about how to iterate. You can sorta do this today with a structured TODO.md and good CLAUDE.md instructions.