2026 · Solo · Production
The Ezz Show
Real-time multiplayer puzzle arena: code-based rooms, rebus and word puzzles, server-authoritative scoring.
Mission
An Ezz style brain-teaser arena: players join a room by code and race to solve rebus and word puzzles across many categories. The server decides who solved what and when, so nobody can win from the console.
For whom: friend groups and streamers who want a five-minute round with no install. Constraints: real-time fairness, a puzzle supply that does not run dry, and a review step so generated puzzles are actually solvable before anyone sees them.
Manifest
| Layer | Choice | Version | Why |
|---|---|---|---|
| app | Next.js | 16 | Player client and admin studio share components and the design tokens. |
| services | NestJS + Socket.IO | 11 | A gateway per room event with the game loop on the server. |
| data | PostgreSQL + Prisma + Kysely | — | Puzzles, rooms, and results; the same pairing as every product I run. |
| data | Redis | — | Presence now, shared room state next. |
| agents | Anthropic / OpenAI | — | Generate puzzles that must pass a blind solver before review. |
| infra | Docker Swarm + GHCR + SOPS | — | Encrypted env, image per release, one command to deploy. |
Decisions
Server-authoritative Socket.IO engine in NestJS. Clients render state; they never compute it.
Two Next.js 16 apps. The player client and an admin studio for reviewing and publishing puzzles.
Curated book plus a generation pipeline. 93 seeded puzzles from a curated set, then an AI generator whose output must pass a blind solver before it enters the review queue.
Prisma + Kysely on PostgreSQL, Redis for presence. Same data shape as my other products, so the deploy is boring.
Tested like a service, not a toy. 116 unit tests, a two-client E2E suite, and load tests; GHCR images with SOPS-encrypted env on Docker Swarm.
Impact
- Rooms hosted
- 50+
- Puzzles live
- 200+
- Unit tests
- 116
- Commits
- 73
50+ rooms hosted and 202+ puzzles live. Still boarding: the AI generation pipeline is dark until the key is funded, so the book carries the catalogue for now.
What broke
Room state lived in memory. It made the first version fast to write, and it also meant the API could only ever run as one replica: scale to two and half the players in a room would be talking to a process that had never heard of it.
The fix is to move presence and room state into Redis with a Socket.IO adapter, keep the authoritative game loop on whichever instance owns the room, and let the others proxy. It is the next item on the ship log and the reason the status says boarding.
Ship log
- First commit
- First rooms hosted with friends
- Multi-instance design written: room state and presence into Redis behind a Socket.IO adapter, one owner per room, the others proxy — build pending
- Now: 50+ rooms, 200+ puzzles, single-replica API