v150 · PWA · Manifest

Install State Simulator

Walk through a complete PWA origin migration from the user's perspective across four phases: pre-migration (app installed on old origin), developer deploys the migration handshake, Chrome verifies and presents the migration, and post-migration state. Each phase shows what Chrome does, what the user sees, and what data survives.

The PWA is installed at https://www.example.com/app/. The user has a shortcut on their desktop/homescreen. App data lives in the old origin's storage partition.
old origin
INSTALLED
new origin
not installed
Current state: app lives at https://www.example.com/app/

Data at this point

💾IndexedDB (old origin)present
🗄️localStorage (old origin)present
⚙️Service worker (old scope)active
🔔Push subscriptionsactive
The developer deploys changes to both origins. The destination manifest declares the old installed app in migrate_from. The old origin serves a web-app-origin-association file with allow_migration for the destination app ID.
On the user's next visit or app update check, Chrome fetches and verifies both sides. If all checks pass, Chrome presents the migration as an app update-style flow; a forced migration blocks the next launch until the user migrates or uninstalls.
Migration complete. The app shortcut now opens the new origin. The user sees no interruption. What happens to storage data depends on whether both origins share data before migration.
old origin
redirected
new origin
INSTALLED
App now lives at https://app.example.com/app/

Data survival

💾IndexedDB (old origin)old partition — migrate manually
🗄️localStorage (old origin)old partition — migrate manually
⚙️Service workerold SW still registered — may need update
🔔Push subscriptionsold origin — re-subscribe on new
🖼️App shortcutpreserved — now opens new origin
📌App ID in Chromeupdated to destination manifest id
Storage note: origin-scoped APIs (IndexedDB, localStorage, Cache API) use origin as the partition key. Data on the old origin is not automatically copied to the new one. Your app's first load on the new origin should check for and migrate any critical user data from the old origin (using cross-origin fetch or redirects) before the old origin is retired.

see also

implementation reference

Need the exact API surface, compatibility boundaries, errors, lifecycle, and source links? Read the matching gendn reference ↗