The file was still there, neon_llama_chaos.html, a single slab of six thousand lines I had not opened in eight months. I double-clicked it and the title screen came up exactly as I had left it: a , a wash of , a high-score table with my own initials in every row. I played a round. It was still not fun. That was why I had closed it the previous autumn.

Eight months is a long time in this work. When I gave up, I was steering a model that needed a short leash and a single file small enough to hold in its head. When I came back, a couple of days ago, I was in with Opus, and what had felt like grinding friction the first time was suddenly cheap. So I picked the llama back up.

What followed surprised me. The rebuild went fast in every dimension an is good at. It scaffolded, it refactored, it wired in libraries, it surfaced bugs on screen the instant they happened. And at the end of all that speed the game still wasn't fun. The agent had cleared every obstacle except the one that mattered: taste. That was the part it could not hand me.

A top-down neon arena with a dense swarm of varied geometric enemies converging on a single bright craft at the centre.
Neon Llama Chaos: a llama, a swarm, and a score that climbs the deeper you go. The build came together fast. Making it fun was the part that didn't. Author's illustration.

The game I meant to make

I had a reference in my head when I started. The first version came together in about a week last autumn, first in a canvas, then in once it outgrew that. I wanted something in the spirit of Llamatron, Jeff Minter's 1991 blaster where you herd a llama through a screen of hostile junk, itself a riff on Williams' Robotron: 2084 . I had loved that kind of game on the Amiga. Dense, fast, a little deranged, and entirely about the next ten seconds.

What I have now is not that. Neon Llama Chaos is a twin-stick arena shooter much closer to Geometry Wars, Bizarre Creations' 2005 hit where geometric enemies swarm a neon grid and you steer with one hand while firing with the other . There is a llama in the title and a pilot named Captain Vlam, and past that almost nothing of Minter survives. The llama is a remnant.

The drift was not a decision. It was the absence of one. With an agent, every new idea is roughly one sentence of work, so you say the sentence. "Add a shop between waves." Done. "What if there were rare relics that change a whole run?" Done. None of it is hard, and that is the trap: difficulty is what normally makes you stop and ask whether you want the feature at all.

Remove the cost of adding, and you remove the moment of choosing.

I piled systems on faster than I could tell whether the last one had made the game better. Somewhere in the pile, the game I meant to make turned into a different game, and the title was the only part that remembered the plan.

The largest job of the revival had nothing to do with gameplay: it was paying for that pile. The original was one HTML file. I had Opus split it into nine modules and wire up esbuild to bundle them back into one self-contained file I could open with a double-click and drop on . It took an afternoon and was cheap. It was also dull, work that produces no new fun, done only because the old shape had become a wall. An hour of planning at the start would have saved the afternoon, and the tangle that made me put it down.

The game I planned

I know an hour of planning would have helped, because in the gap between giving up on the llama and coming back to it, I built a different game the other way around.

Achtung is a browser clone of Achtung, die Kurve!, the Amiga multiplayer curve game I played growing up, where everyone steers a growing line with two keys, left and right, and the last one not to crash into a wall or a trail wins . I built most of it over a single weekend in January, about five months ago, and have barely touched it since. The tooling had taken a real step up in the two months between dropping the llama and starting Achtung: the and Opus models were stronger, and the harnesses around them, and , had gone from holding a single file to holding a whole project. It helped, and I won't pretend otherwise. But the difference came from starting it the opposite way to the llama.

A single bright curved trail arcing across a dark convex CRT screen, rendered as vintage computing cover art.
Achtung in one frame: steer a growing line, don't cross a wall or your own tail, outlast everyone. A small idea, decided up front, that came out close to what I wanted. Author's illustration.

I opened a real editor and gave the project a real shape before I asked for any gameplay. , , a build, a test runner, and a separate little server to relay network play, since a browser can open a WebSocket but not accept one. I wrote down what the modes were going to be before I built them. None of that is glamorous, and an agent will skip every bit of it if you let it and start drawing curves in a canvas instead.

What came out of that weekend is close to the game I set out to make. Local shared-keyboard play for two or three at one desk. Single-player against CPU drivers with different styles and difficulties. LAN multiplayer over the relay, so the office can play it on the lunch network. Tunable match rules, optional hazards and safe zones, powerups, a settings code you can paste to a friend. A dozen modes and a pile of knobs, and adding one rarely breaks another, because the place each one slots into was decided before it existed.

Same builder, same kind of tool, opposite outcome. The two were never meant to be the same game. Achtung is a curve game, the llama is an arena shooter, and I wanted each of them on its own terms. Neither took long: a week for the llama, a weekend for Achtung. Achtung came out close to what I aimed at, so I stopped; it did not need more of me. The llama missed what I aimed at, so I gave up on it, and only came back this summer to see if I could steer it home. Better models and more practice explain none of that. The deciding variable was whether I settled what the game was before I started asking for features.

The parts I should never have written

The clearest thing I got wrong the first time was sound.

When I built the original, the agent and I made the audio the obvious way, generating tones straight through the browser's Web Audio . It sounded like a microwave: passable at best, grating at worst. It was one of the things that made the project feel not worth continuing. When I dropped the llama that autumn, the noise it made was part of why.

Coming back, I did what I should have done first: reached for code other people had already gotten right. The music now runs on Tone.js, Yotam Mann's Web Audio framework, layering up as the on-screen intensity climbs . The sound effects are ZzFX, Frank Force's MIT-licensed generator that fits in under a kilobyte . Both sounded better within an hour than anything we had built from scratch.

There is a lot of excellent, battle-tested code out there, and the fastest way to make part of your project good is often to not write that part. An agent will cheerfully build you a bespoke audio engine if you ask. It will be yours, and it will sound like a microwave.

The other surprise here was how little my day job carried over. I build data tools, web apps sitting on a database, the occasional script, things made of forms and tables and requests. A game shares almost none of that furniture. Neon Llama Chaos has no buttons at all. The title menu, the codex, the settings panel and the pause screen are drawn on the canvas frame by frame and driven by raw keyboard, mouse and gamepad input, because a game interface is something you , not something you mark up. None of the instincts I trust at work, semantic HTML, accessible form controls, a clean DOM, applied. It was a different surface, and the agent was learning it alongside me.

Pull one thread and the whole thing moves

By the time I came back, the game had eleven enemy archetypes, a between-wave shop, an experience track with perk picks, a rare relic tier, and an adaptive difficulty director whose entire job is to watch how you are doing and quietly push or ease the swarm. On top of that sits a performance governor that throttles the visual effects before the frame rate can drop, and a hard cap on how many enemies are allowed on screen at once. Each of these was reasonable on its own. Together they form a knot.

I learned this trying to do something that sounds trivial: make the early game a little more intense. I nudged the raw spawn density up. The change barely landed. The difficulty director saw a player under more pressure and eased the swarm back. The extra enemies pushed against the on-screen cap, so the surplus never appeared. And the extra effects tripped the performance governor, which dimmed the bloom I had tuned to make intensity feel intense. I had turned one knob, and three other systems had quietly turned it back. To raise the intensity for real I had to touch all four at once, holding the whole machine in my head.

This is the part of game-making the demos never show. A you can fix one stage at a time, because the stages mostly mind their own business. A game past a certain size is a web of feedbacks, and a change to any one mechanic propagates through the others in ways you cannot read off the diff. The agent is no better at this than I am. It can change the exact line I point it at, instantly and correctly, with no sense that the change will be cancelled three systems away. Achtung has as many moving parts and does not knot like this, because I decided where the seams went before I built across them. The tangle in the llama is one I tied myself.

Fun is the one thing it can't grade

I keep telling people that a game is an honest test of agent-written code, and I still believe it. The feedback is total and immediate. There is no "it ran but might be wrong," because running it is the test and your eyes are the assertion. Where an bug is a number in a log, a collision box that is off by two pixels is a death that feels unfair, and you feel the unfairness before you have finished the thought.

All of that is true, and all of it is about whether the code is correct. None of it is about whether the game is good.

The screen will show you the bug the instant it happens. It will not show you the fun.

For the fun there is no assertion to write, no test to run, no error to read. There is only playing the thing, over and over, noticing the precise moment your attention drifts, and guessing why. The agent does not know what fun is, and I do not say that as a dig. It cannot know, because fun is not a property of the code. "Make the enemies harder" produces something every time, and most of the time it is wrong in a way only playing reveals: the enemies come out faster instead of harder, and faster at that spawn rate plays as unfair rather than difficult. The difference lives in how the moment feels to a person, and the person is the only instrument that reads it.

Worse, the instrument is not calibrated the same way across people. My wife finds the swarm I tuned for myself stressful; a friend who plays a lot of these finds the exact same setting sleepy. There is no single correct difficulty curve. There is a person, or a careful guess about a kind of person, and a great deal of playtesting in between. So, after picking it back up this summer, the game is decently playable again, which it had not been when I reopened it. The progression is OK now. The waves climb more smoothly, the mid-bosses land, the music swells in the right places, and a run has a shape it did not have before. It is approaching fun. None of that arrived because the agent worked out what fun was. It arrived because I played the thing over and over and made a few hundred small human calls about how it should feel, which is the one kind of work this whole exercise cannot make cheap.

Nobody plays it but me, and that's fine

It would be easy, looking at the repository, to mistake this for a real project. Thirty-three commits. Seventeen thousand lines of source across nine modules. A build step, a deploy, a URL I can hand to people. By the surface measures of the work I do for money, this is a system.

It is not. Nobody plays Neon Llama Chaos but me and the few people I have pushed the link at. It has no users, no roadmap that matters, no reason to exist beyond my wanting to a llama through neon waves and chase a score that climbs the deeper you get. The Vercel deploy is there so I can open it on my phone, not because anyone is waiting for a release. The rebuild was the same play it always was, with the floor swept.

I am wary of the move where a toy quietly turns into a product and you end up maintaining something you built for fun. The position I want to hold is the boring one: this is throwaway by intent, and its size does not change that.

The llama still flies

The part of this I will not apologise for is the simplest one.

Building it has been one of the most fun things I have done with an agent, and the fun is not a side effect of the lessons. I grew up on games, the Amiga first and then a PC, and at that age a game was pure magic, a thing that arrived on a disk and could not possibly have been made by a person in a room. Knowing it is just code does not dissolve the magic. It moves it. The magic is that the code does so much at once: a thousand things updating sixty times a second, enemies deciding, projectiles flying, the score ticking, the music swelling as the screen fills, all of it holding together into something you can pick up and play.

My ordinary work does not feel like that. An ETL job moves rows from one place to another, on a schedule, and there is a quiet satisfaction in that, but nothing on the screen takes off. For a few evenings I got to be a game developer. The llama flies. I made it fly, and I can send you the link.

I enjoy building these games more than I enjoy playing them. The llama is approaching fun now, and I am glad of it, but the hours I will remember are the ones spent making the thing work, not the ones spent playing what I made. That is probably why I gave up the first time, and why I came back. The playing was always a little beside the point.

Final thought

I gave up on the llama once. I came back because building it was the part I loved all along. It flies again, and that was the point.

References

  1. 1Wikipedia, "Llamatron". en.wikipedia.org ↗ Accessed 2026-06-29
  2. 2MobyGames, "Geometry Wars: Retro Evolved (2005)". mobygames.com ↗ Accessed 2026-06-29
  3. 3Yotam Mann, "Tone.js: A Web Audio framework for making interactive music in the browser" (GitHub). github.com ↗ Accessed 2026-06-29
  4. 4Frank Force / KilledByAPixel, "ZzFX: A Tiny JavaScript Sound FX System" (GitHub, MIT license). github.com ↗ Accessed 2026-06-29
  5. 5Wikipedia, "Achtung, die Kurve!" (freeware multiplayer curve game, also known as Zatacka; originally made for the Commodore Amiga by Filip Oščádal, with a later 1995 MS-DOS version). en.wikipedia.org ↗ Accessed 2026-06-29