Chalo Ramiye (Let's Play)
A real-time multiplayer games portal inside Sambandh — party games engineered to help a globally-scattered community actually get to know each other.
The problem
The same international YDS community — members rarely meet people outside their own circle or region.
The games are a Trojan horse for connection: the real goal is getting strangers across regions and generations to interact.
What I built
- 8 (and growing) real-time multiplayer minigames — in rotation: word_search, zip_race, minesweeper, dots_and_boxes, code_breaker, memory_match; math_mania, cross_word, and common_ground are code-complete on an admin-gated rollout.
- Lobby + icebreakers — every match opens with an English + Gujarati conversation prompt.
- Live leaderboards — lifetime plus timezone-aware daily.
- Results + badge-unlock — one-time Mandal/region badges and a score breakdown surfacing connection bonuses.
How it works
Client — React 19 + TypeScript + Vite, a web app embedded as a webview inside the native Sambandh app (fast iteration + sandboxing). Zustand for auth/session, TanStack Query for REST, React Router, Motion, and a raw WebSocket transport. PostHog + GrowthBook for analytics/flags.
Backend — the games package in node-be: Node + Express on AWS Lambda (Serverless Framework) over MongoDB/Mongoose. Real-time fan-out runs on AWS API Gateway WebSockets + the API Gateway Management API (server push-only). The admin surface (games-admin) is a separate React/Apollo/Tailwind app.
Usage is violently spiky (a couple thousand players on event weekends, ~100 on a normal day, sometimes far lower), so serverless was chosen for usage-scaled billing on a volunteer budget — but serverless has no long-lived process to hold the connection state realtime multiplayer needs.
The solve: API Gateway WebSockets hold connections outside Lambda; connection-routing records in MongoDB map connectionId → user/game; the server pushes authoritative state via the Management API. REST carries player actions (transaction-safe) while WS carries authoritative pushes. rev-versioned frames make concurrent out-of-order updates safe — the client tracks a per-minigame revision and drops stale frames, so three simultaneous actors never cause visual rewinds.
Rounded out by optimistic rendering + deterministic reconciliation (masking 100–500ms latency) and snapshot-merge on reconnect (5 retries; a stale REST snapshot can't overwrite a fresher WS push). Scores are computed server-side only (anti-cheat). Why it's the flex: a genuine distributed-systems problem — stateful realtime on a stateless substrate — driven by a real product/cost constraint.
Secondary — connection-maximizing scoring
Social-graph-aware scoring with four levers: a bonus for new people, a penalty for repeat trios, a bonus for regional (Mandal) diversity, and a bonus for age-group diversity. The game literally pays you to meet strangers.