📱 Web App Manifest Generator
Build a manifest.json for your PWA from a form: name, start_url, display, theme_color, an icons table at multiple sizes, shortcuts, share_target, and protocol_handlers. Outputs the HTML link tag too.
🔒 About Privacy
- ・JSON is generated entirely in your browser
- ・App name, URLs and other inputs are never sent to any server
- ・No storage logs, no database
- ・No signup, no login, no payment ever
Basic info
Icons (size and src)
Checked sizes are emitted in the icons array. The type is inferred from the src extension.
App shortcuts (up to 4)
📖 Where people get stuck
Builds the manifest.json a PWA needs, from a form. Alongside name, start_url, display and theme_color, it covers multiple icons sizes, shortcuts, share_target and protocol_handlers, and emits the HTML link tag as well. Everything runs in the browser. A manifest alone, however, does not make an app installable — being judged installable requires HTTPS, a service worker, the required fields, and icons at the prescribed sizes. When the install button does not appear despite a manifest being present, the cause is usually outside the manifest.
| Case | What happens | What to do |
|---|---|---|
| Installability is not satisfied by the manifest alone | For a browser to offer installation, several conditions must all hold: HTTPS (or localhost), a registered service worker with a fetch handler, a name or short_name, a start_url, a display of standalone, fullscreen or minimal-ui, and icons at 192px and 512px. Miss one and there is no error; the button simply never appears — not being told what is missing is the hardest part. On top of that, Safari on iOS ignores much of the manifest — the icon used when adding to the home screen comes from apple-touch-icon, and the display mode is governed by apple-mobile-web-app-capable. |
Do not guess — open Application > Manifest in Chrome DevTools. It lists the unmet conditions in plain sentences — whether you look at that screen changes time-to-resolution by hours. The Lighthouse PWA audit performs the same checks mechanically. A service worker being registered is not enough — a fetch event handler has to actually exist, so an empty sw.js does not satisfy the requirement. If you also target iOS, add apple-touch-icon at 180 by 180 and apple-mobile-web-app-title to your HTML separately from the manifest — polishing only the manifest changes nothing on iOS. |
How start_url and scope resolve |
Both resolve relative to the location of the manifest file, not the site root. With the manifest at /static/manifest.json, writing "start_url": "index.html" makes the launch URL /static/index.html — and if that does not exist, the app installs fine and then opens to a 404. scope reaches further: it defines the range of URLs that stay inside the app window, and following a link outside it kicks you out to the browser. Its default, when omitted, is also the manifest location, so leaving it at /static/ and writing nothing puts your entire site outside the scope. And if start_url falls outside scope, the app is not judged installable at all. |
Write both as absolute paths with a leading slash — "start_url": "/" and "scope": "/". That alone eliminates every relative-resolution problem. If only part of the site is the PWA, state the range explicitly as "scope": "/app/" and confirm that start_url lies inside it. Adding a query to start_url lets your analytics distinguish launches from the installed app — for example "/?source=pwa". The manifest itself can live anywhere, but the href of <link rel="manifest"> must match the real path — if the manifest returns a 404, the browser simply ignores it in silence and shows nothing. |
| The icon gets cropped on Android (maskable) | Android launchers mask icons into a circle or a rounded square. So supplying only "purpose": "any" icons gets the corners cut off — if your logo fills the square frame, the characters at the edges disappear. The declaration that avoids this is "purpose": "maskable", and a maskable icon is designed with roughly the central 40 percent as a safe zone, on the assumption that everything outside it may be clipped. But supplying only a maskable icon is equally wrong — in environments that do not mask, such as a desktop taskbar or a splash screen, it renders as a small logo surrounded by a lot of padding. Either one on its own breaks somewhere: that is the essence of the specification. |
Register both kinds as separate entries. Even at the same 512 by 512, list the edge-to-edge version as "purpose": "any" and a padded version as "purpose": "maskable" — you can also write "any maskable" on a single entry, but then the artwork has to satisfy both requirements at once. Check the result in Chrome DevTools under Application > Manifest — it shows a preview with the mask applied, so you can see the clipping immediately. Provide at least the 192 and 512 sizes, and use PNG rather than SVG — SVG support varies between environments. |
The manifest is cached. Changing it does not immediately reach devices where the app is already installed — that is usually why a replaced icon or name still shows the old one. When it refreshes is up to the browser, so during development, prompt an update from DevTools under Application > Manifest and confirm with an uninstall and reinstall. And serve manifest.json as Content-Type: application/manifest+json — some browsers will not load it if the server returns text/plain. One design note: display: "standalone" removes the browser UI, and with it the back button and the URL bar — without a way back inside your app, users reach a dead end. A link to an external site is outside scope and opens the browser, but there is no guarantee they can get back. Finally, making something a PWA does not make it get installed — what matters is whether you present a path to installation and a benefit that justifies it: offline use, notifications, fast launch.
📖 How to Use
-
1
Fill in basic infoEnter name, short_name, start_url, display, theme_color and so on.
-
2
Configure icons and shortcutsCheck the icon sizes you ship, then set the common prefix and extension. Add up to four app shortcuts if needed.
-
3
Generate and deployClick Generate JSON, save manifest.json, and paste the HTML snippet into your <head> — the browser will pick up the PWA.
❓ Frequently Asked Questions
What are the minimum requirements to be installable?
Do I need a maskable icon?
My manifest changes are not picked up
🔗 Related Tools
🐛 Found a bug or issue with this tool?
Free to use, no signup. Even just the steps to reproduce are helpful. Reports go directly to the operator and help us fix issues.
Thanks for your report!
Your report has been delivered to the operator and will be used to improve the tool.