Skip to content
Issue docs

Misconfigured PWA manifest link

Standardlink_rel_manifestIssue 60

What is this issue?

This issue checks whether a <link rel="manifest"> tag that is present on the page is correctly configured — that is, whether it actually points at a Web App Manifest a browser can fetch.

It is reported only when the tag is present and broken:

  • The href attribute is missing entirely
  • The href attribute is empty or contains only whitespace
  • The href value is malformed — a bare fragment (#), a value containing spaces, or a scheme a browser cannot fetch a manifest over (javascript:, mailto:, tel:)

A page with no <link rel="manifest"> at all is not reported. Most sites are deliberately not Progressive Web Apps, and choosing not to ship a manifest is a design decision rather than a defect.

Example: <link rel="manifest" href="/manifest.json"> passes. <link rel="manifest"> and <link rel="manifest" href=""> are reported, because the browser is told a manifest exists and then given nowhere to fetch it from.

Why it matters

A <link rel="manifest"> with a broken href is a promise the page cannot keep: the browser is told a Web App Manifest exists, follows the link, and gets nothing back.

Impacts on user experience and engagement:

  • PWA installability silently fails: Browsers use the manifest to decide whether a site can be installed. With an unfetchable manifest link, the "Add to Home Screen" prompt never appears — and because the tag is present, the cause is easy to miss.

  • App metadata is lost: Name, icons, theme colour, and display mode all come from the manifest. Without it, an installed shortcut falls back to the page title and a screenshot-derived icon.

  • The failure is invisible in normal browsing: Nothing on the rendered page changes, so a broken manifest link can survive for months after a template change.

  • Mobile experience: A working manifest lets the app run standalone without browser UI. A broken one leaves users in a plain browser tab.

Because this issue is raised only when the tag is present and misconfigured, every occurrence is an actionable defect — a site that deliberately ships no manifest is never reported.

How to fix it

Give the existing manifest link a real, fetchable href:

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

Step-by-step recommendations:

  1. Find the broken tag: The issue lists the URL of the page carrying it. Look for a <link rel="manifest"> with no href, an empty href, or a placeholder value such as #.

  2. Decide whether the tag belongs there: If the site is not meant to be installable, remove the tag. An empty manifest link is worse than no manifest link — it tells the browser a manifest exists and then fails to deliver one.

  3. Point it at a real file: If the site is a PWA, set the href to the manifest path — a root-relative path (/manifest.json), an absolute https:// URL, or a protocol-relative URL are all accepted. Avoid spaces in the path and non-fetchable schemes such as javascript:.

  4. Fix the template, not the page: A missing href is usually an unfilled template variable, so the same broken tag tends to appear on every page rendered by that layout.

  5. Create the manifest file if it does not exist: A manifest.json needs at minimum name, short_name, start_url, display, and icons.

  6. Verify: Load the page and check the Application panel in browser DevTools — the manifest should be listed and parsed without errors.

Examples

Scenario: A PWA declares its manifest link with a real path.

Passes because:

  • A <link rel="manifest"> tag is present in the head section
  • The href attribute is non-empty and resolvable
<head>
  <title>My PWA App</title>
  <link rel="manifest" href="/manifest.json" />
</head>

Scenario: An ordinary marketing site that is not a PWA.

Passes because:

  • The page declares no <link rel="manifest">, and nothing about the page is misconfigured
  • Not shipping a manifest is a design decision, not a defect
<head>
  <title>My Marketing Site</title>
</head>

Scenario: A template renders the tag but the manifest path variable was never filled in.

Fails because:

  • The href attribute is absent, so the browser has nowhere to fetch the manifest from
  • The site advertises installability it cannot deliver

Message: Manifest link is missing an href.

<head>
  <title>My PWA App</title>
  <link rel="manifest" />
</head>

Corrected version:

<head>
  <title>My PWA App</title>
  <link rel="manifest" href="/manifest.json" />
</head>

Scenario: The template emitted the attribute with an empty value.

Fails because:

  • An empty href resolves back to the current page, which is HTML and not a manifest

Message: Manifest link is missing an href.

<head>
  <link rel="manifest" href="" />
</head>

Scenario: A placeholder or an unfetchable scheme was left in the href.

Fails because:

  • A bare fragment, a value with spaces, or a javascript: URL cannot serve a manifest file

Message: Manifest link has an invalid href.

<head>
  <link rel="manifest" href="#" />
  <link rel="manifest" href="/my manifest.json" />
  <link rel="manifest" href="javascript:void(0)" />
</head>

Corrected version:

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

How PixyScan detects this

PixyScan evaluates the HTML configuration of the manifest link. It does not fetch the manifest file itself.

  1. Fetch the page: PixyScan issues an HTTP GET request to the target URL and reads the raw HTML response without executing JavaScript.

  2. Find every manifest link: The crawler collects all <link> elements whose rel attribute contains the token manifest. rel is a space-separated, ASCII case-insensitive token list, so rel="Manifest" and rel="icon manifest" are matched as well.

  3. Read the href: For each matched element, the raw href attribute value is read and trimmed.

  4. Classify each link:

    • Missing — the href attribute is absent, empty, or whitespace only.
    • Invalid — the href is a bare fragment (#…), contains inner whitespace, uses a scheme other than http/https, or cannot be parsed as a URL.
    • Valid — anything else. The value is resolved against the page URL and stored in manifestUrls.
  5. Report at most one finding per page:

    • If any manifest link has no usable href, the issue is reported with the message "Manifest link is missing an href."
    • Otherwise, if any manifest link has a malformed href, the issue is reported with the message "Manifest link has an invalid href."
    • If every manifest link is valid — or the page declares none at all — nothing is reported.

Unlike the RSS feed check in the same group, this issue is not restricted to the homepage: a broken tag is a fact about the page that carries it, so it is raised against that page's URL.

What we store

Storage Level

Page Level — This issue is evaluated for each individual URL.


Database Table / Prisma Model

PageLinkRelTag


Stored Fields

Field Type Description
manifestUrls Json Resolved URLs of the correctly configured manifest links on a page

Links with a missing or invalid href are deliberately kept out of manifestUrls — they resolve to nothing usable. They are carried on the issue itself instead, in details.manifestLinksMissingHref (the offending markup) and details.manifestInvalidHrefs (the offending href values).


Detection Dependencies

  • The following data sources are required to evaluate this issue:
  • HTML Document — The crawler extracts every <link> whose rel token list contains manifest from the HTML head

Further reading