Can I PWA?
Published
Compatibility is a BCD-style data explorer that answers “Can I use X in a PWA?” across operating systems, browsers, versions and, uniquely, country/region reach weighted by real-world browser share. It also covers the ecosystem-policy dimensions (ad networks, payments, store acceptance) that decide whether a capability is usable in production, not just whether it ships.
By featurePer-capability PWA support matrices: OS × browser × version.
By OSFeature × operating-system support pivot for PWA capabilities.
By browserFeature × browser-family support pivot for PWA capabilities.
Where does it work?Effective PWA reach weighted by real-world browser share, per country and region.
Will it ship?Ad, payment, and store-acceptance policy as first-class compatibility data.
Chinese vendor browsersPWA install, standalone display, service worker and Web Push in Huawei, Xiaomi, OPPO, UC, QQ Browser and the WeChat WebView, from vendor documentation only.
Features
Section titled “Features”Each feature has a canonical page with its OS × browser × version matrix, ecosystem policy rows, full provenance, and a machine-readable JSON export.
- Legend
- Yes
- Partial
- Flag
- No
- Unknown
| Feature | Category | Summary | Best support | Targets | Confidence |
|---|---|---|---|---|---|
| Async Clipboard API | Capabilities | Programmatic read/write access to the system clipboard via navigator.clipboard, gated by a user gesture or the clipboard-read/clipboard-write permission. | Yes | 9 | high |
| Background Fetch | Service Worker | The Background Fetch API lets a service worker hand off a long-running download (or upload) to the browser itself, which shows the user progress and a cancel control and wakes the service worker with an event once the operation settles. | Yes | 9 | high |
| Background Sync | Capabilities | Defer actions until the user has stable connectivity via the service worker. | Yes | 9 | high |
| Badging API | Engagement | Set an app-icon badge (count or dot) on the installed PWA. | Yes | 7 | medium |
| Chinese vendor browsers | Platforms | PWA behaviour in the Android browsers mainland Chinese users actually run: HarmonyOS Browser (Huawei), Mi Browser (Xiaomi), ColorOS Browser (OPPO), UC Browser, QQ Browser and the WeChat in-app WebView (XWeb), each for install to home screen, standalone display, service worker and Web Push. browser-compat-data has no data for any of them, so every row rests on vendor documentation; where no vendor statement exists the row says unknown rather than guessing. | Yes | 24 | low |
| Contact Picker | Device | The Contact Picker API lets a page ask the user to select one or more entries from their device contacts and share only the fields the site requested, without granting standing access to the address book. | Yes | 9 | high |
| EyeDropper API | Capabilities | The EyeDropper API opens a browser-supplied eyedropper from a user gesture and resolves with the sampled pixel's color in sRGBHex format, for use in custom color pickers. | Yes | 9 | high |
| File System Access API | Capabilities | Read and write to the user's local file system with explicit permission. | Yes | 7 | medium |
| Generic Sensor API | Capabilities | The Sensor APIs expose device sensors through a common design; support below is for the representative Accelerometer interface, which requires a secure context and a Permissions API grant. | Yes | 9 | high |
| Geolocation API | Capabilities | Read the user's geographic position with explicit permission, one-shot or via a watch. | Yes | 9 | high |
| getInstalledRelatedApps() | APIs | navigator.getInstalledRelatedApps() reports which related native or PWA apps declared in the manifest are already installed on the device. | Yes | 8 | low |
| Idle Detection API | Capabilities | The Idle Detection API's IdleDetector interface reports whether the user is active or idle and whether the screen is locked, gated behind the idle-detection permission and a 60-second minimum threshold. | Yes | 9 | high |
| Install Prompt (beforeinstallprompt) | Installation | Programmatic control over the PWA install prompt via the beforeinstallprompt event. | Yes | 7 | medium |
| Local Font Access | Capabilities | The Local Font Access API's window.queryLocalFonts() method returns the fonts installed on a user's device as FontData objects, gated behind a local-fonts permission prompt. | Yes | 9 | high |
| Manifest Protocol Handlers | Manifest | Register a PWA to handle custom or allow-listed URL protocols via manifest.protocol_handlers. | Yes | 7 | medium |
| manifest: file_handlers | Manifest | The file_handlers member registers an installed PWA with the OS as a handler for specific file types, delivered to the app via window.launchQueue. | Yes | 9 | high |
| manifest: id | Manifest | The id member provides a stable identity for a PWA, decoupled from start_url. | Yes | 9 | high |
| manifest: launch_handler | Manifest | The launch_handler member's client_mode controls whether launching the installed app reuses an existing window or opens a new one, and whether that window is navigated to the launch target URL. | Yes | 9 | high |
| manifest: scope_extensions | Manifest | The scope_extensions member lets an installed PWA's navigation scope span additional origins it owns, each verified via a .well-known/web-app-origin-association file. | Yes | 9 | high |
| manifest: share_target | Manifest | The share_target member registers the installed PWA as a target in the OS native share sheet. | Yes | 7 | low |
| manifest: shortcuts | Manifest | The shortcuts member adds quick-action entries to the OS context menu of an installed PWA. | Yes | 7 | low |
| Notification Triggers | Engagement | Notification Triggers was a proposed showTrigger option for ServiceWorkerRegistration.showNotification() that would schedule a notification to appear at a future time chosen by a TimestampTrigger; Chrome's own documentation says development of the feature has ended. | No | 1 | medium |
| Notification.permission / requestPermission() | Notifications | The three-state permission property and the method used to request it, per MDN's Limited-availability browser-compat data. Does not cover the separate Notification() constructor, which has its own Android restrictions. | Yes | 9 | medium |
| Payment Request API | Commerce | Browser-mediated checkout sheet collecting payment and contact details. | Yes | 7 | medium |
| Periodic Background Sync | Service Worker | The Periodic Background Sync API lets an installed PWA's service worker periodically synchronize data in the background, gated by installation and Chrome's site engagement heuristics. | Yes | 9 | high |
| Persistent Storage | Storage | navigator.storage.persist() requests protection from automatic data eviction. | Yes | 9 | high |
| Screen Wake Lock | Device | The Screen Wake Lock API lets a page request that the device's screen stay on and not dim or lock, releasing the lock automatically when the tab is hidden. | Yes | 10 | low |
| Service Workers | Capabilities | The programmable network proxy that powers offline, caching, and push for PWAs. | Yes | 7 | medium |
| Storage Buckets | Capabilities | The Storage Buckets API lets a page create multiple, separately named storage buckets via navigator.storageBuckets, each with its own IndexedDB, Cache, and quota-eviction policy, instead of sharing one origin-wide storage pool. | Yes | 5 | low |
| Trusted Web Activity availability | Installation | The Android mechanism that opens a verified web origin as a full-screen Chrome Custom Tab with Digital Asset Links verification; the generated package can be installed directly on a device or uploaded to the Play Store. | Yes | 1 | medium |
| Web App Manifest: categories | Manifest | The categories member lists app-store classifications for a web app; it is app-store metadata, not a browser-rendered feature, so browser compatibility does not apply. | Unknown | 6 | medium |
| Web App Manifest: description | Manifest | The description member is a string explaining what a PWA does; browsers and app stores that support it surface the text in install and app-listing UI. | Yes | 9 | high |
| Web App Manifest: display | Manifest | The display member chooses the installed app's window mode (standalone, fullscreen, minimal-ui, browser). | Yes | 7 | medium |
| Web App Manifest: display_override | Manifest | The display_override member provides a fallback chain of display modes, letting a PWA prefer newer modes while falling back to standard modes. | Yes | 9 | high |
| Web App Manifest: display_override "tabbed" mode | Manifest | The "tabbed" display_override value and the tab_strip member let an installed PWA present a tabbed document interface inside its own app window. | Yes | 9 | high |
| Web App Manifest: handle_links | Manifest | The handle_links member lets an installed PWA declare whether in-scope links should open inside the app; it is still a WICG proposal, and chromestatus.com tracks Chrome's own implementation as "On hold" with no shipping milestone recorded. | No | 1 | medium |
| Web App Manifest: icons | Manifest | The icons member supplies home-screen, task-switcher, and install-dialog imagery for a PWA. It also supports maskable icons that adapt to platform-specific shapes. | Yes | 8 | low |
| Web App Manifest: name / short_name | Manifest | The name and short_name members define how a PWA is labelled in install prompts, the app shelf, and the home screen. | Yes | 9 | high |
| Web App Manifest: orientation | Manifest | The orientation member sets the default screen orientation an installed web app launches and runs in. | Yes | 9 | high |
| Web App Manifest: prefer_related_applications | Manifest | prefer_related_applications is a boolean hint that a browser may use to favor installing one of the apps listed in related_applications over the web app itself. | Yes | 9 | high |
| Web App Manifest: related_applications | Manifest | related_applications lists native or store apps related to a PWA and backs Navigator.getInstalledRelatedApps(). The separate prefer_related_applications member has its own dataset (manifest-prefer-related-applications) since it is an independent manifest member with its own BCD entry. | Yes | 9 | high |
| Web App Manifest: scope | Manifest | The scope member fences the installed app's navigation boundary. | Yes | 7 | medium |
| Web App Manifest: screenshots | Manifest | The screenshots member supplies richer install UI in browsers and store listings. | Yes | 7 | medium |
| Web App Manifest: start_url | Manifest | The start_url member identifies the URL that loads when a user launches an installed PWA from the home screen or app shelf. | Yes | 9 | high |
| Web App Manifest: theme_color / background_color | Manifest | The theme_color and background_color members set the UI chrome color and the splash-screen/loading background color for an installed PWA. | Yes | 18 | high |
| Web Bluetooth API | Capabilities | The Web Bluetooth API lets a web app request access to nearby Bluetooth Low Energy (BLE) devices via navigator.bluetooth.requestDevice() and communicate with their GATT services. It is a WICG specification, not yet supported in Firefox or Safari. | Yes | 10 | high |
| Web Locks API | Capabilities | navigator.locks.request() lets scripts in a tab or worker acquire an exclusive or shared, origin-scoped lock to coordinate access to a shared resource. | Yes | 9 | high |
| Web NFC API | Capabilities | The Web NFC API lets a web app read and write NDEF messages to NFC tags via the NDEFReader interface. It is a W3C Community Group draft. | Yes | 9 | high |
| Web Push | Engagement | Server-sent push messages delivered via the Push API + service worker, even when the app is closed. | Yes | 7 | medium |
| Web Serial API | Capabilities | The Web Serial API lets a web app request access to a serial port via navigator.serial.requestPort() and read/write data to it. It is a WICG specification. | Yes | 9 | high |
| Web Share API | Capabilities | The Web Share API invokes the platform-native share sheet so users can share text, URLs, or files from a PWA. Share Target (receiving shared content via manifest share_target) is scoped separately; its browser-compat-data coverage is not yet tracked in MDN BCD. | Yes | 9 | high |
| WebAPK availability | Installation | The mechanism Chrome uses to install PWAs as real Android apps with their own package identity, splash screen, and deep-link registration. | Yes | 1 | medium |
| WebAuthn / PublicKeyCredential | Capabilities | PublicKeyCredential lets a PWA register and authenticate users with public-key credentials via platform or roaming authenticators instead of passwords. Per MDN, a passkey is a discoverable WebAuthn credential built on this same PublicKeyCredential API — this matrix reflects baseline PublicKeyCredential availability. | Yes | 9 | high |
| WebCodecs API | Capabilities | The WebCodecs API gives web apps low-level, hardware-accelerated access to encode and decode individual video frames and audio chunks via VideoEncoder, VideoDecoder, AudioEncoder, and AudioDecoder. It is a W3C specification. | Yes | 18 | high |
| WebGPU | Capabilities | WebGPU exposes GPU rendering and compute to the web via navigator.gpu.requestAdapter()/requestDevice() and the WGSL shading language. It is a W3C specification. | Yes | 9 | high |
| WebHID API | Capabilities | The WebHID API lets a web app request access to non-standard Human Interface Devices via navigator.hid.requestDevice() and exchange input/output/feature reports with them. It is a WICG specification. | Yes | 9 | high |
| WebRTC (RTCPeerConnection) | Capabilities | Establish real-time peer-to-peer audio, video, and data connections directly between browsers. | Yes | 9 | high |
| WebTransport | Networking | WebTransport is a web API for flexible, low-latency, bidirectional client-server messaging over HTTP/3, offering both reliable streams and unreliable, UDP-like datagrams over a single connection. | Yes | 9 | high |
| WebUSB API | Capabilities | The WebUSB API lets a web app request access to non-standard USB devices via navigator.usb.requestDevice() and communicate with them directly. It is a WICG specification, not yet supported in Firefox or Safari. | Yes | 10 | high |
| Window Management | Capabilities | The Window Management API lets a page discover the screens attached to a device (window.screen.isExtended) and, after a permission prompt, get per-screen details to place windows precisely (Window.getScreenDetails()). | Yes | 9 | high |
Compatibility data is rendered from machine-readable JSON and exposed as Dataset
JSON-LD, with a per-feature JSON export at /compatibility/<feature>.json so search and
LLMs can quote the source.