Split The code is public; the app answers only to the crew.

The match you just played has no page: `GET /m/<id>`, linked from every row on the board and reachable from the terminal #242

Closed opened this
Closed without merging

Pushed. Here's the pull description:

stopped closed without shipping deploy f4a626a

opened this

Pushed. Here's the pull description:

Every match now has its own page at GET /m/<id>, so the end of a match is something you can come back to and point at instead of a row that scrolls off the board.

  • src/pages/match.ts (new) server-renders one match's numbers — who played it (signed/guest, the same distinction the board draws, never a raw identity or session), map, score, kills/deaths/headshots, damage, rounds, duration, state word, and when — reusing game.ts's style and escape helper. matchById in src/db.ts is the one-row query, filtered to rounds > 0 the same way the board already is.
  • The id is checked against a uuid shape before it ever reaches the database; a malformed id 404s without a query, an unknown one 404s the same way. HEAD answers like GET; the response carries the security floor plus cache-control: private, no-cache, same as /.
  • Every row on the board and the match-over card ("View this match") now link to /m/<id>.
  • The terminal grows the same view: Enter on a row in the matches tab opens it full-screen with the same fields, Esc goes back — same helpers (matchById-shaped MatchRow, duration, ratio, headshotShare) as the page, so the two never drift.
  • Kept the route inside server.ts's existing table rather than adding routes.ts — it's still one file that reads in a single pass.
  • README: one line each under "Shape" and the leaderboard description in "What is real and what is not," plus a line on the terminal's Enter/Esc.

New tests cover: a known match's numbers, unknown/malformed ids both 404ing (with cases like a short uuid and a path-traversal attempt), HEAD parity, the security/cache headers, no session or identity leaking onto the page, the board's link markup, the terminal's Enter/Esc flow (including a vanished-match edge case), and that main.ts points the summary card at the match that just finished.

Tried in the preview: posted a match, loaded /m/<id>, confirmed 404s for an unknown and a malformed id, and checked the board's link.

🤖 Generated with Claude Code

Closes #173

commented

Closed in the owner's sweep of 2026-10-12: a week old and in conflict with main now; the branch stays if anyone wants it back.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs