Skip to content
Utiloom

PWA Manifest Validator

Process bounded web app manifest JSON against static W3C URL, identity, scope, icon, and shortcut evidence without claiming installability.

LocalNo manifest retention

Reviewed July 13, 2026

Guide, examples, and validation Show

About this tool

Review strict manifest structure and processed static evidence while keeping HTTPS, service worker, icon availability, and browser installability outside the pass claim.

PWA Manifest Validator checks a web app manifest the way a browser's manifest processor would read it, minus the network. You give it the JSON and the URL where the manifest will live, and a worker parses the document strictly, rejecting duplicate keys, unsafe integers, and anything over 1,000,000 characters or 100,000 nodes. It then resolves start_url, scope, id, icon sources, and shortcut URLs against the manifest URL and reports whether each lands on the same origin and inside the navigation scope. Findings are graded error, warning, or info, covering invalid members, missing 192 and 512 pixel icons, absent maskable purpose, missing names, and implicit id or scope. The result is a findings list, a resolved URL table, an icon inventory, and a JSON report.

  • Rejects non-strict JSON, duplicate keys, unsafe integers, oversized or deeply nested data before static manifest processing.
  • Resolves start_url, scope, id, icon, and shortcut URLs, then reports same-origin and navigation-scope relationships where the supplied manifest URL provides enough context.
  • Separates invalid member errors from install-surface recommendations for app names, explicit identity and scope, 192/512 icon coverage, and maskable purpose.

How to use Manifest Validator

Enter the absolute address in Manifest URL first, for example https://example.com/app/manifest.webmanifest, because every relative path resolves against it. Paste the JSON into the Manifest JSON editor, or click Open manifest to load a .webmanifest or .json file. Restore sample loads a small standalone app manifest with two icons if you want to see a passing result. Press Validate manifest; processing has a five-second budget and a Stop button. Read the badges for pass or fail plus warning, icon, and shortcut counts, then use the All, Error, Warning, and Info control to narrow the findings. Scroll to the resolved URL table and Icon declarations to check what each member became. Download JSON report saves everything once the result is current.

When this tool is useful

  • A front-end developer adds a manifest for the first time and wants to know why the install prompt never appears.
  • A DevOps engineer moves an app from the site root to /app/ and needs to confirm scope and start_url still line up.
  • A designer exporting a new icon set checks that 192x192, 512x512, and a maskable variant are all declared.
  • A QA tester reviews a manifest edited by hand after a merge conflict introduced a duplicated key.
  • A product team adds app shortcuts and wants each shortcut URL confirmed as inside the app scope before release.

Practical tips

  • A missing start_url is approximated with the manifest URL because no installing page URL exists here; browsers use the document URL instead, so set it yourself.
  • Setting id to a stable path such as /app/ prevents the implicit-id warning and keeps the installed app identity fixed even if start_url later changes.
  • Passing static checks does not mean installable. HTTPS, a controlling service worker, icon files that actually load, and browser policy are all outside this test.
  • Icons are never downloaded, so a typo in a sizes string is caught but a 404 or a 300x300 image labelled 512x512 is not.
  • If the worker times out on a huge generated manifest, trim the icons array; 500 icons and 100 shortcuts are the hard ceilings anyway.

Examples you can test

Load an example, compare the result with the expected output, then replace it with your own input.

Relative paths under a subdirectory

Example input

Manifest URL https://example.com/app/manifest.webmanifest with "start_url": "./home" and "scope": "./"

Expected output

Start URL https://example.com/app/home, scope https://example.com/app/, both marked same-origin and in scope

Change the Manifest URL to the site root and the same JSON resolves to https://example.com/home, which is why the URL field matters.

Icon set missing a maskable entry

Example input

Manifest with icons of 192x192 and 512x512, both purpose "any"

Expected output

Static checks passed with a missing-maskable-icon warning and the two icons listed in the inventory

Android adaptive icons crop to a safe zone, so add a maskable icon with padding rather than reusing the any icon.

Validation checklist

  • Confirm the Manifest URL matches where the file is actually served.
  • Resolve every error-severity finding; warnings are judgement calls.
  • Check the resolved start URL opens the intended page in a browser.
  • Fetch each icon URL manually and confirm its real pixel size.
  • Test the install flow in Chrome and Safari after the manifest deploys.

Frequently asked questions

Does passing guarantee installability?

No. This tool does not verify HTTPS, a controlling service worker, browser policy, install prompts, icon responses, or image dimensions.

Are icons downloaded?

No. It validates declaration syntax and resolved URLs only, so declared MIME types, files, and pixel dimensions remain unverified.

Are relative URLs supported?

Yes. They resolve against the supplied manifest URL. Because no installing document URL is supplied, a missing start_url uses the manifest URL as a visible static approximation.

Related tools

Keep the workflow moving

Continue with tools that handle a related input, output, or validation step.

Developer

CSV Viewer & Cleaner

Profile, clean, and convert CSV data locally.

Local
Developer

JSON Patch Builder & Applier

Build and atomically apply verified RFC 6902 JSON patches.

Local
Developer

JSON Schema Validator

Validate bounded JSON Schema and instance data locally.

Local
Developer

Unicode Inspector & Normalizer

Inspect and normalize Unicode text with encoding evidence.

Local