Skip to content

Concept in Installation

Web App Origin Association file

Published Updated

Limited availabilityNot supported in Firefox (Desktop), Firefox (Android), Safari (macOS), Safari (iOS)Explainer

The Web App Origin Association file lets an origin confirm that a web app may include that origin in its extended scope. The origin serves the JSON file at /.well-known/web-app-origin-association.

The app manifest lists another origin in scope_extensions. That origin confirms the request by using the app’s manifest id as a top-level key in its association file. The optional scope member limits the accepted URL space on the confirming origin; the explainer defines / as its default.

Each side controls its own declaration. Removing either the manifest entry or the matching association-file entry removes the pair described by the explainer.

The first example shows the association file itself; the second keeps a normal cross-origin link available when display mode cannot establish whether association succeeded.

This file confirms the app whose manifest id is https://app.example/id and limits its accepted scope on the confirming origin to /docs.

{
"https://app.example/id": {
"scope": "/docs"
}
}

Serve the JSON from https://support.example/.well-known/web-app-origin-association, because the confirming origin owns the file.

Keeping navigation usable with display-mode

Section titled “Keeping navigation usable with display-mode”

The display-mode media feature reports the display mode in which the app is shown. That value is not an association-success signal, so keep the ordinary link as the navigation path in both branches.

const link = document.createElement('a');
link.href = 'https://support.example/docs';
link.textContent = 'Open documentation';
if ('matchMedia' in globalThis && matchMedia('(display-mode: standalone)').matches) {
link.dataset.surface = 'standalone';
} else {
link.dataset.surface = 'browser-fallback';
}
document.body.append(link);

The fallback does not guess why the standalone query is false. It leaves the cross-origin URL available for the browser to navigate normally.

Specifications

SpecificationStatus
manifest: scope_extensionsExplainer
  • 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 Internet#Yes30.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: 75 % (StatCounter 2026-09, CC BY-SA 4.0)

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