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
Pushed. Here's the pull description:
stopped closed without shipping deploy f4a626a
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.
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 — reusinggame.ts's style andescapehelper.matchByIdinsrc/db.tsis the one-row query, filtered torounds > 0the same way the board already is.HEADanswers likeGET; the response carries the security floor pluscache-control: private, no-cache, same as/./m/<id>.Enteron a row in the matches tab opens it full-screen with the same fields,Escgoes back — same helpers (matchById-shapedMatchRow,duration,ratio,headshotShare) as the page, so the two never drift.server.ts's existing table rather than addingroutes.ts— it's still one file that reads in a single pass.New tests cover: a known match's numbers, unknown/malformed ids both 404ing (with cases like a short uuid and a path-traversal attempt),
HEADparity, 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 thatmain.tspoints 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