demo · v132

PWA Link Capture Demo

Chrome 132 enables user navigation capturing on desktop PWAs. When a user clicks a link to your PWA's scope, Chrome can open it inside the installed app window instead of the browser tab. Configure the capture_links manifest field below to see exactly how each value changes the behaviour.

Checking PWA install state…
web app manifest — capture_links configurator
capture_links
display
launch_handler.client_mode

capture_links behaviour matrix

Scenariononenew-clientexisting-client-navigate
User clicks link to PWA scope from browser tab Opens in browser tab Opens in new PWA window Navigates existing PWA window
User clicks link to PWA scope from another app Opens in browser tab Opens in new PWA window Navigates existing PWA window
User types URL directly into browser bar Browser bar Browser bar (user intent = browser) Browser bar (user intent = browser)
Link clicked inside PWA window Stays in PWA Stays in PWA Stays in PWA
PWA not installed Browser tab Browser tab (ignored) Browser tab (ignored)

How Chrome decides

1User clicks a link whose href is within the PWA's declared scope.
2Browser checks: is this PWA installed? If no → open in browser tab, done.
3Chrome 132 reads capture_links from the installed manifest.
4 none: browser tab as usual.
new-client: open a new PWA window / tab for this navigation.
existing-client-navigate: if a PWA window is open, navigate it; else open new.
5The PWA window's launch_handler.client_mode further refines which window is chosen when multiple PWA windows are open.
// web app manifest
{
  "name": "My PWA",
  "start_url": "/",
  "scope": "/app/",
  "display": "standalone",

  // Chrome 132+: capture links to this scope from outside the app
  "capture_links": "new-client",
  //                ^^^^^^^^^^
  // "none"                     — don't capture, open in browser
  // "new-client"               — open new PWA window
  // "existing-client-navigate" — navigate existing PWA window

  // Controls which window is targeted when multiple are open
  "launch_handler": {
    "client_mode": "navigate-new"
    //              "auto" | "navigate-new" | "navigate-existing" | "focus-existing"
  }
}

see also