nginx serves /404.html as internal-only (see docker/nginx.conf) so it
preserves the real 404 status via error_page - any direct client fetch,
including the service worker's install-time addAll, gets a 403. Since
addAll is atomic, that one bad URL was failing precache of the entire
app shell.
Next.js app that plays real .vpx tables via @valknar/vpinball-wasm
(WebAssembly Visual Pinball). Demo mode with the bundled default
table, drag-and-drop custom table upload, a cabinet-styled UI with a
coin-door HUD (fullscreen/stats/info/eject), a custom 404 page, PWA
support (hand-rolled service worker), and a static Docker Compose
deployment behind nginx.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012hQoM3jJT1Lx7CMTciMzvD