# Installability criteria: what makes a PWA installable

> The exact criteria a PWA must meet before browsers show an install prompt or let a user add the app to their home screen, broken down by platform.

**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.

## The cross-platform baseline

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.

## Android (Chrome / Chromium)

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](/reference/installation/webapk) for what this means for the app's
system footprint.

## iOS / Safari

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](/reference/installation/ios-add-to-home-screen) for details.

## 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](/reference/installation/desktop-install) for
window-management and OS-integration specifics.

## 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

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.

## Common failure modes

| 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 |

## Compatibility

For current per-browser installation support figures, see the
[compatibility section](/compatibility/).

## Practical checklist

- [ ] 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.