A tour inside my software restaurant

How I vibe-coded my favorite defunct game in 7 days and most of my “users” ended up being bots.

For the past 18 months, I have had a private benchmark for coding agents: can they rebuild my favorite defunct game? (An autobattler called Storybook Brawl, which imploded after being acquired by FTX).

Every few months, I have tried again with the newest tools – in early 2025, with Cursor and Sonnet 3.7, in late 2025 with Claude Code and Opus 4.5, at some point I spent a weekend hacking on Lovable project with I think GPT-5, and more recently with a combination of both Codex and Claude Code.

Earlier attempts were impressive until they weren’t. I could get a basic template of something running, but complex interactions – the real meat of any strategy game – eventually became impossible. The agent would confidently tell me a change was finished when it either hadn’t worked or had broken three unrelated things. It was tantalizingly, agonizingly close – but no cigar.

This time, I can say that this benchmark is basically saturated. This is my journey.

FableBrawl: an overview #

In roughly seven days of full-time work, I built FableBrawl as a website and an iOS app. It has Google and Apple sign-in, subscriptions through Stripe1, a Vite-based game client, Postgres on Railway, deployment through GitHub Actions and Vercel, activation emails through Resend, analytics logs in Cloudflare R2, and a staging environment where I could test changes before shipping them. I had heard of most of these tools before but had never built on top of them; I can’t in full honesty say I still understand what all of them do, except to say that “it works.”

Diagram of the FableBrawl web app, iOS app, shared game core, Railway backend, storage, providers, and operations

While some of the game engine was getting built in multi-hour refinements, it was nice to be able to do more emotive work like choosing visuals and sound effects in parallel. In the end, the game shipped with two visual modes: high-fantasy art from OpenAI image models, the original default aesthetic I personally wanted, and community-suggested MS Paint-style stick art for the anti-AI set (more on that later) that eventually became the default.

FableBrawl web home screen in Rough Draft art mode
FableBrawl iOS home screen in Rough Draft art mode

My background tracks for different game scenes were basically one-shot from the ElevenLabs music model and the sound effects come from their SFX model. Surprisingly, I had to generate ~30-40 sound effects for each that ended up in the game to get exactly what I wanted; the models still feel somewhat stunted when it comes to multi-modality and human taste – a lot of the SFX were really bothersome or overly shrill, at least to my ears.

Hear FableBrawl Nothing plays until you tap an icon.

I made an admin dashboard to grant free subscriptions and monitor live usage. I built a comprehensive logging suite and in-app bug reporting feature. Every build ran about 400 automated tests, about a 100 I told the coding agent to write and about 300 I had it make for itself. I’m not a SWE so I don’t really know if these are good tests, but they seemed to catch some regressions.

FableBrawl Live Court admin dashboard showing one current player and daily active users, with suspected bots excluded

Above all, I was able to faithfully and accurately resurrect the core game mechanics of my favorite defunct game with all of its crunchy, tactical decisions in an appropriate, high-fantasy setting – and be able to play on a live multiplayer server with other people!

Three Discord player reactions: Pix praises FableBrawl and bug reporting, wait4godot says they will check it out, and House praises the quick turnaround

It was especially fun to build suggestions from players in a few hours while they were still playing, like a Mortal Kombat-style “killing blow” cutscene that wasn’t even in the original game. Also, the in-game AI opponent (with no specific steering or customization – more on this later as well) was significantly better than what shipped with the original game.

Animated FableBrawl killing-blow cutscene where Merlin defeats Grandmother with arcane lightning

A peek inside my software kitchen #

There is a heated debate on Twitter right now over if “software factories” – the idea of agents autonomously, continuously building high-quality software – are real or not. I’m not an expert, but what I will say is that my experience working with these agents felt more like running a slightly chaotic (but happy!) restaurant more than operating a factory.

Overall, my biggest takeaway is – damn, it’s fun to build! The amount of iteration you’re able to do in just a few minutes or a single session made me always wanting to put more time into it, similar to that feeling of starting a new video game captured perfectly here:

At the same time, it was slightly chaotic because most of the time I was context-switching across ~20 threads to keep myself from being the rate-limiting factor towards progress, which ranged from making game assets to ruling on mechanic nuances to polishing the UI/UX to testing the game features. I enjoyed it when I had a few minutes to take a breath while waiting for “big dishes” to be ready, when I could more peacefully refine “would be nice” small touches that any small business owned and operated on passion has.

In terms of my tool stack journey, I initially started exclusively with Claude Code because I wanted to try Fable 5 and the desktop app’s git UI/UX gave me comfort to track what was done vs. in-progress.2 I initially only started to use Codex because I wanted to use its image tool without paying the API costs; eventually, I realized its in-app browser is way better than Claude’s and truly valuable for automating work that needs to be logged into a website like configuring Stripe or submitting to the App Store.

A game-changing, utterly magical moment was being able to use OpenAI’s new duplex, voice model3 to fully control my computer remotely and build ~5-7 major features while in my car. I was waiting at a doctor’s office for about 45 minutes and what previously would’ve been a frustrating experience turned into one of my most productive work sessions, in no small part because the ChatGPT app has a great CarPlay integration.

Codex still has room to improve: it needs better syncing of mobile/remote sessions to the desktop app, richer thread management, and I still find the in-app partition across Chat/Work pretty crude4, but the foundation is incredibly strong. I wouldn’t be surprised to see Codex/OpenAI pull away from Claude Code on code generation in the next few months – perhaps not in terms of revenue since ~80% of Claude Code’s revenue is likely longer-term enterprise contracts, but certainly in terms of developer traction and feature superiority.5 For someone at my level of software engineering or at least the tasks I was jamming on, I couldn’t see a discernible difference in the quality of Sol Max and Fable’s output, so the native, end-to-end voice form factor is a true differentiator for me.

My end-state set-up that I think will become more common for people was to have my main machine always plugged in at home/office, set to never sleep, and logged into all critical web-based services.6 This then gave me the flexibility to do anything from my phone via a remote connection that I could do physically sitting at my desk, as long as I could verbalize what I wanted. By the end of this project, I was probably logging ~75% of my contributions from my phone vs. at my desk – in part because I was on a vacation in the middle, but I could also see this as a way to get outside, exercise, and spend more time in nature.7 I always had more ideas while walking, showering or waiting in line – and now building immediately in-state is just a short voice-transcribed note away. It felt like having not just an executive assistant, but also a team of engineers, designers & data scientists at the tips of my fingers.

Speaking of: voice – have you joined the voice revolution yet? While I still love quietly typing my thoughts out (as I’m doing now), for most practical tasks, it’s ~3x faster to dictate it — and speech-to-text models have gotten so accurate and cheap that you’re just leaving time on the table if you’re not using them.8 My set-up is a simple dedicated Bluetooth mic that clips to my shirt and WisprFlow because I like to have custom overrides stored for technical, easy-to-conflate words, but I don’t even think this is the ultimate end-state here. I plan to help my 6 year-old build a software game with me and Codex, in part to see how she interacts with the computer by talking to it, unburdened by decades of hard-wired habits.

Vintage poster saying Do your part: Talk to your computer
Vintage poster saying You probably should be talking to your computer more

The most “factory-like” or at least “production-line” aspect of my humble software restaurant was my bug reporting and resolution workflow. I knowingly shipped the game in a buggy state, because even as such I expected some people would want to play it, it was still fun to do so, and we could collaboratively iron out the game engine together – rather than relying on me laboriously testing different interactions. Over the course of ~3 days, we received ~100 bug reports – at first, via Discord messages, but eventually via an in-app reporting flow that also serialized the game state in the report. After about a day of responding to emails myself, I realized about 90% of the time, I was just copying and pasting the report into the coding agents verbatim and so built a Codex routine where every hour it would read the bug reports from hello@fablebrawl.com and automatically resolve them as long as they were low- to medium-risk and didn’t have any ambiguity.9 The community seemed to really like how quickly their issues were addressed (average resolution time of ~3h), and even received an agent-written email explaining the resolution as a sort of checksum to ensure we fixed it correctly.

Recreated, anonymized FableBrawl support thread asking 'Does this address your concern?' followed by a video demonstration of the Emberburst hover-card text fix

The one frustrating experience I had was using the coding agents to improve the in-game AI opponent’s decision-making. While the “out-of-the-box” (e.g. no customization) performance was significantly better than the original game, it was nowhere near the skill of a top player. An adult human who learned the basic game mechanics could probably beat the in-game AIs within 30-45 minutes; the in-game AI has no chance of ever getting close to beating a top player that has put hundreds-thousands of hours into the game. I tried a few things: I talked to the coding agents about what I observed the in-game AIs doing poorly and this was able to improve average placement by ~0.4 (for context, the game is 8-player, so 4.5 is an average placement). I tried ~10 times to steer the coding agents to make some kind of RL environment where the in-game AIs could play against each other and tune their weights; this failed horribly even after many scripts and hundreds of hours of wall time. Fundamentally, I think the game’s state space is too large to be “vibe-trained” on without any pruning or custom effort.10 I was able to get some moderate success meaningfully reducing the search space by trying to improve the in-game AI for just one of the game’s 44 unique heroes (+0.42 points of average placement vs. baseline of 3.10, again in a game with 8 players, so perhaps a “13.5%” improvement), but I didn’t care enough to more exhaustively improve this.11 There’s a chance too that OpenAI/Anthropic are intentionally making their public-facing model APIs worse at writing machine learning code due to competitive concerns.12

FableBrawl AI training dashboard showing the stopped experiment and held-out evaluation results

A few final thoughts for other aspiring software restauranteurs:

  • Codex Fast mode feels meaningfully faster, but consumes quota way too quickly to be worth it – it’s perhaps 50% faster but for what felt like 2.5x quota drawdown
  • This is especially relevant since Codex (unlike Claude) doesn’t give discounts for large usage credit purchases if you ever run over your weekly quota
  • In the first few days, I spent a bunch of time optimizing use of screen real estate on web, mobile web & iOS because it was fun to get that immediate gratification, but in retrospect once you’re trying to maintain consistency across multiple surfaces, it’s important to have colors, padding, spacing, fonts, iconography, etc. canonically defined somewhere.
    • I think the best current way to do this is to have Claude Design make a design system for you that you approve, but I can’t verify this because I only did this after the fact when I basically had gotten everything looking how I wanted it to.
    • The killer features here are being able to drop a comment associated with a location on the screen, just like you’d rev a mockup with a designer, and even draw on the screen to communicate sizings and locations visually.

Community response – so, did anyone care? #

At its peak, Storybook Brawl had ~250,000 copies installed and a peak concurrent users of ~3000, which I think can roughly represent the total market size for this game, as it’s relatively complex and has a niche appeal. About a week after launch, we have ~100 sign-ups, an average 5-10 players per day, and 0 paying subscribers. I probably spent $500 on inference/various forms of compute dedicated to the project. The Reddit launch post got ~40 upvotes and ~3k views in r/StorybookBrawl; I tried to post the game link in the StorybookBrawl Discord but its current moderators are making their own successor game and seemingly therefore deleted my post ☹️. I put top players’ in-game ratings on the homepage and there seem to be a handful of players that are gunning for the top spot every month, even though most of the games they’re matched into are against relatively simple AI opponents.

FableBrawl Hall of Legends leaderboard showing Wait4Godot, blah, and Pixkwil as the top three players

The most interesting part of the community response was the guttural rejection of AI-generated art. A streamer even backed out of streaming the game after he discovered we were using AI assets. I found that many indie games that launch these days have an AI disclaimer attached to them. As someone who mostly marvels at the promised productivity gains of AI, I cannot fully understand this worldview but respect it enough to listen. In the end, I made the default art style programmatically generated MS Paint-style stick art, which I admit has grown on me and is visually more digestible. Only one person asked if the code running the game was AI-generated, and even then it was indirect and not accusatory.

A Discord user asks who did the art for FableBrawl
The very first question in my game’s Discord #general.

Most of my users were bots #

The most humbling moment was realizing that ~70% of my daily active users were bots, perhaps because I hadn’t put any of the site behind a sign-up wall.13 Eventually, the botter’s script died, I added a sign-up wall and some basic bot detection; even though my DAU charts dropped, I was content with the small community I’d brought together around this amazing game. I have no idea why someone would bot a resurrection of a years-defunct tactical auto-battler once purchased by a similarly defunct crypto trading platform, but such are the times.14

As I was pushing publish on this post, a former top player streamed the game on Twitch—and since then, FableBrawl has grown to 150 sign-ups and around 20 daily active users. It’s still a small community, but enough momentum that I’m actively iterating on the game to see where this goes.15 It continues to be a joy to build and learn through 🫡.

FableBrawl attendance chart showing player activity rising after a former top player starts streaming

Footnotes

  1. Special callout to the Stripe “friction log” folks – I felt especially seen when Stripe’s onboarding flow had specific hooks and documentation workflows for building with coding agents. I hope this becomes more widespread!

  2. Eventually, I added to my system instructions to not even bother me with git issues which was a joy to do. I also told the different threads to stop bringing up to me that “some files were touched by other in-progress worktrees.”

  3. A duplex model means it streams input and output simultaneously, so it won’t interrupt you as much as the old ChatGPT Advanced Voice mode would and you can interrupt it more fluidly. Native voice models are trained on audio tokens and tend to be better than speech-to-text -> text response -> text to speech pipelines because they can understand pauses and intonation.

  4. I imagine the partition is intentional due to enterprise security requirements, but it still seems like there needs to be more/better ways to switch between them in-app than tapping the side menu, tapping ChatGPT, toggling to/from Chat/Work, and then still trying to remember whatever you were doing.

  5. I tried to set up Claude Code with Dispatch multiple times but had Bluetooth pairing problems.

  6. I’ve happily used Amphetamine for ~2 years for this and to solve various MacOS waking issues.

  7. As long as said nature has a strong 5G connection!

  8. “Speech Is 3x Faster than Typing for English and Mandarin Text Entry on Mobile Devices” https://hci.stanford.edu/research/speech/paper/speech_paper.pdf

  9. Codex’s Gmail connector really needs to allow support for multiple inboxes, right now I’m responding to everything from my personal email account; it is WILD to me that Anthropic’s Gmail connector doesn’t allow email sending, only creating “drafts.”

  10. The rough math is: 44 unique heroes x 109 unique cards x 55 unique spells x 76 unique treasures x 17 turns, the duration of an average game x 3-4 decisions per turn x 20 ways a decision can mutate the game state. Battles, the core mechanic of the game, are also inherently non-deterministic, with O(thousands) of possible outcomes per board configuration.

  11. I am definitely down to get nerd-sniped here, it’s just the point of building this was to let people play against each other not AI, so making the AI better kinda feels like a band-aid.

  12. After all, Anthropic has restricted its competitors from using its products for ~2 years, but access can be easily laundered through intermediaries. Both stated that making an automated AI researcher would be a key strategic pillar for each of them

  13. The analytics dashboards I was so proud of were utterly glazing me!

  14. Maybe it’s the newest RL gym company and Storybook Brawl is for some reason an amazing generalizeable hillclimbing environment; or at least these are the entertaining delusions that cross my mind.

  15. At this point, the project is 81k lines of code (77k nonblank, 25k of which are tests), but still easy to iterate on, a previous failure mode of past attempts at this benchmark.

If you build with coding agents, what’s your private benchmark? If you run a software factory/restaurant, what could I have done differently?

Comments

Join the conversation

Questions, counterarguments, private benchmarks of your own—I’d love to hear them. Reply on X.

Comment on X