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.
Browser & ecosystem support
Section titled “Browser & ecosystem support”- Legend
- Yes
- Partial
- Flag
- No
- Unknown
| Browser / Platform | Support | Versions | Confidence | Source | Notes |
|---|---|---|---|---|---|
| Chrome (Desktop) | Yes | 138 | high | source | — |
| Chrome (Android) | Yes | 138 | high | source | 1 |
| Edge (Desktop) | Yes | 138 | high | source | 2 |
| Firefox (Desktop) | No | — | high | source | 3 |
| Firefox (Android) | No | — | high | source | 45 |
| Safari (macOS) | No | — | high | source | 6 |
| Safari (iOS) | No | — | high | source | 78 |
| Samsung Internet | Yes | 30.0 | high | source | 9 |
| WebView (Android) | Yes | 138 | high | source | 10 |
- Derived by browser-compat-data mirroring from Chrome.
- Derived by browser-compat-data mirroring from Chrome.
- No Firefox support is recorded in browser-compat-data.
- No Firefox for Android support is recorded in browser-compat-data.
- Derived by browser-compat-data mirroring from Firefox.
- No Safari support is recorded in browser-compat-data.
- No Safari on iOS support is recorded in browser-compat-data.
- Derived by browser-compat-data mirroring from Safari.
- Derived by browser-compat-data mirroring from Chrome Android.
- Derived by browser-compat-data mirroring from Chrome Android.
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.
How to use it
Section titled “How to use it”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.
How to detect it at runtime
Section titled “How to detect it at runtime”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;}Practical checklist
Section titled “Practical checklist”- 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-associationfile — a missing or misconfigured file on the target origin means the extension is not authorized, regardless of what the app’s own manifest declares.
Where to go next
Section titled “Where to go next”- manifest: handle_links support — another Web App Manifest member.
- manifest: scope support — the base scope
boundary that
scope_extensionsextends.
← Back to the Compatibility explorer.