# OpenPWA > The reference for Progressive Web Apps — APIs, browser compatibility, and ecosystem > & store policy, in English and Chinese, kept current. Structured browser, platform, > and ecosystem-policy data that search answer-engines and LLMs can quote. OpenPWA is a reference kept current in place; News carries dated long-form articles written from PWA ecosystem signals and linked back into the reference. Prose entries are also served as clean Markdown at `.md` for ingestion, and the full corpus is inlined at https://openpwa.net/llms-full.txt. ## Reference - [Reference](https://openpwa.net/reference/): The PWA knowledge tree — manifest, service workers, installability, device capabilities, storage, notifications, performance, and platforms — kept current and source-backed. - [Capabilities](https://openpwa.net/reference/capabilities/): Device and platform capabilities: File System, Web Share, Bluetooth, WebGPU, Payment, and more. - [Async Clipboard API: reading and writing the clipboard](https://openpwa.net/reference/capabilities/clipboard/): How navigator.clipboard.writeText/write and readText/read work, the secure-context and user-gesture requirements, the Clipboard permission model, and the legacy execCommand fallback. - [Contact Picker API: letting users share selected contacts, not the whole address book](https://openpwa.net/reference/capabilities/contact-picker/): How the Contact Picker API's navigator.contacts.select() lets a user pick specific contacts and choose which fields to share with a site, why it requires a secure context and a user gesture, and why MDN marks it experimental and not Baseline. - [Credential Management API](https://openpwa.net/reference/capabilities/credential-management/): navigator.credentials lets a site create, store, and retrieve sign-in credentials: the four credential types, the mediation modes, and the browser gaps. - [Digital Goods API (Play Billing in TWAs)](https://openpwa.net/reference/capabilities/digital-goods/): The Digital Goods API lets a PWA running in a Trusted Web Activity query SKUs and purchases through Google Play Billing, alongside the Payment Request API. - [Document Picture-in-Picture: always-on-top window](https://openpwa.net/reference/capabilities/document-picture-in-picture/): How the Document Picture-in-Picture API opens an always-on-top HTML window, its requestWindow() options, feature detection, and Chrome/Firefox browser support. - [EyeDropper API: sampling on-screen colors](https://openpwa.net/reference/capabilities/eyedropper/): How the EyeDropper() constructor and open() method let a page sample a pixel's color anywhere on screen for a custom color picker, why open() requires a user gesture, and the desktop-only, Chromium-only support starting at Chrome and Edge 95. - [File System Access API: read and write local files](https://openpwa.net/reference/capabilities/file-system-access/): Pickers, file and directory handles, the permission model, persisting handles in IndexedDB, OPFS, and what to fall back to where the pickers do not exist. - [Geolocation API: accessing the user's location](https://openpwa.net/reference/capabilities/geolocation/): How navigator.geolocation works, the explicit permission prompt, secure-context requirement, getCurrentPosition vs watchPosition, accuracy hints, and privacy considerations. - [Idle Detection API: watching for user and screen inactivity](https://openpwa.net/reference/capabilities/idle-detection/): How the IdleDetector interface reports whether the user is active or idle and whether the screen is locked or unlocked, its permission model and 60-second minimum threshold, and where it is (and is not) implemented. - [Local Font Access API: enumerating the fonts installed on a device](https://openpwa.net/reference/capabilities/local-font-access/): How window.queryLocalFonts() lets a page enumerate locally installed fonts as FontData objects, the local-fonts permission it requires, why it does not need to return every font, and where it ships. - [Local Network Access: a local-request prompt](https://openpwa.net/reference/capabilities/local-network-access/): How Chrome shows a Local Network Access permission prompt before a public page can reach a device on the local network, replacing silent preflight-only checks. - [Media Session API](https://openpwa.net/reference/capabilities/media-session/): How navigator.mediaSession sets metadata and action handlers for OS-level media controls, with Chrome, Firefox, and Safari support versions. - [Navigation API](https://openpwa.net/reference/capabilities/navigation-api/): How window.navigation and the navigate event let single-page apps intercept and control browser navigations, with Chrome, Firefox, and Safari support versions. - [Payment Request API: browser-mediated checkout](https://openpwa.net/reference/capabilities/payment-request/): How PaymentRequest standardises checkout across browsers, the payment-method identifier system, the show()/abort() lifecycle, shipping and contact fields, and the secure-context requirement. - [Manifest protocol_handlers: registering a PWA for custom URL schemes](https://openpwa.net/reference/capabilities/protocol-handlers/): How the manifest's protocol_handlers member registers an installed PWA to handle clicks on a given URL scheme, the web+ naming rule for custom schemes, and the %s placeholder that carries the clicked URL into your app. - [Screen Capture API (getDisplayMedia)](https://openpwa.net/reference/capabilities/screen-capture/): getDisplayMedia() lets a page prompt the user to capture a screen, window, or tab as a MediaStream, for recording locally or sending over WebRTC. - [Generic Sensor API](https://openpwa.net/reference/capabilities/sensors/): The Generic Sensor API exposes device sensors like Accelerometer and Gyroscope through common interfaces, behind a secure-context and Permissions API check. - [Storage Buckets API: named partitions](https://openpwa.net/reference/capabilities/storage-buckets/): How navigator.storageBuckets creates separately named storage buckets, how Chrome exposes IndexedDB inside them, and the history of the durability option. - [VirtualKeyboard API](https://openpwa.net/reference/capabilities/virtual-keyboard/): How the VirtualKeyboard API lets a page opt out of automatic viewport resizing and read the on-screen keyboard's geometry, with Chrome/Firefox/Safari support. - [Screen Wake Lock API: keeping the screen on](https://openpwa.net/reference/capabilities/wake-lock/): How navigator.wakeLock.request() prevents the screen from dimming, the secure-context requirement, the automatic release on page visibility change, and when to use wake lock vs. other keep-alive patterns. - [Web Bluetooth API: connecting to Bluetooth Low Energy devices](https://openpwa.net/reference/capabilities/web-bluetooth/): How navigator.bluetooth.requestDevice() requests access to Bluetooth Low Energy devices, the user-activation and secure-context requirements, and the GATT model. - [WebHID API: navigator.hid device access from the web](https://openpwa.net/reference/capabilities/web-hid/): Pair a HID device with navigator.hid.requestDevice(), handle connect and disconnect events, and meet the secure-context and activation rules. - [Web Locks API: exclusive and shared named locks](https://openpwa.net/reference/capabilities/web-locks/): How navigator.locks.request() grants exclusive or shared named locks to coordinate work, its storage-bucket scoping, and its secure-context restriction. - [Web NFC: reading and writing NFC tags from the web](https://openpwa.net/reference/capabilities/web-nfc/): How NDEFReader.scan() and write() exchange NDEF messages with NFC tags, the spec's secure-context and visible-top-level-document requirements, the "nfc" permission prompt, and the current non-Baseline browser support starting at Chrome for Android 89. - [Web Serial API: navigator.serial device access](https://openpwa.net/reference/capabilities/web-serial/): How navigator.serial.requestPort() and getPorts() grant page access to a serial port, which browsers support it, and how to feature-detect it with a fallback. - [Web Share API: native share sheet from the browser](https://openpwa.net/reference/capabilities/web-share/): How navigator.share() triggers the OS share sheet, what data types it accepts, the user-gesture requirement, and when to fall back to a copy-to-clipboard pattern. - [WebUSB API: connecting to non-standard USB devices from the web](https://openpwa.net/reference/capabilities/web-usb/): How navigator.usb.requestDevice() pairs with USB devices outside the standard device classes, the transient-activation and secure-context requirements, the permission/chooser model, and the optional landing-page mechanism. - [WebAuthn and passkeys](https://openpwa.net/reference/capabilities/webauthn-passkeys/): How the Web Authentication API and passkeys give a PWA phishing-resistant, passwordless sign-in — credential creation and assertion, discoverable credentials, platform vs roaming authenticators, and cross-device sync. - [WebCodecs: low-level, hardware-accelerated audio and video encoding](https://openpwa.net/reference/capabilities/webcodecs/): How the WebCodecs API's VideoEncoder, VideoDecoder, AudioEncoder, and AudioDecoder give per-frame, hardware-accelerated access to encoding and decoding inside a Dedicated Web Worker, and its fully-specified codec-string requirement. - [WebGPU: GPU rendering and compute in the browser](https://openpwa.net/reference/capabilities/webgpu/): How navigator.gpu.requestAdapter()/requestDevice() expose the GPU for rendering and compute via WGSL, current Chrome/Firefox/Safari support, and the WebGL2 fallback path. - [WebRTC: peer-to-peer audio, video, and data](https://openpwa.net/reference/capabilities/webrtc/): How getUserMedia, RTCPeerConnection, and RTCDataChannel fit together: signaling, ICE candidates, rendering the remote stream in a video element, and hang-up. - [WebTransport: HTTP/3 streams and datagrams](https://openpwa.net/reference/capabilities/webtransport/): Send data over HTTP/3 with reliable streams and unreliable datagrams, how to detect support, and where Chrome, Edge, Firefox and Safari stand. - [Window Management API: placing windows across multiple screens](https://openpwa.net/reference/capabilities/window-management/): How window.screen.isExtended and Window.getScreenDetails() expose multi-screen layout details, the window-management permission prompt, the secure-context requirement, and today's Chromium-only support per MDN. - [Installation](https://openpwa.net/reference/installation/): Installability criteria, install prompts, badging, and the N+1 problem. - [Badging API: app icon badges for installed PWAs](https://openpwa.net/reference/installation/badging/): How to set and clear numeric or presence badges on a PWA's app icon using the Badging API, with per-platform support notes for Android, iOS, and desktop. - [Desktop PWA installation: Chrome, Edge, and beyond](https://openpwa.net/reference/installation/desktop-install/): How PWA installation works on Windows, macOS, Linux, and ChromeOS — install UI, window management, OS integration, and per-platform differences. - [getInstalledRelatedApps(): detecting an installed native or PWA counterpart](https://openpwa.net/reference/installation/get-installed-related-apps/): How navigator.getInstalledRelatedApps() lets a web app check whether a related Android, UWP, or PWA counterpart declared in related_applications is already installed, and the verification each platform requires. - [beforeinstallprompt and custom install prompts](https://openpwa.net/reference/installation/install-prompt/): How beforeinstallprompt works, how to defer and trigger it from a user gesture, installability criteria, and why iOS requires a manual Add to Home Screen. - [Install prompt UX: when and how to surface your install button](https://openpwa.net/reference/installation/install-prompt-ux/): Best-practice patterns for timing, placement, and copy of a custom PWA install prompt using the beforeinstallprompt API, including iOS and desktop fallbacks. - [App shortcuts after install](https://openpwa.net/reference/installation/install-shortcuts/): Manifest shortcuts are only displayed by right-clicking or long-pressing the app icon, meaning they only become available once the PWA is installed — not from a browser tab. - [Installability criteria: what makes a PWA installable](https://openpwa.net/reference/installation/installability-criteria/): The exact criteria a PWA must meet before browsers show an install prompt or let a user add the app to their home screen, broken down by platform. - [iOS Add to Home Screen: PWA installation on iOS](https://openpwa.net/reference/installation/ios-add-to-home-screen/): How PWA installation works on iOS and iPadOS — the manual Add to Home Screen gesture, what the Home Screen entry can do, and the iOS 26 change to web app mode. - [The N+1 install problem: one PWA, multiple independent installs](https://openpwa.net/reference/installation/n-plus-one/): How installing a PWA is tied to the browser used to install it, so the same PWA can end up installed as separate, data-isolated instances from different browsers on one device — and why the browser that installed it is the only one aware of the installed state. - [Richer install UI: enriching the install prompt with description and screenshots](https://openpwa.net/reference/installation/richer-install-ui/): How providing values for the manifest description and screenshots members adds those values to the install prompt on Android only, versus the browser's default prompt which shows just the app's name and icon. - [Trusted Web Activity (TWA): PWAs in the Play Store](https://openpwa.net/reference/installation/twa/): What a Trusted Web Activity is, how it differs from a WebAPK, how Digital Asset Links verification works, and when to use TWA vs other install paths. - [Uninstalling an installed PWA](https://openpwa.net/reference/installation/uninstall-retention/): How users uninstall an installed PWA on desktop and iOS, and where each platform surfaces the management UI, per MDN and Microsoft Edge's own documentation. - [WebAPK: how Chrome installs PWAs on Android](https://openpwa.net/reference/installation/webapk/): What a WebAPK is, how Chrome mints and updates it, what capabilities it unlocks compared to a web shortcut, and its limitations. - [Web app manifest: the minimal one that works](https://openpwa.net/reference/manifest/): The JSON file that makes a site installable — a minimal working manifest, how to link it, which members matter, and where each one is documented. - [Manifest categories](https://openpwa.net/reference/manifest/categories/): The categories manifest member lists classifications such as productivity or games that help users discover a web app in app stores and other catalogs. - [Manifest description: optional app-store text](https://openpwa.net/reference/manifest/description/): The description manifest member is optional text for app-store listings; Chrome has supported it since version 88, but Firefox and Safari do not implement it. - [Manifest display modes: standalone vs fullscreen](https://openpwa.net/reference/manifest/display/): What the manifest display member controls, the fallback chain across fullscreen, standalone, minimal-ui and browser, and how to choose a mode. - [display_override: opting into window-controls-overlay and tabbed modes](https://openpwa.net/reference/manifest/display-override/): How the manifest display_override array lets a PWA request display modes outside the fixed display fallback chain — window-controls-overlay and tabbed — while keeping a safe display fallback for older browsers. - [Manifest edge_side_panel: pinning a PWA to the Microsoft Edge sidebar](https://openpwa.net/reference/manifest/edge-side-panel/): How the edge_side_panel manifest member and its preferred_width property let a PWA opt in to the Microsoft Edge sidebar, how to detect the sidebar context, and that Microsoft has announced this feature is being deprecated. - [Manifest file_handlers](https://openpwa.net/reference/manifest/file-handlers/): How the file_handlers manifest member registers an installed PWA as an OS-level handler for specific file types, and how window.launchQueue delivers the opened file to your app code. - [handle_links: link handling for installed PWAs](https://openpwa.net/reference/manifest/handle-links/): What the proposed handle_links member does (auto, preferred, not-preferred), how it relates to scope_extensions and launch_handler, and its status today. - [Manifest icons and maskable icons](https://openpwa.net/reference/manifest/icons/): What the manifest icons member does, which properties are actually required, when a maskable icon is needed, and how to verify the icons you shipped at runtime. - [Web app manifest id: a stable PWA identity](https://openpwa.net/reference/manifest/id/): The manifest id member pins an installed PWA's identity independently of start_url, so a changed URL never creates a duplicate install. - [Manifest launch_handler: controlling how an installed app launches](https://openpwa.net/reference/manifest/launch-handler/): How the launch_handler manifest member's client_mode controls whether launching an installed web app focuses or navigates an existing window or opens a new one, its four values, their fallback behavior, and its current experimental, non-Baseline browser support. - [Manifest localization: lang, dir, and *_localized members](https://openpwa.net/reference/manifest/localization/): How the Web App Manifest's dir and lang members set default text direction and language, and how the *_localized member pattern (name_localized, short_name_localized, description_localized, icons_localized) provides per-field translations with locale fallback. - [How installed PWAs pick up manifest changes](https://openpwa.net/reference/manifest/manifest-updates/): Chrome checks an installed PWA's manifest roughly once a day and applies most updates, like a new name or theme color, only after every window closes. - [Manifest name and short_name](https://openpwa.net/reference/manifest/name-short-name/): How the name and short_name manifest members control your PWA's display label in install prompts, home screens, app switchers, and OS launchers — and how to choose values that work everywhere. - [orientation: requesting a PWA's default screen](https://openpwa.net/reference/manifest/orientation/): What the manifest orientation member requests, how it relates to the separate Screen Orientation API, and what happens when a value isn't honored. - [Manifest protocol_handlers](https://openpwa.net/reference/manifest/protocol-handlers/): The protocol_handlers manifest member registers a web app in the OS's application preferences as a handler for URL schemes such as mailto or web+jngl. - [related_applications and prefer_related_applications](https://openpwa.net/reference/manifest/related-applications/): How the manifest's related_applications array points to platform-specific apps (platform, url, id), and how the prefer_related_applications boolean hints browsers to offer a native app instead of the web app. - [Manifest scope: your PWA's navigation boundary](https://openpwa.net/reference/manifest/scope/): How the manifest scope member decides which URLs get the app-like interface, how prefix matching and the fallback scope work, and how to test a URL at runtime. - [scope_extensions: extending a PWA's scope across origins](https://openpwa.net/reference/manifest/scope-extensions/): How the experimental scope_extensions manifest member and its required .well-known/web-app-origin-association verification file let a PWA treat pages on other origins as in-scope, and why MDN flags it as experimental. - [Manifest screenshots and richer install UI](https://openpwa.net/reference/manifest/screenshots/): How the screenshots manifest member supplies promotional images that browsers display in richer install dialogs and app-store-style previews, with accepted formats, platform constraints, and form_factor guidance. - [Manifest share_target](https://openpwa.net/reference/manifest/share-target/): How the share_target manifest member registers your installed PWA as a target in the OS native share sheet — receiving shared URLs, text, titles, and files from other apps. - [Manifest shortcuts](https://openpwa.net/reference/manifest/shortcuts/): How the shortcuts manifest member adds quick-action entries to the OS long-press or right-click context menu of your installed PWA — jumplist items on Windows, home-screen context menus on Android, and Dock shortcuts on macOS. - [Manifest start_url](https://openpwa.net/reference/manifest/start-url/): How the start_url manifest member sets the entry point your PWA loads when launched from the home screen or app launcher, and how to design it for deep links, analytics, and scope alignment. - [Tabbed application mode and tab_strip](https://openpwa.net/reference/manifest/tabbed-display/): How the experimental tabbed display_override value and the tab_strip member give an installed PWA its own tab strip, and how home_tab configures it. - [Manifest theme_color and background_color](https://openpwa.net/reference/manifest/theme-background-color/): How the theme_color and background_color manifest members control the browser chrome color and the splash screen background of your installed PWA — including browser support, meta tag interaction, and dark-mode considerations. - [Manifest widgets: PWA content on the OS widgets board](https://openpwa.net/reference/manifest/widgets/): How the manifest widgets member declares OS-widget-board entries for a PWA — the tag, template/ms_ac_template, data, icons and screenshots fields, the service-worker widgetinstall flow, and current Microsoft Edge/Windows 11 support. - [Notifications](https://openpwa.net/reference/notifications/): Web Push, permissions, and periodic background sync. - [iOS and Safari Web Push (16.4+)](https://openpwa.net/reference/notifications/ios-safari-push/): Web Push on iOS, iPadOS and Safari: the Home Screen requirement, the gesture-bound prompt, VAPID subscriptions, and the WebKit rules to design around. - [The Notification interface: constructing and reading a single notification](https://openpwa.net/reference/notifications/notification/): The Notification() constructor and its options (body, icon, tag, data, requireInteraction), the click/close/error events, and why calling it directly throws a TypeError on nearly all mobile browsers per MDN. - [Notification actions and badge options](https://openpwa.net/reference/notifications/notification-actions-badge/): How Notification actions buttons and the badge image option work, their persistent-notification requirement, and current browser support per MDN. - [Notification triggers: the discontinued showTrigger / TimestampTrigger proposal](https://openpwa.net/reference/notifications/notification-triggers/): What Chrome's Notification Triggers API (showTrigger and TimestampTrigger) was meant to do, its feature-detection pattern, why Chrome's team ended its development, and why showTrigger and TimestampTrigger are absent from MDN's current showNotification() options reference. - [The Notifications API: system notifications](https://openpwa.net/reference/notifications/notifications-api/): How a PWA shows OS-level notifications: the permission model, persistent versus non-persistent notifications, and why mobile means persistent ones. - [Periodic background sync for content updates](https://openpwa.net/reference/notifications/periodic-background-sync/): How periodic background sync gives an installed PWA a silent periodic refresh, why Chrome gates it on install and engagement, and how to test it in DevTools. - [The notification permission model](https://openpwa.net/reference/notifications/permissions/): How Notification.permission's three states work, why requestPermission() needs a user gesture, and why MDN says to stop prompting once a user has said no. - [Web Push: subscriptions, permissions, and delivery](https://openpwa.net/reference/notifications/web-push/): How the Push API, VAPID subscriptions, the permission model, and the service worker push/notificationclick events fit together — and why iOS requires an installed PWA. - [Performance](https://openpwa.net/reference/performance/): INP / Core Web Vitals, View Transitions, and Speculation Rules. - [The app shell model](https://openpwa.net/reference/performance/app-shell/): How the app shell pattern caches a page's markup, styles, scripts, and images in a service worker so repeat visits render the UI chrome instantly. - [Back/forward cache (bfcache): instant back and forward navigation](https://openpwa.net/reference/performance/bfcache/): How the back/forward cache stores a full in-memory snapshot of a page — including the JavaScript heap — so back and forward navigations can restore it instantly, why an unload listener can block eligibility in some browsers, and how to detect a bfcache restore with the pageshow event's persisted property. - [Code splitting with dynamic import() in a PWA](https://openpwa.net/reference/performance/code-splitting/): How dynamic import() splits a bundle so startup loads less JavaScript, what that does to INP and LCP, and where it cannot be used in a PWA. - [Core Web Vitals for PWAs: LCP, INP, and CLS](https://openpwa.net/reference/performance/core-web-vitals/): What LCP, INP, and CLS measure, their good/needs-improvement thresholds at the 75th percentile, field vs lab data, and the PWA-specific levers that move each metric. - [Font and image optimization: font-display, picture, and AVIF/WebP](https://openpwa.net/reference/performance/fonts-images/): How the font-display CSS descriptor controls text visibility while a web font loads, how the img loading and fetchpriority attributes and the picture element control image delivery, and how AVIF and WebP compress smaller than JPEG and PNG per MDN. - [Lighthouse PWA audits](https://openpwa.net/reference/performance/lighthouse/): Lighthouse audits pages for performance, accessibility and SEO. Its PWA category was removed, because those checks were tied to Chrome installability criteria. - [Navigation preload as a performance fix: starting the network request while the service worker boots](https://openpwa.net/reference/performance/navigation-preload/): Why service worker boot-up time (commonly around 50ms on desktop and up to several hundred ms on mobile per web.dev) adds to Time to First Byte for navigations, how enabling navigation preload starts the network request while the worker is still booting, and when it does and doesn't help. - [Precaching strategies: shipping the app shell ahead of time](https://openpwa.net/reference/performance/precaching/): How precaching populates the cache during service-worker install so a PWA's shell loads instantly and offline — what to precache vs runtime-cache, why content revisioning matters, and how Workbox's precache manifest automates it. - [Resource hints: rel="preload" and rel="preconnect"](https://openpwa.net/reference/performance/resource-hints/): The difference between fetching a specific resource early with rel="preload" and warming up a connection with rel="preconnect", the as/crossorigin attributes that make preload avoid a double fetch, and their Baseline widely-available support per MDN. - [Speculation Rules API: prefetching and prerendering likely next pages](https://openpwa.net/reference/performance/speculation-rules/): How a