Multiplay Games

Multiplay Games is a free real-time multiplayer party games platform: create a room, share the link, and play together in seconds. No downloads, no sign-ups. It now hosts 9 games for 2-25 players: Wordle, Memory Match, Connect, Trivia, Quick Draw, Dino Runner, Arrows, Ballpark, and Snake Royale.
The whole platform, every migration, API route, game, and refactor, was built with AI-assisted development. Since July 2026 that happens through an issues → PRs → deploy loop where the AI reviews the codebase, files tickets against itself, and ships them as PRs.

Features
- 9 Multiplayer Party Games: from the Wordle flagship to Ballpark, a closest-guess estimation game that went from proposal to production in 24 hours
- Real-Time Synchronization: Supabase Realtime with Broadcast channels, Presence, and Postgres Changes, with a polling fallback arbitrated by monotonic guards
- Best-of-N Matches: multi-round play with cumulative banked scoring across rounds
- Instant Same-Room Rematch: skip the new-room ceremony and go again in place
- Short Join Links: share
grahammakesgames.com/j/CODEand friends drop straight into the lobby - Universal Emote Bar: rate-limited, validated emote relay in every lobby and game
- Room History: durable cross-session game history surfaced on the profile page
- Snake Royale Endgame: shrinking arena, kill feed, and dead-player spectating
- Admin Console: live/24-hour/30-day usage metrics with trend charts at
/admin, gated fail-closed - Subscriptions: Stripe-powered supporter plans with ad-free rooms and unlockable site palettes
- Secure Scoring: AES-256-GCM encrypted score submissions with key rotation and replay protection

My Contributions
- AI-Driven Development Workflow: built the entire platform with AI: 86 merged PRs, including 45 in a single month once the issues → PRs → deploy loop kicked in
- Real-Time Architecture: hybrid Supabase Realtime design (Postgres Changes for durable state, Broadcast for high-frequency data, Presence for who's online) targeting ~50-100ms updates vs the original 2,000ms polling
- Refactoring at Scale: measured 70-78% duplication across 7 game pages, then extracted a shared
useGameRoomorchestrator: Wordle shrank 41%, Trivia 40%, and one consolidation PR removed a net 1,800 lines - Security Hardening: AES-256-GCM score encryption, open-redirect and field-level authorization fixes, payload caps, rate limiting, and locking down 14 database functions that Postgres had left executable by anonymous callers
- Quality Infrastructure: generated Supabase types with shared API contracts, 9 unit suites with 3,500+ assertions, and Playwright smoke tests that boot every game
- Operations: admin metrics console verified against live production data, subscription billing via Stripe, and automated data-retention tooling
Technologies
- Next.js 16 + React 19: App Router on Vercel
- Supabase: Postgres with Realtime (Broadcast, Presence, Postgres Changes) and 16 SQL migrations
- Stripe: subscription billing with webhook-driven state
- TypeScript + Zod: ~50,000 lines of typed code with runtime-validated API contracts
- Tailwind CSS v4: full retro 8-bit design system with pixel fonts, scanlines, and light/dark themes
- Playwright + tsx: E2E smoke suite and unit tests
Why It's Cool
Everything on the platform was written by AI, and since mid-2026 the AI also decides what to write: review passes file issues against the codebase, issues become PRs, PRs deploy. That loop has shipped an entire new game in a day (Ballpark: proposed, built, playtested in a real two-browser match, and patched inside 24 hours) and caught its own bugs, including a critical database exposure and a silent score-loss race spanning five moving parts.
The realtime layer is the technical heart: durable state rides Postgres Changes, ephemeral bursts (drawing strokes, emotes, snake movement) ride Broadcast channels, and a unit-tested arbitration reducer keeps the polling fallback from fighting the WebSocket feed.
Try It Out
Visit grahammakesgames.com, pick any of the 9 games, create a room, and share the link. Read the full story in the blog post about running an AI issues → PRs → deploy loop.