Misconfigured PWA manifest link
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
hrefattribute is missing entirely - The
hrefattribute is empty or contains only whitespace - The
hrefvalue 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:
Find the broken tag: The issue lists the URL of the page carrying it. Look for a
<link rel="manifest">with nohref, an emptyhref, or a placeholder value such as#.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.
Point it at a real file: If the site is a PWA, set the
hrefto the manifest path — a root-relative path (/manifest.json), an absolutehttps://URL, or a protocol-relative URL are all accepted. Avoid spaces in the path and non-fetchable schemes such asjavascript:.Fix the template, not the page: A missing
hrefis usually an unfilled template variable, so the same broken tag tends to appear on every page rendered by that layout.Create the manifest file if it does not exist: A
manifest.jsonneeds at minimumname,short_name,start_url,display, andicons.Verify: Load the page and check the Application panel in browser DevTools — the manifest should be listed and parsed without errors.
Examples
Example 1: Correctly configured manifest link
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
hrefattribute is non-empty and resolvable
<head>
<title>My PWA App</title>
<link rel="manifest" href="/manifest.json" />
</head>Example 2: No manifest link at all
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>Example 3: Manifest link with no href
Scenario: A template renders the tag but the manifest path variable was never filled in.
Fails because:
- The
hrefattribute 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>Example 4: Manifest link with an empty href
Scenario: The template emitted the attribute with an empty value.
Fails because:
- An empty
hrefresolves 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>Example 5: Manifest link with a malformed href
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.
Fetch the page: PixyScan issues an HTTP GET request to the target URL and reads the raw HTML response without executing JavaScript.
Find every manifest link: The crawler collects all
<link>elements whoserelattribute contains the tokenmanifest.relis a space-separated, ASCII case-insensitive token list, sorel="Manifest"andrel="icon manifest"are matched as well.Read the
href: For each matched element, the rawhrefattribute value is read and trimmed.Classify each link:
- Missing — the
hrefattribute is absent, empty, or whitespace only. - Invalid — the
hrefis a bare fragment (#…), contains inner whitespace, uses a scheme other thanhttp/https, or cannot be parsed as a URL. - Valid — anything else. The value is resolved against the page URL and stored in
manifestUrls.
- Missing — the
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.
- If any manifest link has no usable
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>whosereltoken list containsmanifestfrom the HTML head