Skip to content

manifest: launch_handler support

Published Updated

manifest: launch_handler — The launch_handler member’s client_mode sub-field controls how an installed PWA is launched: whether it reuses an existing app window or opens a new one, and whether that window is navigated to the launch’s target URL.

  • Legend
  • Yes
  • Partial
  • Flag
  • No
  • Unknown
Browser / PlatformSupportVersionsConfidenceSourceNotes
Chrome (Desktop)Yes110highsource—
Chrome (Android)Yes110highsource1
Edge (Desktop)Yes110highsource2
Firefox (Desktop)No—highsource3
Firefox (Android)No—highsource45
Safari (macOS)No—highsource6
Safari (iOS)No—highsource78
Samsung InternetYes21.0highsource9
WebView (Android)Yes110highsource10
  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-launch-handler.json · Global usage: 72 % (StatCounter 2026-05)

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

Per Chrome for Developers, launch_handler has one sub-field, client_mode, and defaults to {"client_mode": "auto"} when unspecified:

{
"launch_handler": {
"client_mode": "navigate-new"
}
}

Per MDN, the allowed client_mode values are navigate-new (always open a new client), navigate-existing (focus and navigate an existing client, falling back to navigate-new if none is open), focus-existing (focus an existing client without navigating it, again falling back to navigate-new if none is open), and auto (the user agent picks whichever behavior fits the platform).

Reading the launch target with LaunchQueue

Section titled “Reading the launch target with LaunchQueue”

Per MDN, whichever client_mode is used, the launch’s target URL is made available through window.launchQueue for custom navigation handling:

if ("launchQueue" in window) {
window.launchQueue.setConsumer((launchParams) => {
if (launchParams.targetURL) {
const url = new URL(launchParams.targetURL);
// Route the already-open app window to the launched URL yourself.
history.pushState(null, "", url.pathname + url.search);
}
});
}

Feature-detect "launchQueue" in window before registering a consumer. When launchQueue is unavailable, the fallback below routes from the page’s current location:

if ("launchQueue" in window) {
window.launchQueue.setConsumer((launchParams) => {
if (launchParams.targetURL) {
route(new URL(launchParams.targetURL));
}
});
} else {
// LaunchQueue is unavailable — fall back to the current page URL.
route(new URL(location.href));
}
  • Firefox and Safari do not implement launch_handler, per the compatibility data above — always provide a fallback that works from location alone.
  • navigate-existing and focus-existing both fall back to navigate-new behavior when no client is already open, per MDN — do not assume an existing window exists.
  • Feature-detect "launchQueue" in window before calling setConsumer().
  • navigate-new and navigate-existing navigate a client to the target URL; focus-existing does not, so handle launchParams.targetURL when that mode should route the focused client to the target.

← Back to the Compatibility explorer.