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
27 lines
2.3 KiB
Markdown
27 lines
2.3 KiB
Markdown
# 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`, and `broadcast` events with the team ids and message text; a sender that subscribes to `Tournament.on()` and posts to Twilio when `TWILIO_*` 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 `scorekeeper` role 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 `events` table.
|
|
- **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 `Registry` with 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.
|