BracketForge
A live Rock Paper Scissors tournament platform built as a reusable bracket and broadcast system: players join from phones, hosts run the room from a separate dashboard, and the team watches polished reveals on a shared screen.
Problem and purpose
Rock Paper Scissors is intentionally simple, so the engineering challenge is not the rule set. The useful product problem is coordination: get a group into a room quickly, split them into fair matches, keep the host in control, make the broadcast feel worth watching, and recover gracefully from real test behavior like duplicate joins or odd player counts.
Experience delivered
- Players land on a clean join page, enter a room code, see the lobby roster, and make private throws when their match is active.
- The host uses a separate dashboard for setup, lobby management, round starts, broadcast display, and match advancement.
- Early rounds can run as simultaneous batch matches, while late rounds automatically switch into one featured match at a time.
- Broadcast reveals use animated Rock, Paper, and Scissors artwork instead of generic text labels.
- Hosts can configure best-of formats and per-throw timers so the game works for quick standups or more deliberate team events.
Serverless architecture
- The player and host pages are static HTML, CSS, and JavaScript deployed under the existing CloudFront-backed portfolio.
- A Python Lambda Function URL exposes the room API without an always-on server.
- DynamoDB stores room code, host token, players, active matches, throw choices, scores, timer metadata, and TTL cleanup.
- The frontend polls compact room state and renders the correct view for player, host, lobby, batch round, featured reveal, or completed bracket.
- Generated image assets are served from the same static path as the app so mobile clients and broadcast screens load consistently.
Real test hardening
The first coworker-style test exposed the right kinds of rough edges: people click join more than once, phone browsers cache old assets, groups are not always even, and broadcast timers must be obvious without requiring a refresh. Those issues shaped the next iteration.
- Browser-session join ids make repeat joins idempotent instead of creating duplicate players.
- Odd-player rounds generate a random CPU opponent so a player still gets a match instead of an invisible bye.
- Broadcast countdown text updates locally between API polls and auto-picks missing throws when the timer expires.
- Absolute asset paths and explicit CloudFront invalidations keep the BracketForge route reliable on mobile.
Reusable platform direction
BracketForge is deliberately separated from Office Olympics because the tournament engine can support more than Rock Paper Scissors. The room, player, host, lobby, bracket, timer, and broadcast concepts are reusable foundations for future mini-games that need lightweight team participation without requiring accounts.
Try the live build
Launch BracketForge to join or create a room from the player flow, or open the host dashboard for the broadcast setup surface.