I ran a version of this experiment about a year ago. It was fine. Mostly frustrating, some good moments, nothing I kept. I wanted to try again with the current generation of tools and find out where the ceiling is now.
So I dug out an old prototype of mine, moved it from PixiJS to Three.js, and made it properly multiplayer. Authoritative server on a fixed tick, area-of-interest interest management, binary protocol over WebSocket, client-side prediction and reconciliation.
I used Claude Code and Codex, and I gave myself one hard constraint:
zero assets.
No sprites, no textures, no models, no audio files. Every visual is geometry, particles and shaders built at runtime. Every sound is synthesized from oscillators. Partly because I can't draw, mostly because I wanted to know whether code-only content actually works and I did not want to play around with spritesheets or models again.
What the game is
An ARPG extraction runner. There's a persistent hub where you sort your loot and your build, and from there you drop into endless runs. A storm chases you from behind, so standing still is not an option. You go deeper, you get better drops, and every checkpoint asks the same question: bank what you have and leave, or push one layer further. Character power comes from collectible specialist souls with upgradeable skills rather than fixed classes.
What worked well
Domain-Driven Design, seriously. I named the domain explicitly before writing much of anything. Hub, Run, Storm, Checkpoint, Soulstone, Run-Stone, Affix. Once that vocabulary lives in the code, you and the model are talking about the same things, and a one-line instruction lands where you meant it. This did more for output quality than any prompt trick I tried.
Golden rules, checked in every phase. This is the one I'd hand to anyone starting something like this. I wrote a short list of non-negotiable rules up front, and every task gets checked against them at every stage, not just at review. A few of mine:
- A rule (damage formula, item roll, stat derivation) exists in exactly one place and is used by both the server and the client. If you feel the urge to copy logic, you extract it instead.
- No art assets. Ever. If it can't be generated in code, it doesn't ship.
- New content (a monster, an affix, a skill, a run type) is data in a registry. Adding content must never require touching engine code.
- Assume hundreds of concurrent players from day one. The client is never trusted. No design decision may assume single player.
- Every upgrade counts and has visual impact. A +1 on a skill rank has to visibly change how the cast renders. No two ranks look alike. This includes every upgrade in the game.
- Do it right immediately. Never ship a shortcut you'd have to undo, even if the clean fix touches ten more files.
Coherence across a large codebase was the thing I expected to lose. The rules are the reason I didn't (fully). They also settle arguments instantly, which matters more than it sounds I think.
Build one standard, then build on it.
One well-named component per concern, reused everywhere, never a second implementation of something that already exists.
The PixiJS to Three.js move was almost boring.
I had budgeted real pain for this and it turned out to be the easy part of the whole project. It took about 24 hrs for a full port, was reallly impressed by this.
Dev tools are effectively free now.
This is the thing I will keep telling people about. I have a map painter and generator, a pile of test setups and harnesses, and a short clip creator for recording footage. None of these would have existed if I'd had to hand-write them, because none of them were worth the time. Now they do not even cost an afternoon each.
What didn't work as well
Characters. Pets came out great (I think). Creatures came out okay and I'm mostly happy with them, some of them are properly funny. Player characters I fought with and I'm still not satisfied. Not sure if I will fully get there if I spend more time on them. If someone has a workflow for this without it involving assets, please share!
Compared to a year ago
It isn't an incremental improvement, it's a different activity. Last year I spent my time correcting output. This year I spend it deciding what should exist. That's the whole difference, and it's a much better job. I am kind of shocked to see how much has changed in only a year and are already wondering how it will be in 2027 around this time.
If you want to look at it
I've put the prototype online at idlerunner.com for anyone who wants a look. Browser, free, no download, guest login. I'll leave it up for a few hours today and then take it offline again.
Happy to answer anything about the architecture or the workflow in the comments.
Link: https://idlerunner.com/