Trailer · 9∶16, as made for the game · silent
Card game · solo build · live
Bullheads
The 104-card “don’t take the sixth card” game, for 2–10 players in a browser.
- My part
- Everything in the repository: rules, bots, game server, web app
- Kind
- Browser game
- Tags
- Browser · 2–10 players · Rooms · Bots
Making of
01 Before
A single table, then a rebuild
The first version, in March 2026, was one deployable table. In September it was rebuilt as a multi-room monorepo: a React web app, an Express and Socket.IO server, and one shared package with the rules, the protocol types and the bot, used by both sides.
Source · commits 2a1af90, 2026-03-23 and b8768c0, 2026-09-30
02 Problem
Stuck on “Opening room”
Creating a room seats you, then the page moves to the room and joins again. The server saw a player already seated and returned early, so the new page never received the room state.
Source · apps/server/src/rooms.ts · commit 9a46740, 2026-09-30
03 Decision
The server re-sends what the page missed
An already-seated join now gets the current room state again. The server stays the only authority on the game; a scenario script checks reconnects, matchmaking, sync and rematches.
Source · commits 9a46740 and 0c5a45a, 2026-09-30
04 Now
Bots that count
A bot plays each card in its hand against sampled guesses of the unseen cards, up to 500 times, and keeps the cheapest. Easy, normal and hard differ in the number of simulations, noise and random play; over 900 games they averaged 13.7, 10.9 and 9.2 bullheads. On phones the hand is a 2×5 grid with a fixed action bar.
Source · packages/shared/src/bot.ts · commits 0c5a45a and c52f066, 2026-09-30
