Help centre
Answer
What icon sizes does a PWA need?
Short answer
A PWA manifest needs at least a 192x192 and a 512x512 icon to be installable on Chromium browsers. For best results across platforms, also include a maskable icon (so Android does not crop your logo oddly) and a separate 180x180 apple-touch-icon link for iOS Safari, which does not read the manifest for its home-screen icon.
By InstantPWA engineering·Reviewed July 25, 2026
Minimum required
192x192 for the app-drawer icon and 512x512 for the splash screen and higher-density displays; both should be PNG.
Maskable icons
Android applies adaptive-icon masking (circle, squircle, etc.) — a maskable icon with safe-zone padding prevents your logo edges from being clipped.
iOS icon
Add <link rel="apple-touch-icon" href="/icon-180.png"> separately; iOS ignores the manifest’s icons array for the home-screen icon.
Sources
Related
What is a Web App Manifest?
A Web App Manifest is a JSON file — usually manifest.webmanifest — that declares your app’s name, icons, start URL, theme colour and display mode. Browsers read it to decide whether to offer the install prompt and what icon and name to show on the home screen.
How does a PWA splash screen work?
On Android, Chromium automatically generates a splash screen for an installed PWA using the manifest’s name, background_color, theme_color and the largest available icon — you do not draw it manually. It appears briefly while the app’s first paint loads after the user taps the icon. iOS Safari does not generate one automatically and requires custom <link rel="apple-touch-startup-image"> tags per device size.
Does a PWA need HTTPS?
Yes, a PWA needs HTTPS. Browsers refuse to register a service worker on a plain HTTP origin because it can intercept and modify every network request, which would be a serious security risk over an unencrypted connection. The only exception is localhost and 127.0.0.1, which browsers treat as a secure context for local development.
What is the service worker lifecycle?
A service worker moves through four stages: install (fired once when the browser first downloads a new or changed worker), waiting (if an old version still controls open tabs), activate (once it takes control, typically after all old tabs close or skipWaiting() is called) and idle, where the browser terminates it between events to save memory.
How do you update a PWA’s service worker?
Browsers automatically check your service-worker script for byte-level changes on every navigation (and roughly every 24 hours in the background). If it differs, the new version installs and waits until old tabs close before activating. Calling self.skipWaiting() in install and clients.claim() in activate makes the new version take over immediately instead of waiting.