The build revision now hashes index.html, the sw.js source, the web app
manifest and every precached icon (sorted by path, length-prefixed), so a
deploy that changes only the manifest or an icon ships a new worker and
fresh caches.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Add a build-only Vite plugin (admin/vite-sw-plugin.ts) that, after the
bundle is written, injects every same-origin script/link asset referenced
by dist/index.html into dist/sw.js's precache, so the offline shell renders
immediately after install (PWA-001).
- Replace the literal cache version with a build revision (sha256 of the built
index.html and sw.js source, truncated) used in both cache names, so each
release installs a new worker with fresh caches (PWA-002).
- On activate, delete only stale nestquest-admin-* caches; unrelated
same-origin caches survive (PWA-003).
- Add Vitest regressions for all three findings.
Task: 96ab3c0b-7554-4098-8af1-2be7815f8929
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Static web app manifest (standalone, brand-token colours) with 192/512
"any" icons and a 512 maskable icon, generated as real PNGs by
admin/scripts/generate-icons.mjs (zlib only, no network).
- Hand-written public/sw.js: precaches the shell on install, prunes stale
caches on activate, falls back to the cached index.html for offline
navigations, serves same-origin static assets cache-first; never
handles cross-origin or non-GET requests.
- registerServiceWorker() registers /sw.js only in production builds and
logs on failure; called from main.tsx. index.html links the manifest,
theme colour and apple-touch-icon.
- Vitest coverage for manifest installability, icon PNG dimensions, the
worker's install/activate/fetch behaviour and the production guard.
Task: 96ab3c0b-7554-4098-8af1-2be7815f8929
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>