LA.
personal project · playable demo

Rally

A real-time match companion. You follow the game play by play, make predictions for fun, and climb the leaderboard. The first demo runs on a replayable match: France vs Australia, 2019 FIBA World Cup.

The product

No streaming, just the essentials of the game live and something to play with. The idea: turn a passive viewer into an active player, no money, just for fun.

Live scoreboard
score, quarter and clock, derived from the engine continuously
Momentum bar
the flow of the game at a glance, the visual signature
Predictions for fun
who scores next, who wins the quarter
Leaderboard and badges
your progress against bots and other players, live
Play-by-play
the action feed, in real time

the architecture

Real time, cleanly distributed.

Static front served from the CDN, event-driven AWS backend, with two real-time mechanics. A shared clock, derived from a server anchor, makes every visitor see the same second of the match. And a WebSocket relays player presence and predictions live, without the server computing any score: each client derives the same leaderboard on its own, bit for bit, deterministic bots included. If the anchor doesn't respond, it gracefully falls back to a local replay: the site never breaks.

Lambda
exposes the match anchor (Function URL) and drives the real-time room: connect, join, predict
API Gateway WebSocket
real time: player presence and predictions relayed to everyone, live
DynamoDB
the memory: shared anchor, active connections and unique handles
EventBridge
the guardian: watches and regenerates the anchor continuously (self-heal)
IAM + CloudWatch
least-privilege permissions, logs and observability
SAM · eu-west-3
the whole infra described in YAML, deployed with one command
Vercel + Next.js
static front, clock synced to the server, local replay fallback

Event-sourced engine in pure TypeScript, seeded bots and a leaderboard derived bit for bit on the client, with no server-side scoring. Infra as SAM (IaC, eu-west-3), WebSocket in production. Next step: harden prediction validation server-side, then migrate to CDK.

V1 complete, live.

V1 runs on a fixed France vs Australia match, which decouples it from any sports API. It's all there already: shared clock, live player presence, and a multiplayer leaderboard where everyone sees the same result. Next: a real sports data source, player accounts and more badges. It's my playground to push real time and AWS in real conditions.