Case study
BashGames
A real-time multiplayer party platform for family and friends: 69 games over WebSocket.
- Python
- FastAPI
- WebSocket
- PocketBase
- three.js
- Web Audio
- Gemini
- PWA
The problem
Our family and friends wanted to play together on their phones: classic board and card games, quick party games and silly AI-judged contests, without ads or app stores.
What I built
- Server-authoritative engines for every game: state kept as JSON, its own RNG, a separate view per player so hidden cards stay hidden.
- Live rooms over WebSocket, restored after restarts; pause when someone drops, everyone taps Ready, 3-2-1.
- Board & card classics (Ludo with real 3D dice throws, UNO, Poker in rupiah, a Monopoly-style game, Gaple, Congklak…), quizzes, speed games, 20 Hz live arenas with latency back-dating.
- AI-judged games: drawings, selfies and photo hunts judged by Gemini with a Cloudflare Workers AI backup racing it; voice games with on-phone pitch tracking.
- A 3D cooking career game in three.js, plus a live home page, awards, leaderboards and push notifications.
Highlights




Try it
Roll the dice
The same 3D CSS die used in Ludo and Snakes & Ladders, plus a round of Spot the Twin.
Try it
Sing a line
Hum or sing along: your phone or laptop tracks your pitch every 50 ms (YIN) and draws it over the melody, in any key. The microphone stays in your browser; nothing is uploaded.
How it works
- 1Phones (PWA)
- 2WebSocket rooms
- 3Game engine (server)
- 4Per-player views
- 5AI judges (Gemini ⇄ Cloudflare)
- 6Results, awards, stats
Engineering notes
- Random-play simulation tests drive every engine to the end of a game; around 160 tests run before each deploy.
- AI never blocks a game: content is prepared while players wait in the lobby, with bounded waits and built-in fallbacks.
- One bug worth remembering: events with a private recipient key were hiding public moves; it was fixed and documented.
How I build
Designed, built, tested and deployed by me with an AI coding assistant (Claude Code): I set the requirements, review every change, test on scratch copies with fake data, and run it in production.