Tournament engine (pools, single/double elimination, standings with proper tiebreaks, withdrawals, two-court queue with ETAs and alerts), a single-process Node server with SQLite via node:sqlite and a WebSocket live board, organizer desk, QR landing page that follows the tournament phase, Dockerfile and compose with cloudflared, and documentation for deploying and running a day. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01MB7nCCAscYsb3zzkT6LHZi
2.3 KiB
2.3 KiB
Roadmap
What exists today is the MVP: run one tournament on one or two courts from a phone, with a QR landing page that follows the day and a live board. The list below is in rough priority order; each item is independent.
Next
- SMS alerts (Twilio). The engine already emits
up_now,on_deck, andbroadcastevents with the team ids and message text; a sender that subscribes toTournament.on()and posts to Twilio whenTWILIO_*env vars are set is a small addition. Captains opt in at registration ("text me when we're up"). - Web Push. VAPID keys generated at first start, a service worker on the team page, subscriptions stored per team. Works on Android in any browser and on iOS when the page is added to the home screen.
- Captain-submitted scores. Winning captain enters the score from the team page, losing captain confirms with one tap, organizer only intervenes on disputes. Needs a per-team write token (the existing code plus a signed nonce) and a "pending confirmation" match status.
- Co-organizers with roles. Invite links; a
scorekeeperrole that can enter scores but not change the bracket or roster. - Run a real event and fix what it teaches. The simulator is not a beach in September.
Later
- Divisions (competitive / rec) inside one tournament, each with its own pools and bracket, sharing the court queue.
- Swiss pairing for stage 1 when there are too many teams for pools and too few hours for a full round robin.
- Timed sets (e.g. 12-minute sets) as an alternative to point targets, for keeping a large field on schedule.
- Season leaderboard across tournaments: wins, points, streaks; the thing that brings people back. Build as a read model over the
eventstable. - Player identities that persist across tournaments so individual stats are possible (currently a player is just a name on a team).
- Templates: save a format/rules setup and reuse it.
- Sponsor strip and photos on the public page.
- Multi-instance deployment: replace the in-memory
Registrywith a shared store and pub/sub if one process is ever not enough (it will be enough for a very long time).
Non-goals
Payments, waivers, and league scheduling across weeks. Plenty of products do those; Courtside is the desk for the day itself.