Kaboo Online Multiplayer Card Game
Kaboo Online Multiplayer Card Game
Kaboo Online Multiplayer Card Game
Product & Experimentation
I built a real time multiplayer version of a card game my friends and I play, using Claude Code, and took it from an empty folder to a live site that ten people have played across multiple rounds.
I built a real time multiplayer version of a card game my friends and I play, using Claude Code, and took it from an empty folder to a live site that ten people have played across multiple rounds.
I built a real time multiplayer version of a card game my friends and I play, using Claude Code, and took it from an empty folder to a live site that ten people have played across multiple rounds.
Objective
Kaboo, also called Cabo or Cambio, only works because information is hidden. You see two of your four cards at the start of a round and then you have to remember what happens to them. The online versions I found either got the rules wrong or handled the hidden information badly, which is the part the whole game depends on. I wanted a version that played the way we actually play it, and I wanted to find out how far I could get building something from scratch with an AI agent rather than writing it myself.
How I built it
I used Claude Code for the implementation and kept the product decisions with me. I specified the rules, the turn structure, the four special card powers, and the interface, then worked in cycles of describing what I wanted, playing it, finding where it broke, and describing the failure precisely enough that the next attempt fixed the cause instead of the symptom. It runs on React and Socket.IO with a Node server, and deploys to Render from GitHub.
The decision that shaped the rest was making the server the only place real game state exists. Every hand is hidden before it is sent out, including from the player who owns it. Looking at a card is a one time event that shows for a couple of seconds and is never stored. An early version kept track of which cards each player had already seen so it could keep displaying them, and I had that taken out completely, because a version of the game that remembers for you is not the game.
The fix that broke the game
Penalty cards can push a hand past four cards. The first solution laid hands out in a grid that grew as needed, which worked correctly and rearranged all four original cards the moment a fifth arrived. That is working code that ruins the product, because a player tracking a card by its position loses it. The replacement pins the original four slots permanently and adds new columns to the right for extras. This was the clearest case of something an agent had no way to catch, since nothing about it looks like a bug unless you know what the game is for.
Two bugs worth naming
Several players were getting penalized when nobody appeared to have clicked anything. Selecting a card armed a stack attempt that never expired, so a click on the discard pile much later fired against a card the player had long forgotten choosing. Separately, a turn was occasionally being skipped, and it was hard to reproduce because it depended on which cards happened to be dealt. Instead of trying to hit it live, I had the exact reported sequence replayed as a repeatable test against the game logic directly, and reused that approach for later bugs with the same problem.
Where it stands
The game is live, joins by a shareable room code, and supports two to eight players. Ten people have played it and it has held up across multiple rounds.
Objective
Kaboo, also called Cabo or Cambio, only works because information is hidden. You see two of your four cards at the start of a round and then you have to remember what happens to them. The online versions I found either got the rules wrong or handled the hidden information badly, which is the part the whole game depends on. I wanted a version that played the way we actually play it, and I wanted to find out how far I could get building something from scratch with an AI agent rather than writing it myself.
How I built it
I used Claude Code for the implementation and kept the product decisions with me. I specified the rules, the turn structure, the four special card powers, and the interface, then worked in cycles of describing what I wanted, playing it, finding where it broke, and describing the failure precisely enough that the next attempt fixed the cause instead of the symptom. It runs on React and Socket.IO with a Node server, and deploys to Render from GitHub.
The decision that shaped the rest was making the server the only place real game state exists. Every hand is hidden before it is sent out, including from the player who owns it. Looking at a card is a one time event that shows for a couple of seconds and is never stored. An early version kept track of which cards each player had already seen so it could keep displaying them, and I had that taken out completely, because a version of the game that remembers for you is not the game.
The fix that broke the game
Penalty cards can push a hand past four cards. The first solution laid hands out in a grid that grew as needed, which worked correctly and rearranged all four original cards the moment a fifth arrived. That is working code that ruins the product, because a player tracking a card by its position loses it. The replacement pins the original four slots permanently and adds new columns to the right for extras. This was the clearest case of something an agent had no way to catch, since nothing about it looks like a bug unless you know what the game is for.
Two bugs worth naming
Several players were getting penalized when nobody appeared to have clicked anything. Selecting a card armed a stack attempt that never expired, so a click on the discard pile much later fired against a card the player had long forgotten choosing. Separately, a turn was occasionally being skipped, and it was hard to reproduce because it depended on which cards happened to be dealt. Instead of trying to hit it live, I had the exact reported sequence replayed as a repeatable test against the game logic directly, and reused that approach for later bugs with the same problem.
Where it stands
The game is live, joins by a shareable room code, and supports two to eight players. Ten people have played it and it has held up across multiple rounds.
Objective
Kaboo, also called Cabo or Cambio, only works because information is hidden. You see two of your four cards at the start of a round and then you have to remember what happens to them. The online versions I found either got the rules wrong or handled the hidden information badly, which is the part the whole game depends on. I wanted a version that played the way we actually play it, and I wanted to find out how far I could get building something from scratch with an AI agent rather than writing it myself.
How I built it
I used Claude Code for the implementation and kept the product decisions with me. I specified the rules, the turn structure, the four special card powers, and the interface, then worked in cycles of describing what I wanted, playing it, finding where it broke, and describing the failure precisely enough that the next attempt fixed the cause instead of the symptom. It runs on React and Socket.IO with a Node server, and deploys to Render from GitHub.
The decision that shaped the rest was making the server the only place real game state exists. Every hand is hidden before it is sent out, including from the player who owns it. Looking at a card is a one time event that shows for a couple of seconds and is never stored. An early version kept track of which cards each player had already seen so it could keep displaying them, and I had that taken out completely, because a version of the game that remembers for you is not the game.
The fix that broke the game
Penalty cards can push a hand past four cards. The first solution laid hands out in a grid that grew as needed, which worked correctly and rearranged all four original cards the moment a fifth arrived. That is working code that ruins the product, because a player tracking a card by its position loses it. The replacement pins the original four slots permanently and adds new columns to the right for extras. This was the clearest case of something an agent had no way to catch, since nothing about it looks like a bug unless you know what the game is for.
Two bugs worth naming
Several players were getting penalized when nobody appeared to have clicked anything. Selecting a card armed a stack attempt that never expired, so a click on the discard pile much later fired against a card the player had long forgotten choosing. Separately, a turn was occasionally being skipped, and it was hard to reproduce because it depended on which cards happened to be dealt. Instead of trying to hit it live, I had the exact reported sequence replayed as a repeatable test against the game logic directly, and reused that approach for later bugs with the same problem.
Where it stands
The game is live, joins by a shareable room code, and supports two to eight players. Ten people have played it and it has held up across multiple rounds.
