Skip to content

Installability criteria: what makes a PWA installable

Published

In one line: A PWA is installable when it serves over HTTPS and links a web app manifest with the minimum required fields and icons — on Chrome/Chromium a service worker is also checked by some auditing tools but is no longer a hard gate for beforeinstallprompt in current releases.

Most modern platforms agree on a short list of hard requirements:

  • HTTPS (or localhost for development). Insecure origins never qualify.
  • A linked web app manifest with at minimum:
    • name or short_name
    • start_url
    • display set to standalone, fullscreen, or minimal-ui (not browser)
    • At least one icon of 192 × 192 px and one of 512 × 512 px

Meeting these — together with sufficient user engagement (time spent on the site, repeated visits) and the app not already being installed — causes Chromium to fire beforeinstallprompt and enables the browser’s ambient install UI (mini-infobar, install icon in the address bar, etc.).

Service worker and offline quality: A registered service worker is strongly recommended for all PWAs — it enables offline support, background sync, push notifications, and is required by Lighthouse PWA audits. However, as of current Chrome releases, a service worker alone is not a hard gate for the beforeinstallprompt event. Samsung Internet and some other Chromium-based browsers may still enforce it. Always register a service worker for a quality PWA experience.

Chrome on Android applies the manifest and HTTPS criteria above, plus user engagement heuristics and the app not already being installed, before firing beforeinstallprompt. The mini-infobar may be suppressed by Chrome’s heuristics even when the manifest criteria are met. Calling prompt() on a previously saved beforeinstallprompt event lets you show the install dialog from a deliberate user gesture (e.g. a button tap), rather than waiting for the browser’s automatic mini-infobar — but it does not bypass the engagement preconditions that caused the event to fire in the first place. On installation Chrome generates a WebAPK — a thin native wrapper — rather than a web shortcut. See the WebAPK reference for what this means for the app’s system footprint.

Safari evaluates a different, more limited set of criteria:

  • HTTPS is still required.
  • A linked manifest is respected for name, short_name, icons, and display, but the older apple-touch-icon and apple-mobile-web-app-* meta tags also influence behavior and take precedence for icon selection.
  • No beforeinstallprompt event exists. There is no programmatic install API.
  • The install gesture is entirely manual: user taps the Share sheet and selects “Add to Home Screen.”
  • A service worker is not required for the “Add to Home Screen” option to appear, but offline capability still requires one.
  • iOS creates a web clip (a glorified bookmark), not a WebAPK. Push notifications, badging, and other APIs have limited or no support. See iOS Add to Home Screen for details.

Desktop (Chrome / Edge on Windows, macOS, Linux, ChromeOS)

Section titled “Desktop (Chrome / Edge on Windows, macOS, Linux, ChromeOS)”

Desktop Chromium browsers apply the same manifest and HTTPS requirements. The install UI is an icon in the address bar or an “Install” menu item under the browser menu; there is no mini-infobar equivalent. beforeinstallprompt fires on desktop and prompt() works the same way. See Desktop installation for window-management and OS-integration specifics.

Samsung Internet and other Android browsers

Section titled “Samsung Internet and other Android browsers”

Samsung Internet applies its own variant of the criteria (HTTPS + manifest + service worker) and shows its own install UI. The manifest requirements are broadly the same; the icon set and naming expectations can differ slightly.

Firefox for Android supports installation of PWAs from Firefox 128+ (as an explicit “Install” action in the site menu). Desktop Firefox does not support PWA installation.

Symptom Likely cause
beforeinstallprompt never fires Missing HTTPS, invalid manifest, display: browser, or (on some browsers) no service worker
Mini-infobar suppressed Engagement heuristics not yet met; wait for beforeinstallprompt to fire, then defer and show prompt() from a user gesture at the right moment
Icons missing on home screen Wrong icon sizes; 192 × 192 and 512 × 512 are both required
iOS shows no “Add to Home Screen” Not a failure — it always appears in the Share sheet; you just cannot trigger it programmatically

For current per-browser installation support figures, see the compatibility section.

  • Site is served over HTTPS (or localhost).
  • Manifest is linked in <head> via <link rel="manifest">.
  • Manifest has name/short_name, start_url, and display: standalone (or fullscreen/minimal-ui).
  • Manifest includes icons at 192 × 192 and 512 × 512 (PNG recommended; SVG with purpose: any maskable also accepted by some browsers).
  • A service worker is registered (required by Lighthouse PWA audits and some Chromium variants; strongly recommended for all targets to enable offline support and push).
  • beforeinstallprompt is captured and deferred for a timely, contextual install prompt on Android and desktop.
  • An iOS-specific “Add to Home Screen” guide is provided for Safari users.