supersam/docs/superpowers/specs/2026-03-14-pwa-demo-dashboa...

4.0 KiB

PWA Demo Dashboard Design

Date: 2026-03-14

Goal: Turn the app into an installable PWA and add a dashboard panel that explains what PWA is, why it matters for demo mode, and how the offline demo behaves.

Context

  • The app already has a demo mode that works without Supabase configuration.
  • Demo login state is stored locally in localStorage.
  • Demo orders, notifications, and users are already shipped with the frontend bundle.
  • Git history shows an earlier public/service-worker.js, but the current workspace no longer contains the PWA assets.

Decision

Implement a manual PWA layer for the Vite app and pair it with a dashboard-only "Demo and PWA" panel.

This keeps the solution dependency-light, restores full control over caching behavior, and lets the demo flow work offline after the first successful load.

Architecture

PWA shell

  • Add a public/ directory with:
    • manifest.webmanifest
    • service-worker.js
    • app icons for install surfaces
  • Register the service worker from src/main.jsx.
  • Cache the app shell with a conservative strategy:
    • precache the shell entrypoints and icons during install
    • serve navigation requests with an app-shell fallback
    • serve same-origin static assets from cache first, then network

Runtime state

  • Add a small frontend service/hook for:
    • service worker registration status
    • online/offline state
    • install prompt availability
    • installed/running-standalone detection
  • Keep this state client-only and independent from the auth/data hooks.

Dashboard experience

  • Add a dedicated dashboard panel in the overview section named around "Демо и PWA".
  • The panel explains:
    • what PWA is
    • why installability matters for demos
    • what works offline in demo mode
    • what still requires network and real backend integration
  • Show compact status chips for:
    • online/offline
    • app install availability / installed state
    • offline readiness after service worker activation
  • Show an install CTA only when the browser exposes an install prompt.

Offline behavior

Guaranteed offline

  • Opening the installed app after it has already been loaded once
  • Reopening /dashboard without network
  • Demo login flow with local role selection and OTP 000000
  • Viewing demo orders, metrics, notifications, and role-based dashboard sections backed by local data

Not guaranteed offline

  • Supabase-backed auth and profile loading
  • Any future remote integrations, push delivery, or server-dependent writes
  • Fresh first load before the service worker has cached the shell

The dashboard copy must state these limits plainly to avoid overpromising.

UI content

The dashboard panel should communicate in Russian and stay concise:

  • short explanation of PWA in plain language
  • short explanation of why it is useful in demos
  • explicit note that demo data is local, so the product can be shown without internet after first launch
  • explicit note that production integrations need connectivity

File responsibilities

  • public/manifest.webmanifest — install metadata
  • public/service-worker.js — shell caching and offline fallback behavior
  • public/icons/* — install and launcher icons
  • src/main.jsx — service worker registration
  • src/hooks/usePwaStatus.js — browser/PWA state
  • src/components/dashboard/PwaDemoPanel.jsx — dashboard explanation and status UI
  • src/pages/DashboardPage.jsx — placement of the panel in overview
  • tests next to the new hook/component where it is practical

Testing strategy

  • Add targeted tests for the new hook/component logic where feasible in Vitest.
  • Manually verify:
    • build succeeds
    • manifest is emitted and linked
    • service worker registers
    • install prompt appears in a supported browser
    • dashboard is available offline after one online load
    • the explanatory panel reflects online/offline and install states correctly

Out of scope

  • Push notification recovery or subscription flows
  • Full offline write synchronization to a server
  • Refactoring unrelated dashboard architecture