Sriganesh Srinivasan
← All work

$20 Blind Draft.

A two-player bidding party game you can play on one phone or two

2026–now · Solo — design, frontend, backend · Active

Live link ↗Code ↗
$20 Blind Draft
Problem
The "$20 draft" party game only works if nobody knows what's coming next. Played remotely, whoever holds the shuffled deck could peek at it.
Built
A SvelteKit game whose rules are one pure reducer. Online play runs that same reducer in Supabase Edge Functions behind row-level security, so clients only ever see a redacted copy of the game, and simultaneous moves are settled with optimistic versioning.
Stack
SvelteKit, TypeScript, Supabase, Postgres, Deno, Vitest, Playwright
Outcome
Live, with no accounts needed. 190+ tests across unit, real-browser component and end-to-end suites, including a seeded simulation of 840 full drafts per run. CI runs 4 parallel jobs and gates on axe-core accessibility checks.

What it does

Two players each get a fake $20 and a few empty roster slots. Items from a category (NBA players, foods, movies, or a list you type yourself) are revealed one at a time, so nobody knows whether something better is coming. Either player opens the bidding, they raise each other, and when one concedes, the other buys it. Every item ends up on someone’s roster.

How it works

  1. Jul 2026Pass-and-play on one phone, with the rules engine and the full content pools.
  2. Aug 2026Online play: schema, row-level security, Edge Functions and realtime updates. CI added.
  3. Aug 2026Fixed quitting, the self-award exploit, and invite links that seated nameless guests.
  4. Sep 2026Keepalive fix, then a cleanup that cut 1,383 lines of stale comments and dead code.

What broke

Testing

I tested at three levels, each for a different reason:

CI runs these as 4 parallel jobs, so a red X says what broke. The end-to-end job boots a local Supabase stack and fails, rather than skips, if the online tests can’t run.

What I’d do next

Online play has been tested in separate browser sessions but not yet on two real phones. Next up: no test yet fires two moves at the exact same moment, end-to-end tests only cover Chromium, and a quit could offer a rematch instead of a dead end.

Next projectSmartRoomThing →