Iconello
Reference2026-03-19· 7 min read

PWA Icon Requirements: Every Size You Need in 2026

A requirements checklist for PWA icons covering every size, the maskable safe zone rule, manifest.json configuration, and which sizes each browser actually uses.

PWA icons are not favicons with extra steps. They serve a fundamentally different purpose: representing your app as a first-class citizen on the user's device. The requirements are stricter, the failure modes are uglier, and the spec has nuances that catch experienced developers off guard.

This post is a requirements reference. Not theory, not a gentle introduction. If you want the conceptual overview, read our PWA Icons Guide. This is the checklist you open when you're actually building the manifest and exporting the assets.

Why PWA Icons Are Not Favicons

A favicon lives inside the browser. The browser controls the rendering context: tab bar, bookmark list, address bar. You know the size, you know the background, you know the shape. A PWA icon lives outside the browser. The operating system controls everything. Android might render your icon in a circle, a squircle, a rounded square, or a teardrop, depending on the device manufacturer and the user's launcher settings.

This means your PWA icon must survive arbitrary cropping. It must look good at 48 pixels on a notification badge and at 512 pixels on a splash screen. It needs to handle both maskable and non-maskable rendering contexts. Favicons do not deal with any of this.

Every Size You Actually Need

The Web App Manifest spec does not mandate specific sizes. Browsers are supposed to pick the closest available size and scale it. In practice, certain sizes are expected, and missing them means the browser is doing extra work to downscale your icon, which produces blurry results at small sizes.

48x48

Notification badge

Android status bar, small notification icon

72x72

Low-density launcher

Older Android devices, ldpi/mdpi screens

96x96

Medium launcher

Settings lists, medium density device launchers

128x128

Chrome Web Store

Required for Chrome Web Store listings

144x144

Windows tile

Windows pinned site tile, hdpi launchers

152x152

iPad (legacy)

Older iPad home screen, not used by modern iOS

192x192

Android primary

Main home screen icon, Chrome install prompt

384x384

High-res launcher

xxhdpi Android screens, 2x of 192

512x512

Splash screen

PWA splash screen on Android, largest required

The non-negotiable two are 192x192 and 512x512. Chrome will reject your manifest install prompt if the 192 is missing. The splash screen will show a blank space without the 512. Everything else is optimization. But if you care about crisp rendering on notification badges and settings screens, provide the full set.

Which Sizes Each Browser Actually Uses

Not every browser fetches every size. Here is what each major browser actually requests from your manifest, based on testing across Chrome, Firefox, Samsung Internet, and Edge in early 2026:

The 192x192 icon is the workhorse. Chrome uses it for the home screen, app drawer, and task switcher. The 512x512 exists almost exclusively for the splash screen. The 48x48 gets pulled for notification badges, and 96x96 shows up in settings lists and permission dialogs.

The Maskable Safe Zone: Inner 80%

When you declare an icon with purpose: "maskable", you are telling the OS it can apply any mask shape to your icon. The spec defines a safe zone: the inner 80% of the image. That means 10% padding on every side.

For a 512x512 icon, the safe zone is 409.6 pixels centered (round to 410). For a 192x192, it is about 154 pixels. Anything outside the safe zone may be clipped. The most aggressive clip is a circle, which cuts roughly 10% from each edge.

The number one maskable mistake

Developers take their regular icon, add purpose: "maskable" to the manifest entry, and call it done. The result: the logo gets clipped on circular launchers. Maskable icons need explicit 10% padding on all sides with a solid background color filling the outer area. They are a separate asset, not a flag on your existing icon.

The outer 20% must be filled with a solid background color, not transparency. If you leave it transparent, the OS fills it with white or black. On some launchers that produces a visible ring around your icon that looks unfinished.

Purpose Values: any vs maskable vs monochrome

Each icon entry in the manifest has a purpose field. The three allowed values control how the browser and OS render your icon. Getting this wrong is the most common source of PWA icon bugs.

PurposeRenderingSafe zone needed?Background
anyRendered as-is, no mask appliedNoCan be transparent or solid
maskableOS applies platform mask (circle, squircle)Yes, inner 80%Must be solid color
monochromeAlpha channel extracted, recolored by OSNoMust be transparent
any maskableUsed for both contexts (not recommended)YesMust be solid color

The "any maskable" combined value is technically valid but almost always a bad idea. An icon designed for maskable rendering has too much padding when displayed without a mask. An icon designed for any rendering gets clipped when masked. Use separate files.

Manifest.json: The Complete Setup

Here is a production-ready manifest with the minimum recommended icon set. This covers both rendering contexts at both critical sizes:

manifest.json
{
  "name": "Your App Name",
  "short_name": "App",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#2563eb",
  "icons": [
    {
      "src": "/icons/icon-48.png",
      "sizes": "48x48",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icons/icon-96.png",
      "sizes": "96x96",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icons/icon-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icons/icon-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icons/icon-maskable-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "maskable"
    },
    {
      "src": "/icons/icon-maskable-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "maskable"
    }
  ]
}

If you also want monochrome support for Android 13+ themed icons, add a seventh entry:

manifest.json (monochrome addition)
{
  "src": "/icons/icon-monochrome-192.png",
  "sizes": "192x192",
  "type": "image/png",
  "purpose": "monochrome"
}

The monochrome icon should be a white silhouette of your logo on a transparent background. The OS discards the color information and uses only the alpha channel, then applies the user's theme color.

The Full Size Requirement by Browser

Different browsers pull different sizes from your manifest. Here is which sizes each browser actually requests during install and rendering:

SizeChrome AndroidFirefox AndroidSamsung InternetEdge
48x48NotificationsRarely usedNotificationsTaskbar
72x72Fallback onlyLegacy supportNot usedNot used
96x96Settings, shortcutsShortcutsSettings listJump list
128x128Web Store onlyNot usedNot usedNot used
144x144Not usedNot usedNot usedWindows tile
192x192Home screen, installHome screen, installHome screenHome screen
384x3842x home screenNot used2x home screenNot used
512x512Splash screenSplash screenSplash screenSplash screen

Common Mistakes and How to Avoid Them

After reviewing hundreds of PWA manifests, the same mistakes come up repeatedly. Here are the ones that cause the most visible problems:

Using transparent backgrounds on maskable icons. The OS fills transparency with a default color (usually white or black). Your icon ends up floating in a jarring background that does not match your brand. Always use a solid background color for maskable icons.

Providing only one icon for both any and maskable. The padding that makes a maskable icon safe makes an "any" icon look tiny and awkward. These are separate assets with different design constraints.

Forgetting the 512x512 entirely. Without it, the PWA splash screen on Android shows your app name with a blank area where the icon should be. It looks like a broken install.

Using JPEG instead of PNG. JPEG compression artifacts are visible at small sizes, and JPEG does not support transparency. Always use PNG for manifest icons.

Not testing on a real device. Chrome DevTools shows you the manifest is valid, but it does not show you how your maskable icon looks under a circular mask on a Samsung phone. The only way to catch rendering issues is installing the PWA on actual hardware.

Minimum viable icon set

If you are shipping fast and want to add polish later, provide four files: icon-192.png, icon-512.png, icon-maskable-192.png, and icon-maskable-512.png. This covers every critical surface. Chrome downscales the 192 for smaller contexts, and the 512 handles the splash screen. You can add the other sizes when you have time to hand-tune them.

Testing Your Icons

Use maskable.app to preview your maskable icons under every mask shape. Load your 512x512 maskable PNG and toggle between circle, squircle, and rounded rectangle previews. If your logo gets clipped under any shape, increase the padding.

In Chrome DevTools, open Application > Manifest. It lists every icon Chrome found and flags issues: missing sizes, invalid types, inaccessible URLs. Run a Lighthouse audit and check the PWA section for icon-related warnings.

For the real test, deploy to a staging URL with HTTPS, open it on an Android device, and tap "Add to Home Screen" from Chrome's menu. Check the home screen icon, open the app to see the splash screen, and look at it in the app drawer and recent apps list. That is four surfaces from one install, and they all use different icon sizes.