- Mobile bottom tab bar (icon tabs) with the top nav hidden on small screens;
content padding so it never overlaps
- data: scripts run via bun (not tsx/node) so the oven/bun build image needs no
node — fixes the Dockerfile data:build step
- README: features, data sources, dev/test/build/deploy, env vars
- Validated the production Docker image end-to-end: build succeeds (378MB),
container serves /healthz, /api/snapshot (104 fixtures), /api/predictions
(20k sims), the SPA with deep-link fallback, and the story dataset
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- buildStatsbombViz.ts: processes the 2022 WC Final (Argentina 3-3 France) from
StatsBomb open data → shots+xG, cumulative xG race, starting-XI pass networks,
totals, shootout result. Output committed (11KB) to avoid build-time fetch
- Custom SVG viz (no chart lib): reusable Pitch (StatsBomb 120x80 coords),
ShotMap (xG-sized dots, teams attacking opposite goals), XgRace (stepped
cumulative xG with goal markers, d3-scale), PassNetwork (nodes ∝ involvement,
links ∝ pass volume)
- StoryPage: narrative with hero scoreline, by-the-numbers bars, and the three
visualizations with explanatory copy
- Verified in browser: all three render correctly, no console errors
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>