Cached app.css from before 0.4.0 left the score keeper page unstyled on phones. Assets are now /static/x?v=<version> with a one-year immutable cache; unversioned requests get 60s. Release 0.4.2. Co-Authored-By: Claude Fable 5.1 <[email protected]> Claude-Session: https://claude.ai/code/session_01MB7nCCAscYsb3zzkT6LHZi
117 lines
5.6 KiB
Markdown
117 lines
5.6 KiB
Markdown
# Changelog
|
||
|
||
All notable changes to Courtside are recorded here. The format follows
|
||
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow
|
||
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||
|
||
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.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 old `app.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|double` seeds the demo mid-bracket.
|
||
|
||
### Changed
|
||
- Public state now includes `loserFeeds`/`loserFeedsSide` on 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 a
|
||
`cloudflared` sidecar, so there is one tunnel to operate rather than one per app.
|
||
- Version reporting: `server/version.js` reads the version from `package.json`;
|
||
`GET /healthz` returns it as `version`, and the footer renders `Courtside v<x.y.z>`.
|
||
- This changelog.
|
||
- Push-to-deploy: a push to `main` triggers a rebuild and redeploy of the stack.
|
||
|
||
### Notes
|
||
- The original `docker-compose.yml` (app + its own `cloudflared`) is unchanged and
|
||
still the right choice for a standalone install, as documented in `docs/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.
|