A Progressive Web App is a website that meets a specific set of technical criteria letting browsers offer it as an installable, app-like experience. The three core requirements:
- Web App Manifest -- a JSON file (typically
/manifest.jsonor/site.webmanifest) declaring the app's name, icons, theme color, and display mode. Drives the install prompt and the standalone window's chrome. - Service Worker -- a JavaScript file registered via
navigator.serviceWorker.register('/sw.js')that runs in a background thread, intercepting network requests. Required for offline support, push notifications, background sync, and app-shell architecture. - HTTPS -- service workers refuse to register on insecure origins (with one exception:
localhostfor development).
What "installable" means in practice:
- Chrome / Edge: the omnibox grows an install icon; users get an OS-level app entry, taskbar pinning, and standalone-window UX.
- iOS Safari: users can "Add to Home Screen" -- the app gets a home screen icon and full-screen launch. iOS support is partial (no service-worker push, no background sync) but improving.
- Android Chrome: the app installs to the launcher with proper icon adaptation and integrates with the OS share sheet.
Why operators care: PWAs hit higher engagement metrics than installed native apps with much less development cost. The trade-offs are platform-specific (iOS still gates a lot of capability behind native apps) and discovery-related (no app-store presence by default, though Microsoft Store and Play Store both accept PWA submissions).
Beyond the three core requirements, "good" PWA depth includes: maskable icons (Android adaptive icons), display=standalone not browser, a meaningful theme_color, and a worker that actually does something useful (not just event.respondWith(fetch(event.request))).