SirenDesk Engineering

All work

Cash Rummy: one authoritative table for 5,000+ players.

Production, previous startup

Our role
Our engineers designed, built and operated the backend at our previous startup.
Product
A real-money multiplayer card platform.
Peak scale
5,000+ concurrent players in production [how measured, and when]
Stack
Node.js, Socket.io, Redis, [database]. Unity and React Native clients.

A card table looks simple until thousands of them run at once. Every player at a table has to see the same state within milliseconds. That state has to survive dropped connections, and no client can be allowed to change it.

  1. Unity and React Native clients
  2. Socket.io nodes, server owns the state
  3. Redis: shared table state

Constraints

  • Turn-based play with strict timers, on unreliable mobile networks.
  • Two client codebases, Unity and React Native, speaking one protocol.
  • Public tables and private lobbies with invite codes.
  • A small team, so operating the system had to stay simple.

Key engineering decisions

DecisionAlternativeWhyTrade-off accepted
The server owns game state. Clients send intents, and the server validates and broadcasts the resultClient-side or peer-to-peer stateFairness, cheat resistance, one source of truthMore server work and more round-trips
Table state and pub/sub in Redis, shared across nodesIn-memory state on each nodeScale out horizontally. A node can restart without losing a tableRedis becomes a critical dependency that needs close monitoring
Turn timers run on the serverTimers on the clientA client can't stall the game or fake a timeoutTimers have to recover when a node fails over
Reconnect from a state snapshot and resumeTreat a disconnect as a forfeitMobile connections drop often, and players should keep their placeA grace window adds complexity
Private lobbies with their own lifecyclePublic matchmaking onlyFriends want to play togetherIdle rooms need cleaning up

Failures the system handles

  • A player disconnects mid-turn.
  • Client events arrive twice or out of order. Handled with idempotency (a repeated event has no extra effect) and sequence numbers.
  • A node crashes while a table is active.
  • Redis latency spikes.
  • Private rooms are abandoned.

Results

5,000+ concurrent players at peak, in production. [Measured figures to add: p95 event latency, nodes at peak, uptime over the period]

What we'd do differently

[One or two lessons from the engineers]

Since then

We've continued developing the platform as a portfolio rebuild covering private-lobby seating, bot turns and multi-table play. That rebuild is an active engineering project, not the production system described above.

How this applies to you

If your rooms, documents, auctions or live sessions desync when you add servers, or reconnects lose progress, we've already solved that problem in production.

All code is private. We offer code walkthroughs under mutual NDA.

See the real-time scaling audit