Skip to content

manifest: scope_extensions support

Published Updated

manifest: scope_extensions — A Web App Manifest member that lets an installed PWA’s navigation scope span additional origins, each opted in through a .well-known/web-app-origin-association file hosted on that origin. Per the explainer, since a hosted association file lets an origin be added to another app’s scope, it is advised that the app and the associated origin be owned by the same entity.

  • Legend
  • Yes
  • Partial
  • Flag
  • No
  • Unknown
Browser / PlatformSupportVersionsConfidenceSourceNotes
Chrome (Desktop)Yes138highsource—
Chrome (Android)Yes138highsource1
Edge (Desktop)Yes138highsource2
Firefox (Desktop)No—highsource3
Firefox (Android)No—highsource45
Safari (macOS)No—highsource6
Safari (iOS)No—highsource78
Samsung InternetYes30.0highsource9
WebView (Android)Yes138highsource10
  1. Derived by browser-compat-data mirroring from Chrome.
  2. Derived by browser-compat-data mirroring from Chrome.
  3. No Firefox support is recorded in browser-compat-data.
  4. No Firefox for Android support is recorded in browser-compat-data.
  5. Derived by browser-compat-data mirroring from Firefox.
  6. No Safari support is recorded in browser-compat-data.
  7. No Safari on iOS support is recorded in browser-compat-data.
  8. Derived by browser-compat-data mirroring from Safari.
  9. Derived by browser-compat-data mirroring from Chrome Android.
  10. Derived by browser-compat-data mirroring from Chrome Android.

Source data: /compatibility/manifest-scope-extensions.json · Global usage: 72 % (StatCounter 2026-05)

Source: spec · MDN · Last verified 2026-10-03 · Confidence: high (computed from sources)

Per browser-compat-data, the Chrome for Android row is recorded as a mirror of the desktop Chrome entry, meaning its support figure is inherited from the desktop row.

Declare the extended origins in the manifest:

{
"scope_extensions": [
{ "type": "origin", "origin": "https://help.example.com" },
{ "type": "origin", "origin": "https://example.de" }
]
}

Per the explainer, each listed origin must opt in by hosting /.well-known/web-app-origin-association, naming the app’s manifest id:

{
"https://example.com/app": {
"scope": "/"
}
}

Per MDN, this file establishes the association in both directions — the app declares the extension in its manifest, and the target origin explicitly authorizes it.

Neither source defines a JavaScript API for reading back whether the browser recognized scope_extensions. The code below can only test whether the manifest object the page already has declares the member — not whether the browser applied it — and falls back to an empty list when the member is missing or malformed:

function getScopeExtensions(manifest) {
if (!('scope_extensions' in manifest) || !Array.isArray(manifest.scope_extensions)) {
// Member absent or malformed — fall back to no extended scope.
return [];
}
return manifest.scope_extensions;
}
  • Per MDN, this is an experimental feature — check current browser support before depending on it in production.
  • Per browser-compat-data, Chrome for Android mirrors the desktop Chrome entry, so its listed support figure is inherited from the desktop row.
  • Per MDN, following a link outside the app’s (extended) scope makes it “appear as an external location, as expected” once opted in correctly.
  • Per the explainer, when a page in an app window navigates to a URL outside the (extended) scope, some browser implementations may handle it by opening a new tab or browsing context in a regular browser window instead of staying in the app window.
  • Per the explainer, each extended origin must host its own /.well-known/web-app-origin-association file — a missing or misconfigured file on the target origin means the extension is not authorized, regardless of what the app’s own manifest declares.

← Back to the Compatibility explorer.