# name and short_name manifest members

> name is the full label of an installed web app and short_name the label for tight spaces such as a home screen; Chromium requires one of them before it offers installation.

`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

- **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`. When `short_name` is absent the browser uses `name`
  wherever it would have used `short_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.

:::observed
Chrome 155 on macOS 26 (English UI), DevTools > Application > Manifest: with both `name` and
`short_name` removed from the manifest, the **Installability** section reads
`Manifest does not contain a 'name' or 'short_name' field` and the omnibox install icon is
absent. Adding `"short_name": "Invoices"` alone clears the message; the **Identity** section then
shows **Name** empty and **Short name** `Invoices`.
:::

## 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

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.

```json
{
  "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

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.

```js
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

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.

```js
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

- [lang, dir, and *_localized manifest members](/reference/manifest/localization/)
- [icons manifest member](/reference/manifest/icons/)
- [Installability criteria: what makes a PWA installable](/reference/installation/installability-criteria/)
- [iOS Add to Home Screen: PWA installation on iOS](/reference/installation/ios-add-to-home-screen/)
- [Web Application Manifest: name member](https://www.w3.org/TR/appmanifest/#name-member) (w3.org)
- [Add a web app manifest](https://web.dev/articles/add-manifest) (web.dev)