Manifest member in Manifest
name and short_name manifest members
Published
name is the full, human-readable label of a web app and short_name the label for places
where the full one does not fit: the home-screen grid, the launcher, the taskbar, the app
switcher. The specification makes both optional; Chromium’s installability check does not, it
requires at least one of them before it offers to install.
Chrome 39, Edge 79, Samsung Internet 4.0, Firefox 79 on Android, Safari 11.3 on iOS, and
Safari 17 on macOS read both members (BCD html.manifest.name, html.manifest.short_name).
Firefox 157 on desktop installs no web apps from the manifest, so it reads neither. Per-language
variants travel in name_localized and short_name_localized, which Chrome and Edge 148 apply.
Member
Section titled “Member”- Type: string for each. Plain text; HTML, emoji, and control characters are rendered literally or dropped by the OS, not interpreted.
- Default: no default for
name. Whenshort_nameis absent the browser usesnamewherever it would have usedshort_name, truncating as the surface requires. - Example value:
"name": "Acme Invoice Tracker","short_name": "Invoices".
Where each label appears in Chromium: name in the install dialog, the splash screen, Windows
Start and the macOS Applications folder, and in the window title; short_name under the icon on
the Android home screen and the ChromeOS shelf, and in the Windows taskbar when pinned. Lighthouse’s
manifest-short-name-length audit fails a short_name longer than 12 characters because the
Android launcher truncates it, which is the practical length limit.
Chromium also uses the label as a security measure: for an app in standalone or fullscreen
mode it prepends short_name (or name when short_name is absent) to the document’s
<title> in window-switching surfaces, so a page cannot disguise itself as the OS or another
app (web.dev). On iOS, the <meta name="apple-mobile-web-app-title"> tag, when present, wins
over short_name for the Home Screen label.
A non-string value is dropped with property 'name' ignored, type string expected. (same for
short_name), which can silently remove the one field installability depends on.
Examples
Section titled “Examples”The three examples cover the minimal pair, a label chosen for the 12-character launcher budget, and the one runtime check a page can make.
A full name and a short label that fits the launcher
Section titled “A full name and a short label that fits the launcher”The brand name goes in name; short_name is the word a user will recognize under a 48 px
icon. Avoid “App” or “PWA” in either, the OS already knows it is an app.
{ "name": "Acme Invoice Tracker", "short_name": "Invoices", "start_url": "/", "display": "standalone", "icons": [{ "src": "/icon-512.png", "sizes": "512x512", "type": "image/png" }]}Invoices is eight characters, inside the Android launcher budget; Acme Invoice Tracker is
what the install dialog, the Windows Start menu, and the window title show.
Keeping the window title readable in standalone mode
Section titled “Keeping the window title readable in standalone mode”Because Chromium prefixes short_name to the window title in standalone mode, a page title
that repeats the app name reads as Invoices - Invoices - March. Set the document title to the
content only and let the browser add the app label.
function setWindowTitle(section) { const standalone = matchMedia('(display-mode: standalone)').matches; // Chromium adds the manifest short_name itself in a standalone window. document.title = standalone ? section : `${section} · Acme Invoice Tracker`;}
setWindowTitle('March');In a browser tab the branch adds the brand back, so bookmarks and tab strips still identify the site.
Checking the shipped labels in a deployment test
Section titled “Checking the shipped labels in a deployment test”Nothing at runtime reports the label the OS drew, but a test can assert that the deployed
manifest carries a name, that short_name fits the launcher budget, and that neither contains
markup. The fallback branch returns the problem rather than throwing, so the test output names
the field.
export async function checkLabels(manifestUrl = '/manifest.webmanifest') { const m = await fetch(manifestUrl).then((r) => r.json()); const problems = []; if (typeof m.name !== 'string' || !m.name.trim()) problems.push('name missing'); if (typeof m.short_name === 'string' && m.short_name.length > 12) problems.push('short_name over 12 chars'); for (const key of ['name', 'short_name']) { if (typeof m[key] === 'string' && /<[a-z]/i.test(m[key])) problems.push(`${key} contains markup`); } return problems;}Run it against the production origin after each deploy, alongside the icon and start URL checks the installability criteria entry describes.
See also
Section titled “See also”- lang, dir, and *_localized manifest members
- icons manifest member
- Installability criteria: what makes a PWA installable
- iOS Add to Home Screen: PWA installation on iOS
- Web Application Manifest: name member (w3.org)
- Add a web app manifest (web.dev)
Specifications
| Specification | Status |
|---|---|
| Web App Manifest: name / short_name | W3C |
| Web Application Manifest: short_name member | W3C |
- Legend
- Yes
- Partial
- Flag
- No
- Unknown
| Browser / Platform | Support | Versions | Confidence | Source | Notes |
|---|---|---|---|---|---|
| Chrome (Desktop) | Yes | 39 | high | source | 1 |
| Chrome (Android) | Yes | 39 | high | source | 23 |
| Edge (Desktop) | Yes | 79 | high | source | 45 |
| Firefox (Desktop) | No | — | high | source | 6 |
| Firefox (Android) | Yes | 79 | high | source | — |
| Safari (macOS) | Yes | 17 | high | source | — |
| Safari (iOS) | Yes | 11.3 | high | source | — |
| Samsung Internet | Yes | 4.0 | high | source | 78 |
| WebView (Android) | Yes | 39 | high | source | 910 |
- `name` or `short_name` is required for a web app to be installable.
- `name` or `short_name` is required for a web app to be installable.
- Derived by browser-compat-data mirroring from Chrome.
- `name` or `short_name` is required for a web app to be installable.
- Derived by browser-compat-data mirroring from Chrome.
- No Firefox support is recorded in browser-compat-data.
- `name` or `short_name` is required for a web app to be installable.
- Derived by browser-compat-data mirroring from Chrome Android.
- `name` or `short_name` is required for a web app to be installable.
- Derived by browser-compat-data mirroring from Chrome Android.