A withdrawn team stays in any slot whose opponent is not known yet and forfeits when they arrive; the board strikes the name through and tags the match 'Forfeit · Team'. Release 0.5.1. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01MB7nCCAscYsb3zzkT6LHZi
7.2 KiB
7.2 KiB
Changelog
All notable changes to Courtside are recorded here. The format follows Keep a Changelog, and versions follow Semantic Versioning.
The running version is reported at GET /healthz and shown in the page footer,
so you can always tell what a deployment is actually serving.
[Unreleased]
[0.5.1] - 2026-09-03
Changed
- A team that withdraws during a bracket now shows as a forfeit in every match it was in or would have reached, with its name struck through and a "Forfeit · Team" tag on the match, instead of quietly becoming a bye. If the opponent isn't known yet, the withdrawn team stays in its slot and forfeits the moment the opponent arrives; in double elimination it forfeits its losers-bracket match too. Play continues and the tournament still goes Final on its own.
- Pool match lists mark forfeits as "FF".
[0.5.0] - 2026-09-03
Fixed
- Double elimination with byes could never finish. With many byes (e.g. 18 teams in a 32 bracket) losers-bracket slots fed by matches that never happen were left waiting forever; the tournament stayed live with both courts open. Byes now cascade through the whole bracket: a slot nobody can ever fill is a bye for the team on the other side, or a void match if both sides are empty. This is re-run when the server starts, so a stuck tournament unsticks itself on the first deploy of this version and goes Final if everything else is played.
- Tested at 5, 6, 9, 12, 17, 18 and 23 teams, single and double elimination.
Added
- Build the bracket by hand. On the desk, "Build the bracket by hand" lists every round-1 match with a team picker on each side, pre-filled with standard seeding. Pick who plays whom, leave a side as "bye" for a walkover, choose single or double elimination, and build. Teams picked twice are flagged before you submit and rejected by the server.
[0.4.2] - 2026-09-03
Fixed
- Stylesheet and scripts are referenced with
?v=<version>, so a new release can no longer be served with a cached oldapp.css(which made the score keeper page render unstyled on phones after 0.4.0). Versioned assets are cached for a year; unversioned for a minute.
[0.4.1] - 2026-09-03
Added
- Bracket matches that are waiting on a live match now appear in the queue and under each court as "Net Gains vs winner on Court 2 · ready ~2:33", so double elimination and late single elimination rounds still show a next-up time. These are tentative (no on-deck alert until both teams are known).
- Score keeper access is a QR code per court, shown on each court card of the desk, plus a
printable page with all courts' codes (
/admin/t/<slug>/keeper-qr). The copy-link button is gone; "Open on this device" remains for the organizer's own phone. - Idle courts show their next-up match too.
[0.4.0] - 2026-09-03
Added
- Courtside Manager, a score keeper page per court (
/keeper/<slug>/<court>?k=…). Big +/− buttons, undo, sets for best-of-3, and a Finalize step with confirmation that appears once a side has won under the tournament's rules. It follows whatever match is on the court and moves to the next one automatically. The link is opened or copied from the court card on the desk; it can only score and finalize, never edit a finished result. - Court cards on the public board show the estimated finish time of the current match.
Changed
- Organizer desk: the Phase section now sits below Courts and Queue, so the score pads are at the top during play.
- Multi-set running scores (
liveSets) show on the public board while a keeper is scoring. - Match durations outside 2–90 minutes are ignored for the ETA average.
[0.3.1] - 2026-09-03
Added
- Every team name on the public board (courts, up-next, bracket tree and list, pool
standings, team schedules) links to that team's page at
/t/<slug>/teams/<id>, which shows their next match, court, record and schedule. Team pages by private code still work. - Court cards show the running average game time and minutes played, and a "Next up" line with the match predicted for that court and the clock time it should be ready.
- Up-next queue shows the expected clock time as well as minutes.
- Footer links to the organizer desk.
Fixed
- A team's schedule on its page shows scores from that team's point of view.
[0.3.0] - 2026-09-03
Added
- Bracket is drawn as a real tree: matches positioned per round with connector lines between feeder and next match, winners in bold, live matches tagged with their court, empty slots labelled with what fills them ("W R1.4", "L R2.1"), and the viewer's own team highlighted along its path. Double elimination shows winners bracket, losers bracket and finals as separate trees.
- Three bracket views: full tree with sideways scrolling, "Fit to screen" (scaled to the phone's width, the default on narrow screens), and a round-by-round list. The choice is remembered per device.
scripts/seed-demo.js --stage=bracket|doubleseeds the demo mid-bracket.
Changed
- Public state now includes
loserFeeds/loserFeedsSideon bracket matches so the page can label upcoming slots.
[0.2.0] - 2026-09-03
First deployed release. Courtside now runs as a managed stack rather than a
docker compose up on someone's laptop.
Added
docker-compose.komodo.yml— deployment compose for a host that already sits behind a shared Cloudflare Tunnel. Publishes a host port instead of bundling acloudflaredsidecar, so there is one tunnel to operate rather than one per app.- Version reporting:
server/version.jsreads the version frompackage.json;GET /healthzreturns it asversion, and the footer rendersCourtside v<x.y.z>. - This changelog.
- Push-to-deploy: a push to
maintriggers a rebuild and redeploy of the stack.
Notes
- The original
docker-compose.yml(app + its owncloudflared) is unchanged and still the right choice for a standalone install, as documented indocs/DEPLOY.md. - No database migration. State is JSON documents in SQLite created with
CREATE TABLE IF NOT EXISTS; upgrading is a container replacement.
[0.1.0] - 2026-09-03
Initial MVP.
Added
- Tournament engine with no I/O (
engine/): round-robin pools, single and double elimination with bracket reset, pools-then-bracket, configurable rally scoring (points, win-by, cap, best-of), standings with tiebreaks, and a court engine that assigns matches as courts free up and maintains an "up next" queue with ETAs. - One-QR-code public flow:
/t/<slug>is the sign-up form during check-in, then the roster, then the live board, then the results page — no re-scanning. - Per-team pages at
/t/<slug>/team/<code>with on-deck and up-now alerts. - Organizer desk at
/admin: create tournaments, manage teams, generate pools and brackets, score matches, correct results, withdraw teams, pause and swap courts, broadcast messages, print QR codes. - TV display mode at
/t/<slug>/display. - Live updates over a WebSocket at
/ws/<slug>, with a state re-fetch as a fallback. - Docker image and compose files, deploy/architecture/organizer/API docs, engine unit tests, an HTTP smoke test, and a full-day simulator.