No PWA manifest link
What Is This Issue
sidebar_label: “What is this issue?”
What is this issue?
This issue checks whether pages that support Progressive Web App (PWA) features declare a <link rel="manifest"> tag in the HTML <head> section pointing to a valid manifest.json file.
A passing implementation requires:
- A
<link rel="manifest">tag in the page head - The
hrefattribute pointing to a valid manifest file URL - The manifest URL must return HTTP 200
- The manifest file must be served with the correct Content-Type (
application/manifest+jsonorapplication/json)
Example: If your website is a PWA at https://example.com, you should declare a manifest link tag pointing to /manifest.json so browsers can install the app and display it as a standalone application.
Why Is This Important
sidebar_label: “Why is this important?”
Why is this issue important?
The Web App Manifest is essential for Progressive Web App functionality and modern web experiences.
Impacts on user experience and engagement:
-
PWA installability: Browsers use the manifest to determine if a site can be installed as a PWA. Without the manifest link tag, the “Add to Home Screen” prompt will not appear in Chrome, Edge, or other supporting browsers.
-
App metadata: The manifest provides browsers with essential app information including name, icons, theme colors, and display mode. This metadata controls how the app appears when installed on a user’s device.
-
User engagement: Installed PWAs have higher engagement rates, with users returning more frequently and spending more time in the app-like experience.
-
Mobile experience: On mobile devices, PWAs can run in standalone mode without browser UI, providing a native app-like experience that improves user satisfaction.
Resolving this issue improves the overall SEO health score by enabling PWA features that can lead to better user engagement metrics, increased return visits, and improved mobile user experience—all of which are positive signals for search rankings.
How XeoPix Detects This
sidebar_label: “How XeoPix detects this”
How XeoPix detects this
XeoPix uses a straightforward detection process to identify Web App Manifest implementation:
-
Fetch the page: XeoPix issues an HTTP GET request to the target URL and reads the raw HTML response without executing JavaScript.
-
Scan for manifest link tags: The crawler scans the
<head>block for all<link>tags and searches for a tag where therelattribute equalsmanifest. -
Extract href value: For the matched tag, XeoPix extracts the
hrefattribute value. -
Validate manifest presence: The crawler checks whether a
<link rel="manifest">tag exists in the page head and whether thehrefvalue is a valid non-empty URL. -
Test manifest URL accessibility: XeoPix issues a secondary HTTP GET request to the manifest
hrefURL and records the HTTP status code and Content-Type response header. -
Check Content-Type: The crawler verifies whether the manifest file is served with the correct Content-Type (
application/manifest+jsonorapplication/json). -
Determine pass/fail: The issue passes if a manifest link tag is present, the manifest URL returns HTTP 200, and the Content-Type is valid. The issue fails if the tag is missing, the URL returns a non-2xx status code, or the Content-Type is incorrect.
How To Fix
sidebar_label: “How to fix”
How to fix it
Add the manifest link tag inside the page <head> section:
<link rel="manifest" href="/manifest.json" />Step-by-step recommendations:
-
Create the manifest file: Create a
manifest.jsonfile with at minimum these required fields:name: Full app nameshort_name: Short name for home screenstart_url: Starting URL when app launchesdisplay: Display mode (typicallystandalone)icons: Array of icon objects with different sizes
-
Add the link tag: Place the
<link rel="manifest">tag in the<head>section of all pages that should be installable as a PWA. -
Verify manifest accessibility: Ensure the manifest file is accessible at the declared
hrefand returns HTTP 200 when accessed directly. -
Check Content-Type header: Confirm the manifest URL returns the correct Content-Type header:
application/manifest+json(preferred)application/json(also acceptable)
-
Configure server MIME types: If using
.webmanifestor.jsonextension, ensure your server is configured to serve these files with the correct MIME type. Some servers require manual configuration. -
Test PWA installability: Use browser DevTools (Application panel) to verify the manifest is detected and the PWA installability criteria are met.
What We Store
sidebar_label: “What We Store”
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 | Web app manifest URLs found on the page |
Detection Dependencies
- The following data sources are required to evaluate this issue:
- HTML Document — The crawler extracts the
<link rel="manifest">tag from the HTML head
Examples
sidebar_label: “Examples”
Examples
Example 1: Correct manifest link tag implementation
Scenario: A PWA properly declares a manifest link tag.
Passes because:
- A
<link rel="manifest">tag is present in the head section - The
hrefattribute points to a valid manifest file URL - The manifest URL returns HTTP 200 with correct Content-Type
<head>
<title>My PWA App</title>
<link rel="manifest" href="/manifest.json" />
</head>Example 2: Missing manifest tag
Scenario: A website intends to be a PWA but forgot to add the manifest link tag.
Fails because:
- No
<link rel="manifest">tag is present - Browsers cannot install the app as a PWA
- The site cannot be displayed as a standalone application
<head>
<title>My PWA App</title>
</head>Corrected version:
<head>
<title>My PWA App</title>
<link rel="manifest" href="/manifest.json" />
</head>Example 3: Incorrect Content-Type
Scenario: The manifest link tag is present, but the server serves the file with wrong Content-Type.
Fails because:
- The
<link rel="manifest">tag is present - The manifest URL returns HTTP 200
- But the Content-Type is
text/plaininstead ofapplication/manifest+json - Browsers may not recognize the manifest file
<head>
<title>My PWA App</title>
<link rel="manifest" href="/manifest.json" />
</head>Corrected version: Configure the server to serve .json files with Content-Type application/manifest+json or application/json.
Unit Test
Test File
xeopix-crawling-v2/__tests__/seo-audit-checks/linkRelTags/issue-132-link-rel-manifest.test.js
Purpose
This unit test validates that the SEO audit correctly detects when a page is missing a PWA manifest <link rel="manifest"> tag in the <head> section.
Tested Function
runLinkRelTags() from toggleGroups/linkRelTags
Issue Information
- Issue Number: #132
- Issue Code:
LINK_REL_MANIFEST - Toggle Group:
linkRelTags
Test Scenarios
Positive Test Cases
- Should not detect issue when a
<link rel="manifest">tag is present - Should not detect issue when multiple manifest links are present
Negative Test Cases
- Should detect issue when no manifest link exists — message: “PWA manifest link is missing”
Boundary Cases
None.
Edge Cases
- Wrong rel: An
<link rel="stylesheet" href="/manifest.json">should not be recognised as a valid manifest link - Empty head: Should detect issue when
<head></head>is empty
Expected Outcome
Pass
The issue should be reported (i.e., added to ctx.issues) when no <link rel="manifest"> is found in the <head> section.
Fail
The issue should not be reported when at least one <link rel="manifest"> tag is present in the <head> section.
Validation
- Correct issue detection when no manifest link is present
- No false positives when a valid manifest link exists
- Rejects incorrect
relvalues (stylesheet) even when thehrefpoints to a manifest file - Payload validation: extracts
manifestUrlsarray with correcthrefvalues
Related Production Files
xeopix-crawling-v2/toggleGroups/linkRelTags.jsxeopix-crawling-v2/issueCodes.js
Coverage Summary
- Validates positive (manifest present), negative (manifest missing), and edge cases (wrong rel, empty head)
- Validates payload structure with correct URL resolution
- Handles multiple manifest links gracefully
References
- W3C Web App Manifest Specification — W3C
- MDN — Web App Manifests — MDN
- web.dev — Add a Web App Manifest — web.dev