Real-time beer pong tournament app for party-scale events. Players sign up with selfies, form teams, play matches on multiple tables, and climb the Elo leaderboard — all from their phones.
- Selfie Signup — snap a photo, pick a name, get a recovery PIN
- Smart Matchmaking — Elo-based pairing across multiple tables with automatic suggestions
- Team Challenges — directly challenge another team to a match
- Live Leaderboard — individual and team rankings with real-time Elo updates
- Cup Grid Tracking — report results with a visual 10-cup grid showing which cups were hit
- Tournament Recap — end-of-night stats, MVPs, cup heatmaps, and match history
- Admin Panel — manage tournament phases, resolve disputes, seed data, pause/unpause players
- Mobile-First — designed for one-handed use in dim lighting with 48px touch targets
| Layer | Tech |
|---|---|
| Frontend | React 19, TanStack Start / Router, Tailwind CSS v4 |
| Backend | Convex (real-time DB, file storage, server functions) |
| Hosting | Vercel with SSR via Nitro |
| Package Manager | Bun |
# Install dependencies
bun install
# Start dev server (web + Convex backend)
bun run devRequires a Convex project. Set VITE_CONVEX_URL in .env.local with your deployment URL.
src/
routes/ # Pages — signup, dashboard, leaderboard, teams, admin, recap
components/ # Shared UI — BottomNav, BottomSheet, CupGrid, MatchCard, Toast
lib/ # Utilities — session tokens, image compression
styles.css # Design system — CSS custom properties, utility classes
convex/
schema.ts # Database tables — players, teams, matches, challenges, tournament
matchmaking.ts # Match suggestions, acceptance flow, result reporting, Elo calc
players.ts # Signup, recovery, session management
teams.ts # Team formation, dissolution, roster queries
challenges.ts # Direct team-vs-team challenge system
elo.ts # Elo rating algorithm
tournament.ts # Tournament state machine (signup → active → paused → finished)
stats.ts # End-of-tournament statistics and aggregations
helpers.ts # Shared backend utilities
# Production deploy (uses prod Convex DB)
VITE_CONVEX_URL="https://your-prod.convex.cloud" bunx vercel build --prod
bunx vercel deploy --prebuilt --prod --yes