A couple of weeks ago I started the Futboh project by vibecoding in my spare time. By the end of the first week I already had something playable online, and the second week has been about improvements. I could probably spend another week getting it properly polished.

The game currently lets you play a few games of foosball from your browser using a keyboard (not recommended), a gamepad, or VR. It also includes several modes: versus AI, versus online or local players, and all their variants.

I have had a game like this in mind for a long time, and doing it the old-fashioned way would probably have taken me a year or two. Despite being entirely vibecoded, it is not a few days’ work: an LLM does not know how the game is supposed to feel when you play it, and it cannot be your tester or designer.

Screenshots

Futboh gameplay

Futboh online modes

Futboh customization

Futboh scenario

Details about Futboh.com

When I saw that the domain was available, I did not think about it for long: I’m making it. Partly to try Opus 5, which had just come out, and partly to see the game I had in mind become real. I have no commercial intentions.

For now, I am keeping the repository private. I do not think a vibecoded project adds much in that respect.

AI tools

The game was vibecoded using Claude Code, mostly with the Claude Opus 5 model. For the sound, environments, and some menu improvements I used Kimi K3 and GPT 5.6 (Sol and Luna).

I used Claude Code and opencode, the Context7 MCP, and the skills recommended by autoskills. I only had a CLAUDE.md; opencode falls back to it, so there is no need to have both.

Process

I researched which technologies to use to make it web-based and very accessible. I came across Babylon.js as the game engine, Rapier3D for physics, and Colyseus for multiplayer. A few years ago, doing this without these extraordinary open libraries would have been considerably more complicated. Thanks for existing.

It is difficult for me to calculate the total time spent. Sometimes I would give it the prompt and go do something else. You could say I spent two weekends on it, intermittently.

After choosing the technologies, I started with the specification.

Spec

I refined an initial spec with Claude Desktop, specifying what I wanted and how I wanted it: languages, libraries, style, final target, what was in scope and what was out of scope, and asking it questions about the project until it was more concrete. Then I asked it to help me write the prompts, reviewed them, and went step by step asking it to implement each one and reviewing the result by running the game. For each environment and piece of music I had to create a specific prompt, with its own refinements to fix defects.

Prompts

Generated by AI from the refined spec. About 10 in total, basically dividing up each section of the videogame: menus, controls, sound, 3D models… Some prompts had it working on its own for an hour. When it finished, I would usually open a new chat to refine the details that did not work well and fix bugs before moving on to the next prompt.

Visual style

Since it had to be 3D, run in a browser, and be playable in VR, there were not many options besides using low poly to play it safe and avoid having to optimize later. In fact, the game does not calculate shadows: the ones you see are “artificial”, as if a stretched PNG had been placed directly underneath the ball or the players.

On mobile, a Motorola Edge 60 Fusion, FPS hover around 50-70, while on a PC with an RTX 4070 Ti it almost reaches 300 after removing the browser limit. It is capped at 144 FPS by default. With a Meta Quest 3 I have been able to play without any problems; it runs smoothly.

Sound

For the sound, I cut out a piece of audio from a foosball game, passed it to GPT 5.6 Sol, and told it to reproduce it programmatically while taking the speed and so on into account. It worked like magic.

The music was made with the Resonant MCP and converted to webm with ffmpeg.

Deployment and costs

So far, I have spent 10 € on the domain at Cloudflare and the cost of the AI subscriptions over these two weeks: 20 € between GPT and Claude, which would be “half a month”. I was not only working on the game, so let’s say another 10-15 € on AI.

So far I have spent 0 € on servers. I am using the free month from Railway for the authoritative multiplayer server. I will keep it alive while people are playing. For web hosting I used Cloudflare, so 0 € there.

25 € in total, rounding up.

Lessons learned

This is now one of several projects I have made using LLMs and different tools to control them.

  • I have always recommended going little by little and keeping control over the generated code. I still recommend this, but with one exception: if you simply want to build a prototype to see whether it works and do not care about being in control, you can now see that the result is not that bad. Keep in mind that to make any change, even a tiny one, you depend on AI or on having the time to dig around in files.
  • Regaining ownership of a project once it has been lost can be expensive. It requires understanding someone else’s code and, since it is the product of an LLM, some things that seem to make sense probably do not once you look deeper.
  • An LLM can resynthesize sounds from a WAV file. It is difficult to get more compression than that.
  • It can also design 3D environments, figures, and whatever else is needed. Do not expect much definition or for it to come out perfect the first time: it is normal for it to put faces on backwards and for the model to appear black.
  • Plan mode uses up a lot of tokens; it is not always worth it. With the foosball game, I quickly reached contexts of 150k or 300k tokens.
  • Tests are even more important, and they need to be fast too. In the AGENTS.md file or equivalent, it is worth specifying the validation flow that each change must follow.