Skip to main content
Version: 2.0 PartyKit

Sommelier Arena

A real-time blind wine tasting quiz β€” Kahoot-style, €0/month to host, zero cold starts.

How it works​

A host creates a tasting with one or more wines. Each wine gets five questions (color, region, grape variety, vintage year, wine name). Participants join via a 4-digit code on their phone, answer live as the host controls the pace, and compete on a leaderboard.

Everything runs on Cloudflare: the frontend is a static Astro site on Cloudflare Pages; the game backend is a PartyKit Durable Object (Cloudflare Workers); session lists are stored in browser localStorage.

Core concepts​

  • Session β€” a single game instance, identified by a randomly generated 4-digit numeric code (e.g. 4821).
  • Round β€” one wine. Each round has exactly 5 questions played back-to-back. The leaderboard is shown after all 5 questions, before the next wine begins.
  • Question β€” one of the 5 fixed-category questions for a wine: color, region, grape_variety, vintage_year, wine_name. The host pre-fills the correct answer and 3 distractors.

Key rules​

RuleValue
Max players10 (lobby rejects extra joins)
Questions per wine5 (fixed categories)
Timer per questionConfigurable 15–120 s (default 60 s)
Scoring100 pts correct Β· 0 pts wrong/unanswered
Answer changingAllowed until host reveals β€” no first-tap lock
Mid-session joinsNot allowed once first round starts
PersistenceDO storage (SQLite) in production; in-memory in local dev

What's new in v2.0 (PartyKit)​

  • Zero cost, zero cold starts β€” Durable Objects wake on demand
  • Session persistence β€” create Monday, resume Wednesday
  • Participant rejoin β€” page refresh or URL (/play?code=X&id=PSEUDONYM) reconnects automatically, even from a different device
  • Host identity dashboard β€” see all your past and active sessions from one device
  • Five questions per wine β€” added wine_name category
  • Configurable timer β€” 15–120 s slider at session creation
  • No-lock answers β€” participants can change their answer until the host reveals
  • 2 Γ— 2 option grid β€” cleaner layout on mobile

Who are you?​

I am…Start here
A developer setting up locallyQuick Start
A developer understanding the systemArchitecture Β· Tech Stack
A product person / userFeatures Β· Gameplay Workflow
An admin managing answer dataQuick Start β€” see /admin page
Deploying to CloudflareDeployment Guide
An automation agent / AIFor Automation

Quick reference​

DocWhat it covers
Quick StartRun locally in under 2 minutes
ArchitectureRepo layout, runtime communication, DO lifecycle
Tech StackStack choices and design principles
Gameplay WorkflowPhase machine, event flow, answer/scoring rules
Event ReferenceAll WebSocket message types (client ↔ server)
Host & Participant IdentityTANNIC-FALCON-style IDs, session dashboard, rejoin for host and participant
Data PersistenceDO storage keys, KV schema, what survives a restart
Deployment GuideCloudflare Pages + PartyKit + Wrangler deploy
Configuration & EnvironmentsEnv vars, local vs prod, nginx explanation, testing preview