PWA manifest.json Builder

Generate a complete Web App Manifest for progressive web apps

Build a valid manifest.json for your progressive web app with name, short_name, icons, theme_color, background_color, display mode, orientation, start_url, scope, and categories — plus the exact HTML link tag and recommended icon sizes for installability. It runs free in your browser on Gera Tools, with nothing uploaded.

Last updated Source: Gera Tools

What makes a PWA installable?

A browser shows an install prompt when the page is served over HTTPS, has a registered service worker, and links a manifest with at least name or short_name, a start_url, a display mode of standalone or fullscreen, and a 192px and a 512px icon.

A Web App Manifest is the JSON file that turns a website into an installable progressive web app, defining its name, icons, colours, and how it launches. This builder produces a valid manifest.json plus the exact HTML <link> tag and the icon sizes browsers require for installability.

How it works

The manifest is a flat JSON object the browser reads when you link it from your page’s <head>:

  1. Identity fields — name, short_name, description — appear in the install dialog and on the splash screen.
  2. Appearance fields — theme_color, background_color, display, orientation — control the launched window and splash.
  3. Launch fields — start_url, scope — define where the app opens and which URLs it controls.
  4. The icons array lists images with src, sizes, type, and optional purpose: "maskable"; a 192px and a 512px icon are the minimum for an install prompt.

A minimal installable manifest

After filling the builder, the generated output looks like this:

{
  "name": "My Application",
  "short_name": "MyApp",
  "description": "A short description of what this app does.",
  "start_url": "/?source=pwa",
  "scope": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#1a73e8",
  "icons": [
    { "src": "/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "/icons/icon-512.png", "sizes": "512x512", "type": "image/png",
      "purpose": "maskable" }
  ]
}

Link it from your HTML <head>:

<link rel="manifest" href="/manifest.json">

The three installability requirements

A browser shows an install prompt only when all three conditions are true:

  1. HTTPS — the page must be served over a secure origin (or localhost for development).
  2. Service worker registered — at least a minimal fetch handler must be active.
  3. Valid manifest — must have name or short_name, a start_url, a display of standalone or fullscreen, and icons at 192px and 512px.

This builder satisfies requirement 3; you still need to register a service worker separately.

Display modes explained

ModeWhat the user sees
standaloneLaunched in its own window, browser chrome hidden — feels like a native app
fullscreenFull screen with status bar hidden — common for games
minimal-uiBrowser chrome reduced to minimal back/reload buttons
browserOpens in a normal browser tab — effectively no PWA window

Most productivity and utility apps use standalone. Games often use fullscreen.

Maskable icons

A maskable icon stores its logo centred in a safe zone (the inner 80% of the image), with coloured padding around it. Android adaptive launchers crop icons into circles, squircles, or other shapes depending on the device. If you only provide a standard icon, the launcher crops a rectangle out of it, often clipping corners. A maskable icon fills the safe zone so the shape crop always looks intentional.

Tips and common mistakes

  • Set start_url to /?source=pwa or a similar attributed URL so you can see PWA launches separately in your analytics.
  • Keep short_name to 12 characters or fewer — longer names are truncated under the home-screen icon on small screens.
  • Provide both a standard and a maskable version of the 512px icon so you cover all Android launcher shapes without relying on a single image for both purposes.
  • Test the manifest in Chrome DevTools → Application → Manifest to see exactly what the browser parsed.