Skip to content

PWA manifest generator and validator

Fill in the form to get a manifest.webmanifest and the head tags that link it, or paste the manifest your site already serves. Both go through the same checklist: Chrome's install criteria, the rules that pick its install dialog, and the fields worth fixing.

Runs in your browser. Nothing you type or paste leaves this page.

Generate a manifest

Name and description
name Shown in the install dialog and on the splash screen.
short_name Label under the home-screen icon. Aim for about 12 characters.
lang Language of name and description, e.g. en.
description The text line in Chrome's tall install sheet.
Identity and URLs
id The app's permanent identity. / works for one app per domain.
start_url The page that opens at launch.
scope URLs that stay in the app window. start_url must be inside.
Window and colors
display browser doesn't qualify for install.
orientation Leave unset unless the app only works one way.
theme_color Toolbar and task-switcher color.
background_color Splash screen background on mobile.
Icons
Where the icon files live, e.g. /icons/.
Icons to include

Chrome's install criteria need the 192 and 512 icons. The maskable one fills Android's adaptive shapes; keep the logo inside the central 80%.

Screenshots (optional)

A narrow screenshot switches Chrome on Android to the tall install sheet; a wide one does the same on desktop. Leave both off to keep the compact dialog.

Chrome on Android shows it.
Width x height in pixels, e.g. 1080x1920.
Desktop Chrome shows it.
Width x height in pixels, e.g. 1920x1080.

Your manifest

Serve it from the site root as manifest.webmanifest; the head tags below point there.

{
  "name": "Aurora Play",
  "short_name": "Aurora",
  "description": "Daily tournaments, rewards and your account, one tap from the home screen.",
  "lang": "en",
  "id": "/",
  "start_url": "/",
  "scope": "/",
  "display": "standalone",
  "theme_color": "#0b0d14",
  "background_color": "#0b0d14",
  "icons": [
    {
      "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-512-maskable.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "maskable"
    }
  ]
}

HTML head tags

Add them to every page of the app. apple-touch-icon is for Safari on iOS; 180×180 is the usual size.

<link rel="manifest" href="/manifest.webmanifest">
<meta name="theme-color" content="#0b0d14">
<link rel="apple-touch-icon" href="/icons/apple-touch-icon.png">

Checklist

Meets all 5 of Chrome's install criteria that live in the manifest. The live site still has to pass what this page can't check.

Failed: 0 · Warnings: 0 · Passed: 12 · Notes: 2

Chrome install criteria

The part of Chrome's list that lives in the manifest.

  • Pass name or short_name Set: name, short_name.
  • Pass icons: 192px and 512px A 192×192 and a 512×512 icon are declared.
  • Pass start_url Set to /.
  • Pass display standalone qualifies for install.
  • Pass prefer_related_applications Not set to true.

Install dialog

Which of Chrome's two install dialogs this manifest gets.

  • Note Dialog on Android No screenshots, so Android shows the compact dialog.
  • Note Dialog on desktop No wide screenshots, so desktop Chrome shows the default dialog.
  • Pass description 74 characters. Fills the text line in the tall sheet.

Worth fixing

Not needed for install, but people see the result.

  • Pass short_name length 6 characters, fits most home screens.
  • Pass scope start_url / is inside scope /.
  • Pass id Set to /. The app keeps its identity if start_url changes.
  • Pass Maskable icon Declared. Android can fill its adaptive icon shapes.
  • Pass theme_color #0b0d14 is a valid color.
  • Pass background_color #0b0d14 is a valid color.

Check an existing manifest

Open your manifest's URL in a browser, copy the whole file and paste it here. The check runs on this page; nothing is uploaded.

The full file, from the opening { to the closing }.

Checklist

Results appear here after you check a manifest.

What a manifest check can't prove

A clean checklist means the file meets Chrome's rules. This page doesn't prove the app is installable: that also depends on the live site.

HTTPS
Chrome only offers install on pages served over HTTPS.
Icon files
This page reads the sizes you declare. It can't confirm the files exist or really are 192 and 512 pixels; DevTools → Application → Manifest shows what Chrome actually loaded.
The link and the response
Every page needs the <link rel="manifest"> tag, and the file must load and parse. Chrome requests it without credentials unless the tag sets crossorigin="use-credentials".
Service worker
Chrome's current install criteria no longer list one, but offline pages, caching and push still need it, and this page can't see yours.
The visit itself
Chrome also waits for a click or tap and 30 seconds on the page, and doesn't offer to install an app that's already installed.

Manifest fields and what Chrome does with them

Member names and values follow MDN's Web App Manifest reference; Chrome's behavior follows Chrome's own documentation.

MemberWhat it doesWhat Chrome does with it
name / short_nameThe app's name; short_name is used where space is tight, like under the home-screen icon.One of the two is required for install. The splash screen shows name.
iconsImages for the home screen, launcher, task switcher and splash screen.Needs a 192px and a 512px icon to offer install. Without a maskable one, Android puts the icon on a white background.
start_urlThe page that opens when the app launches.Required for install. A start_url on another origin is ignored in favor of the page the install started from.
scopeThe URLs that belong to the app.Pages outside it show browser UI in the app window. If start_url isn't inside scope, scope is ignored.
idThe app's permanent identity.Without it, identity comes from start_url, so a later start_url change can register a second app.
displayHow much browser UI the app window keeps.fullscreen, standalone, minimal-ui or window-controls-overlay qualify for install; browser doesn't.
orientationThe default orientation.Applied when the app opens; without it the app follows the device and user settings.
theme_colorToolbar and task-switcher color.Colors the app's toolbar. Keep it equal to the theme-color meta tag.
background_colorSplash screen background.Used on the splash screen on mobile. Match the page background for a smooth start.
descriptionA short summary of the app.Fills the text line in the tall install sheet; cut off after 300 characters.
screenshotsImages of the app in use.Usable entries switch to the tall install sheet: wide ones on desktop, narrow or unlabeled ones on Android.
prefer_related_applicationsPoints users to a native app instead.true on Android sends users to the Play Store app from related_applications instead of installing the PWA.
langLanguage of name and description.MDN lists lang as not implemented in browsers yet; harmless to include.

Rich or compact install dialog

Chrome shows one of two install dialogs, and the manifest picks it. With at least one screenshot Chrome can use, it opens a tall sheet with a gallery. Without one, it shows a small card with the icon, name, domain and Install.

description doesn't choose the format. It only fills the text line inside the tall sheet, so deleting it doesn't bring the compact card back. On desktop only wide screenshots count; Android ignores wide ones and shows narrow entries or entries without form_factor.

Which dialog installs better hasn't been measured in public. Pick one on purpose and test it on your own traffic.

Read: Chrome's two install dialogs, side by side

Where manifests usually go wrong

  1. 1

    Declared sizes that aren't real

    sizes is a promise, not a measurement. A 512x512 entry pointing at a 256px file passes any manifest check. Export each file at the size you declare.

  2. 2

    Changing start_url without an id

    With no id, the app's identity is its start_url. Move it, and browsers treat the new manifest as a different app, so people can end up with two icons.

  3. 3

    Click IDs in start_url

    MDN warns that a per-user start_url, like ?user=123, becomes a persistent fingerprint. Keep click IDs in your tracker, not in the launch URL.

  4. 4

    Deleting icons to get the compact dialog

    Icons decide whether install is offered at all. For the compact dialog, remove the screenshots; remove the icons and no dialog appears.

Stop hand-editing a manifest for every PWA.

DarkCore builds the manifest for each PWA. The rich or compact install dialog is a setting you switch and measure, with install, open and offer arrival tracked as separate events.

See the install flow