Build my web app

Free browser tool · no signup · nothing uploaded

Web app icon resizer

Drop your artwork (512×512 or larger). A non-square image is cropped or padded with your background colour, never stretched. Download the 512×512 Play icon, or one ZIP with the web app icons, the Apple touch icon, favicons, and the Android launcher and adaptive-icon set.

No image yet.

Google Play icon (512 × 512)

Upload artwork to see the 512 × 512 PNG.

Adaptive icon (Android 8+) through launcher masks

Circle
Squircle
Rounded square
Teardrop
108 dp layers + 66 dp safe zone
Make it square

Artwork is never stretched. Crop keeps the centre square; pad keeps the whole image and fills the sides with the background colour.

Adaptive icon foreground

66 dp keeps the whole artwork inside the safe zone every launcher shows. Go larger only if the edges of your artwork can be cut.

Download

Contains res/mipmap-mdpi … mipmap-xxxhdpi (ic_launcher, ic_launcher_round, ic_launcher_foreground), mipmap-anydpi-v26 adaptive XML, values/ic_launcher_background.xml, the 512 × 512 Play icon, plus iOS and web sizes.

Every size in the ZIP

Which icons a web app actually needs

Browsers are specific about this, and getting it wrong is the most common reason an install prompt never appears. The manifest must reference at least a 192×192 and a 512×512 PNG; Chrome uses the first for the home-screen icon and the second for the splash screen it generates while your start page loads. Everything else is optional polish.

IconSizeWhere it is usedRequired?
Manifest icon192×192Android home screen, app switcher, install bannerYes
Manifest icon512×512Generated splash screen; Play listing when wrapped as a TWAYes
Maskable variants192 and 512, purpose: "maskable"Lets Android crop to circle, squircle or rounded square without clippingStrongly recommended
apple-touch-icon180×180iPhone and iPad home screen (Safari ignores the manifest icons)Yes, for iOS
Favicon32×32, 16×16 (or one SVG)Browser tab, bookmarksRecommended
Extra manifest sizes72, 96, 128, 144, 152, 384Older Android launchers and some desktop installs pick the closest matchOptional

The maskable safe zone, explained once

Android launchers apply a mask to app icons - Pixel phones use a circle, Samsung uses a squircle, others a rounded square. A "maskable" icon is one designed to be cropped: the important content sits inside a circle whose diameter is 80% of the image width, and the remaining 10% on each side is background colour that can be safely cut away. If you hand Android a logo that fills the whole square, the corners and often the edges of letters are lost.

The resizer's maskable preview shows your image inside the circle mask so you can see what survives. If the logo touches the edge, add padding before uploading - or upload a version with a solid background and the logo at about 60-70% of the width. Do not mark a non-padded icon as maskable in the manifest; Chrome will trust the flag and crop it.

Why iOS needs its own icon

Safari does not read manifest icons for the home screen. It looks for a <link rel="apple-touch-icon"> tag in the page head, and if none exists it uses a screenshot of the page - which is the blurry square you have seen on badly configured sites. Export the 180×180 version here and add:

<link rel="apple-touch-icon" href="/icons/apple-touch-icon-180x180.png">

iOS applies its own rounded-corner mask and does not support transparency on touch icons - transparent areas turn black. Use a solid background.

Android launcher densities, if you also ship an APK

A native Android package carries launcher icons per screen density: mdpi 48, hdpi 72, xhdpi 96, xxhdpi 144, xxxhdpi 192, plus the 512×512 hi-res icon for the Play listing. The ZIP includes exactly that set, plus the adaptive-icon layers and XML. If you build the Android package with our app builder this is handled for you; the set is here for people using Android Studio or other tooling.

Preparing the source image

Once the icons are exported, the PWA Builder writes the manifest entries for you, or copy this block and adjust paths:

"icons": [
  { "src": "/icons/icon-192x192.png", "sizes": "192x192", "type": "image/png" },
  { "src": "/icons/icon-512x512.png", "sizes": "512x512", "type": "image/png" },
  { "src": "/icons/maskable-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" },
  { "src": "/icons/maskable-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
]

Frequently asked questions

Can I upload an SVG?

Yes - the browser rasterises it at each target size, which gives the sharpest results. The exports are PNG because that is what manifests and iOS require.

Should every manifest icon be maskable?

No. Provide the plain "any" icons and the padded maskable ones as separate entries. Browsers pick whichever suits the surface; using only maskable icons makes the splash-screen icon look small.

Is my image uploaded anywhere?

No. Resizing happens on a canvas in your browser and the zip is assembled in memory. Nothing leaves your device.

Why does my icon look blurry on a Pixel?

Usually the 192 px icon was upscaled from something smaller, or the manifest lists only 512 and Chrome downscaled it with the wrong filter. Export from a large source and include both sizes.