Web App Manifest Validator
Validate a PWA manifest.json against the Web App Manifest spec and preview maskable icons against Android's adaptive-icon safe zone.
Result
A Progressive Web App only installs cleanly when its manifest.json satisfies the fields browsers and app stores actually check for. This validator parses your uploaded manifest and walks through the W3C Web App Manifest spec field by field: it flags a missing name and short_name, an empty or malformed icons array, icons missing a src, sizes, or type, an unparsable start_url, an unrecognized display value, and theme_color or background_color strings that are not valid CSS colors. Every finding is shown as a plain-English sentence — not a raw spec citation — so you know exactly what to fix and why it matters for installability.
The killer feature is the maskable-icon safe-zone preview. Android's adaptive icons apply an OS-chosen mask shape — circle, squircle, teardrop, and more — to any icon marked "purpose": "maskable". Anything outside a centered circle covering 40% of the icon's viewport can be clipped away depending on the mask the device applies. Upload the icon image files referenced by your manifest alongside manifest.json, and this tool matches them by filename, draws each maskable icon on a canvas at its declared size, and overlays that exact safe-zone circle so you can see with your own eyes whether your artwork survives the crop.
The pass/fail badge under each preview is not a cosmetic checklist item — it comes from real per-pixel analysis of the decoded image data. The tool measures how much non-background content sits outside the safe-zone circle (content that a mask would clip) and how much of the icon is transparent (maskable icons should have a full-bleed opaque background, since transparency lets the underlying mask color show through). Both checks run against the actual bitmap you uploaded, so the result reflects your real icon file, not a guess.
Everything happens locally in your browser: manifest.json is read with the File API, icons are decoded with createImageBitmap or a FileReader/Image fallback, and pixels are analyzed on an in-memory canvas. Nothing is uploaded to a server, which matters if your manifest references a not-yet-public app name, internal start_url paths, or icons under development.