← All projects

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.

Hero — a live board mid-play or lobby w/ icebreaker

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.
Lobby + icebreaker
Leaderboard (lifetime / today)
Results + badge unlock (connection-reward moment)

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.

The games — grid/montage (8 games and growing)
The hard problem — real-time multiplayer sync on serverless

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.