Skip to content

PWA Resources and Specifications

This page is a curated, verified index of the primary sources behind Progressive Web Apps: the specifications and their maturity as of September 2026, the IETF RFCs behind Web Push, official documentation from each browser vendor, the trackers that tell you what ships where, the standards-position repositories that tell you what will ship, and the tools, libraries and books worth your time. Every link was checked in September 2026. Use it when you need the authoritative answer rather than a summary, and pair it with the API Cheat Sheet and the Manifest Cheat Sheet for quick lookups.

Key takeaways

  • Only a few PWA specs are mature. The Web Share API is a W3C Recommendation and Service Workers is a Candidate Recommendation Draft. The Web App Manifest, Push API and Badging API are Working Drafts, and Notifications, Storage, File System and Cookie Store are WHATWG Living Standards.
  • Background Sync, Periodic Background Sync, Background Fetch, Window Controls Overlay, Launch Handler, Get Installed Related Apps and Storage Buckets are WICG Community Group drafts. In practice that means shipped by Chromium only.
  • Web Push rests on four IETF RFCs: 8030 (the push protocol), 8291 (payload encryption), 8292 (VAPID) and 8188 (the aes128gcm content encoding).
  • For "does it work in browser X?", check MDN's browser-compat-data (which also powers caniuse's API tables), Web Platform Status and the vendors' release notes. For "will it ever work?", read the Mozilla and WebKit standards-positions repositories.
  • Positions that shape PWA design today: WebKit opposes beforeinstallprompt and the Web Install API. Mozilla is negative on Background Sync, Periodic Background Sync and Get Installed Related Apps. Both engines support Service Worker Static Routing.
  • Workbox (7.4.1), vite-plugin-pwa (1.3.0) and Serwist (9.5.12) are the actively maintained service worker toolkits, and web-push is the reference Node.js push library. Lighthouse removed its PWA category in version 12.0.

How to read a specification's status

A specification's maturity level tells you how stable its API is and how many engines have committed to it. It does not tell you what ships. Some Recommendations are implemented in only one engine, and some Community Group drafts ship in browsers that hold most of the market. Read the status together with the support data and the standards positions below.

Status Published by What it means for you
W3C Recommendation (REC) W3C Working Group Stable, with at least two interoperable implementations shown during review. Changes are rare and backward compatible
Candidate Recommendation Draft / Snapshot (CRD / CR) W3C Working Group Feature-complete in the group's view and waiting for implementation experience. The API is unlikely to change in incompatible ways
Working Draft (WD) W3C Working Group Under active development on the Recommendation track. Members and algorithms can still change
Editor's Draft (ED) Spec editors (GitHub Pages) The latest text, often ahead of the dated /TR/ snapshot. Read it when you care about current behavior, and cite the dated version when you need a stable reference
Living Standard WHATWG Continuously updated with no version numbers. The text reflects what implementers agreed to ship. Treat the current text as authoritative
Draft Community Group Report (CG-DRAFT) WICG and other Community Groups Incubation. No standards-track commitment and no patent commitments from non-participants. Often implemented only by the engine that proposed it
Group Note W3C Working Group Published for reference, not on the Recommendation track (for example, Web App Manifest - Application Information)
Explainer / unofficial draft Anyone (often a browser vendor) A proposal document. Expect breaking changes, and never build a core flow on it

Dated snapshot versus editor's draft

W3C /TR/ URLs (for example https://www.w3.org/TR/service-workers/) always point to the latest published snapshot. The editor's draft on w3c.github.io can be weeks or months ahead. When the two disagree about an algorithm, browsers usually follow the editor's draft. File spec bugs against the GitHub repository linked from the draft's header.

Core PWA specifications

Status as of September 2026, read from each document's header. "Pages on this site" links to the deep dives.

Specification Status What it defines Links Pages on this site
Service Workers W3C CRD, 17 September 2026 (Web Applications WG) Registration, scope, lifecycle, fetch interception, Clients, Cache Storage, navigation preload, Static Routing (addRoutes()) TR · ED · GitHub Lifecycle, Cache Storage API, Static Routing API
Web Application Manifest W3C WD, 13 August 2026 (Web Applications WG) The manifest format, display, scope, start_url, id, icons, shortcuts, display-mode media feature, processing algorithm TR · ED · GitHub Members Reference, App Identity & Updates
Web App Manifest - Application Information W3C Group Note, 21 August 2023 description, screenshots, categories, iarc_rating_id TR · ED Rich Install UI
Manifest Incubations WICG CG-DRAFT Members Chromium ships ahead of standardization: protocol_handlers, file_handlers, share_target, note_taking, tab_strip, scope_extensions and the BeforeInstallPromptEvent Draft Advanced & Integration Members
Push API W3C WD, 1 December 2025 (Web Applications WG) PushManager, PushSubscription, push and pushsubscriptionchange events TR · ED · GitHub Push Notifications
Notifications API WHATWG Living Standard Notification, showNotification(), NotificationEvent, permission model Standard Notifications API
Badging API W3C WD, 27 April 2026 setAppBadge(), clearAppBadge() TR · ED Badging API
Web Share API W3C Recommendation, 30 May 2023 navigator.share(), navigator.canShare() TR · ED Web Share API
Web Share Target Unofficial draft (Web Applications WG repository) The manifest share_target member Draft Web Share Target
Web Background Synchronization WICG CG-DRAFT, 10 November 2021 SyncManager, sync event Draft Background Sync
Web Periodic Background Synchronization WICG CG-DRAFT, 12 April 2021 PeriodicSyncManager, periodicsync event Draft Periodic Background Sync
Background Fetch WICG CG-DRAFT, 21 April 2021 BackgroundFetchManager and its events Draft Background Fetch
Storage Standard WHATWG Living Standard Storage keys, buckets, navigator.storage, persistence, quota Standard Storage Quotas & Persistence
Storage Buckets API WICG CG-DRAFT, 19 December 2023 navigator.storageBuckets Draft Storage Quotas & Persistence
File System Standard WHATWG Living Standard FileSystemHandle, the origin private file system, sync access handles Standard Origin Private File System
File System Access WICG CG-DRAFT, 10 October 2025 showOpenFilePicker(), showSaveFilePicker(), showDirectoryPicker() Draft File System Access
Cookie Store API WHATWG Living Standard cookieStore, CookieStoreManager, cookiechange Standard API Cheat Sheet
Window Controls Overlay WICG CG-DRAFT navigator.windowControlsOverlay, titlebar-area-* environment variables Draft Window Controls Overlay
Web App Launch Handler API WICG CG-DRAFT launch_handler, window.launchQueue Draft Protocol Handlers & Launch Handling
Get Installed Related Apps API WICG CG-DRAFT, 8 March 2021 navigator.getInstalledRelatedApps() Draft Detecting Installed Apps
Content Index WICG Editor's Draft, 13 April 2021 registration.index Draft API Cheat Sheet
Web Install API Explainer (Microsoft Edge team) plus the WICG <install> element navigator.install(), <install> Explainer · <install> Install Prompts & Custom UI
Isolated Web Apps WICG explainers Signed web bundles, stricter security model, extra capabilities Repository Isolated Web Apps

A few notes on this table:

  • The Service Workers /TR/ page is titled "Service Workers Nightly". The Working Group publishes the full, current feature set, including Static Routing and InstallEvent.addRoutes(), as the Candidate Recommendation Draft. An older "Service Workers 1" document covered only the original core, so cite the nightly draft for modern behavior.
  • beforeinstallprompt is not in the main manifest specification. It lives in Manifest Incubations and is implemented only by Chromium. A pull request to move it into the Web Application Manifest led to position requests at both other engines: WebKit opposes it and Mozilla has not taken a position (see the table of positions below).
  • The Push API and Notifications API move independently. Declarative Web Push, which Safari ships, was proposed as a pull request to the Push API. Mozilla's position on it is positive.

The IETF RFCs behind Web Push

The browser side of push is the Push API. The server side, which your code talks to when it sends a message, is defined by four IETF RFCs. Every push service (Firebase Cloud Messaging for Chrome, Mozilla's autopush for Firefox, Apple Push Notification service for Safari, Windows Push Notification Services for Edge) implements them.

RFC Title What you need from it
RFC 8030 Generic Event Delivery Using HTTP Push The request your server sends: POST to the subscription endpoint, the TTL, Urgency and Topic headers, and the 201 Created, 404 and 410 Gone responses
RFC 8291 Message Encryption for Web Push ECDH (P-256) plus HKDF key derivation using the subscription's p256dh and auth keys, and why usable payloads stay under about 4 KB (RFC 8030 only requires push services to accept 4,096 bytes)
RFC 8292 Voluntary Application Server Identification (VAPID) for Web Push The Authorization: vapid t=<JWT>, k=<public key> header, the JWT claims (aud, exp of at most 24 hours, sub), and why applicationServerKey must match
RFC 8188 Encrypted Content-Encoding for HTTP The aes128gcm record format that RFC 8291 payloads use (Content-Encoding: aes128gcm)

Apple documents its extra constraints and error responses in Sending web push notifications in web apps and browsers. How these fit together, with a byte-level walkthrough, is on The Web Push Protocol.

PWAs lean on general-purpose specifications that are not PWA-specific. These are the ones this site cites most often:

Specification Status (September 2026) Why it matters to a PWA
Fetch Standard WHATWG Living Standard Request, Response, request modes and destinations, CORS and opaque responses: everything a fetch handler touches
HTML Standard WHATWG Living Standard Workers, postMessage(), user activation, registerProtocolHandler(), navigation, bfcache
Permissions W3C WD, 6 October 2025 navigator.permissions.query() and the permission names used by notifications, push and sync
Media Session W3C WD, 5 June 2026 Lock screen and hardware media controls for audio and video apps
Screen Wake Lock API W3C WD, 24 October 2024 Keeping the screen on in recipe, navigation and presentation apps
Web Locks API W3C WD, 24 September 2025 Coordinating tabs and the service worker (for example, one sync writer at a time)
Web-based Payment Handler API W3C WD, 23 April 2026 Service-worker-based payment apps (formerly "Payment Handler API"; the old /TR/payment-handler/ URL redirects)

Browser vendor documentation

Vendor documentation is the best source for behavior that the specs leave to the browser: install criteria, quotas, prompts and platform quirks.

MDN Web Docs

MDN is the cross-browser reference. Its compatibility tables come from the same browser-compat-data project that this site uses for version numbers.

web.dev and Chrome for Developers

Google's two developer sites split the work. web.dev holds cross-browser guidance and courses. developer.chrome.com holds Chrome-specific capabilities, DevTools, Workbox and release notes.

WebKit and Apple

Apple documents web apps mostly through the WebKit blog and the Safari release notes. There is no single "PWA" guide, so these pages are the primary sources for anything about iOS, iPadOS and macOS.

Microsoft Edge

Microsoft drives much of the desktop PWA work (Window Controls Overlay, protocol handling, the Web Install API) and documents it well.

Android and Firefox tooling

Browser support and status trackers

Different trackers answer different questions. The version numbers on this site come from MDN's browser-compat-data (release 8.1.3, published September 24, 2026) and the vendors' release notes.

Tracker Answers Notes
MDN browser-compat-data "Which version shipped member X, and with what caveats?" Machine-readable JSON, also published to npm as @mdn/browser-compat-data. Records flags, partial implementations and removals
Can I use "What share of users can use X?" Combines its own feature tables with BCD-derived API tables, and adds usage statistics
Web Platform Status "Is X Baseline, and since when?" Google-run dashboard built on the web-features project, with Baseline status and web-platform-tests pass rates
Baseline "Can I use X without a fallback?" Newly available means supported in the current versions of all major engines. Widely available means 30 months after that
Chrome Platform Status "When will Chromium ship X, and what did other engines say?" Every Blink intent (prototype, experiment, ship), origin trial dates and links to standards positions. The roadmap shows upcoming milestones
WebKit Feature Status "Is WebKit working on X?" Less detailed than Chrome Platform Status; the Safari release notes are more precise
web-platform-tests dashboard "Do engines actually pass the tests for X?" Test results per engine. The Interop 2026 dashboard tracks the focus areas the engines agreed to improve this year
Release notes: Chrome, Safari, Firefox, Edge "What changed in version N?" The primary source when BCD hasn't caught up yet

Two caveats apply. BCD records when an API became available, which is not always when it became usable: iOS Push, for example, is recorded as 16.4 but works only in Home Screen web apps. And support in "Chrome" usually carries over to Edge, Opera and Samsung Internet at the same Chromium version, but not always. Samsung Internet, for instance, tracks Chromium with a delay and its own feature choices.

Checking support from a script

When you maintain a support table, query browser-compat-data directly instead of copying numbers by hand. This Node.js script prints the first supporting version per browser for any list of BCD paths, and flags partial, prefixed and flagged support:

scripts/support.mjs
// Usage: npm i -D @mdn/browser-compat-data
//        node scripts/support.mjs api.PushManager api.Navigator.setAppBadge api.InstallEvent.addRoutes
import bcd from "@mdn/browser-compat-data" with { type: "json" };

const BROWSERS = ["chrome", "chrome_android", "edge", "firefox", "firefox_android", "safari", "safari_ios"];

function lookup(path) {
  // Walk "api.PushManager.subscribe" down the BCD tree.
  return path.split(".").reduce((node, key) => node?.[key], bcd)?.__compat;
}

function describe(statement) {
  if (!statement) return "?";
  // A browser may have several statements (e.g. prefixed, then unprefixed); the first is current.
  const s = Array.isArray(statement) ? statement[0] : statement;
  if (s.version_added === false) return "no";
  if (s.version_removed) return `removed ${s.version_removed}`;
  const notes = [s.partial_implementation && "partial", s.prefix && `prefix ${s.prefix}`, s.flags && "flag"]
    .filter(Boolean);
  return `${s.version_added}${notes.length ? ` (${notes.join(", ")})` : ""}`;
}

const paths = process.argv.slice(2);
if (paths.length === 0) {
  console.error("Pass one or more BCD paths, for example api.PushManager");
  process.exit(1);
}

console.log(`BCD ${bcd.__meta.version} (${bcd.__meta.timestamp.slice(0, 10)})`);
for (const path of paths) {
  const compat = lookup(path);
  if (!compat) {
    console.log(`${path}: not found in BCD`);
    continue;
  }
  const row = BROWSERS.map((b) => `${b}=${describe(compat.support[b])}`).join("  ");
  const flags = [compat.status?.experimental && "experimental", compat.status?.deprecated && "deprecated"]
    .filter(Boolean).join(", ");
  console.log(`${path}${flags ? ` [${flags}]` : ""}\n  ${row}`);
}

The script needs Node.js 22 or later for the with { type: "json" } import attribute. Run it in CI after each BCD release and compare the output with your documentation, so support tables don't silently go stale.

Standards positions and design reviews

Chromium ships many PWA capabilities first. Whether the other engines follow depends on their published positions, which are the best predictor of cross-browser support you have.

Positions on PWA-related proposals, read from both repositories in September 2026:

Proposal Mozilla WebKit
Service Worker Static Routing positive support (shipped in Safari 27)
Declarative Web Push positive Proposed and shipped by WebKit
Badging API positive Shipped (Safari 17 and iOS 16.4)
Web Share Target positive neutral
Cookie Store API Shipped (Firefox 140); maxAge positive support; maxAge support
Screen Wake Lock positive support
Storage Buckets positive no position
Web Background Synchronization negative no position
Periodic Background Sync negative No issue
Background Fetch no position no position
Get Installed Related Apps negative No issue
File System Access (pickers) negative oppose
File Handling defer No issue
URL protocol handlers for web apps defer No issue
Window Controls Overlay defer no position
Web App Launch Handling no position no position
Tabbed web apps defer no position
Isolated Web Apps negative blocked
BeforeInstallPromptEvent in the manifest spec no position oppose
Web Install API / <install> no position oppose
Web App Manifest - Application Information No issue oppose (the screenshots member)

How to use this table: a negative or oppose position means you should design the feature as a Chromium-only enhancement indefinitely, as with Background Sync, where an IndexedDB outbox with an in-page retry is the real mechanism and sync is a bonus. Defer and no position mean nobody has done the work to decide yet. A positive or support position does not promise an implementation date. Mozilla's positive position on Static Routing, for example, has not yet produced a Firefox release.

Tools and libraries

Versions are the latest on npm as of late September 2026. Check each project's changelog before upgrading across a major version.

Tool Purpose Latest Links Page on this site
Workbox Google's service worker libraries: routing, strategies, precaching, expiration, background sync queue; build plugins for webpack and CLI workbox-build 7.4.1 (May 2026) Docs · GitHub Workbox Fundamentals, Advanced Workbox
vite-plugin-pwa Zero-config PWA plugin for Vite (manifest, Workbox-generated or custom service worker, update prompts) with framework integrations 1.3.0 (May 2026) Docs · GitHub Vite PWA Plugin
Serwist A Workbox-derived service worker toolkit with first-class Next.js and bundler integrations serwist 9.5.12 (July 2026) Docs · GitHub Framework Integrations
@angular/service-worker Angular's built-in, configuration-driven service worker (ngsw-config.json) 22.2.0 (September 2026) Docs Framework Integrations
PWABuilder Microsoft's tool to validate a PWA and package it for the Microsoft Store (MSIX) and Google Play (TWA), with a community-maintained iOS wrapper template Web service Site · Docs PWABuilder
Bubblewrap Google's CLI for generating and building Trusted Web Activity Android projects @bubblewrap/cli 1.25.0 (July 2026) GitHub Trusted Web Activity
Lighthouse Performance, accessibility and best-practice audits. The PWA category was removed in 12.0 13.5.0 (September 2026) GitHub · Docs Lighthouse & Auditing
web-push (Node.js) VAPID signing and RFC 8291 payload encryption for sending pushes 3.6.7 (January 2024) GitHub The Web Push Protocol
pywebpush, web-push-php, webpush-java The same functionality for Python, PHP and Java, from the web-push-libs organization See each repository pywebpush · web-push-php · webpush-java Push Notifications
idb A tiny promise wrapper for IndexedDB, usable in service workers 8.0.3 (May 2025) GitHub IndexedDB
pwa-asset-generator Generates icons, Apple touch icons and iOS splash screens from one source image with Puppeteer 8.1.7 (September 2026) GitHub Icons & Maskable Icons
@vite-pwa/assets-generator Icon and splash generator from the vite-pwa project 2.0.0 (September 2026) Docs Splash Screens & Theming
Maskable.app In-browser editor and previewer for maskable icon safe zones Web app Site Icons & Maskable Icons
Playwright Browser automation; its service worker APIs (inspecting workers and their network requests) work only in Chromium See docs Service workers guide Automated Testing

Maintenance signals

A package's latest release date is a rough health signal, not a verdict. web-push's last release was in January 2024, but the protocol it implements hasn't changed since the RFCs were published. A service worker toolkit that stops tracking browser changes, such as Static Routing, pushsubscriptionchange in Chrome 138 or module service workers in Firefox 147, ages much faster.

Learning resources and demos

Beyond the specs and vendor references, these resources are worth reading in full:

  • The Offline Cookbook by Jake Archibald: the original catalog of caching strategies (cache-first, network-first, stale-while-revalidate and variations). Every strategy page on the web, including Caching Strategies, descends from it.
  • The service worker lifecycle, also by Jake Archibald: still the clearest explanation of why the waiting phase exists.
  • Web Push Book by Matt Gaunt: a free online book on the push flow from subscription to server, including the encryption steps.
  • Learn PWA on web.dev: a course that goes from basics to capabilities.
  • What PWA Can Do Today: a PWA that demonstrates capabilities live, so you can test a device's support by installing it.
  • Project Fugu API Showcase: production apps that use Chromium capability APIs.
  • Going Offline, read online: Jeremy Keith's book on service workers, now free to read on the web.

Books

Books on PWAs were mostly published between 2017 and 2020. Their explanations of the lifecycle, caching and the manifest are still sound. Their browser support statements, install criteria and push details are not: iOS had no service workers when the earliest of them were written. Read them for concepts and check APIs against MDN.

Title Author Publisher, year Notes
Going Offline Jeremy Keith A Book Apart, 2018 A short, careful introduction to service workers and offline pages. Free to read online
Progressive Web Apps Jason Grigsby A Book Apart, 2018 The business case and the design decisions (when to go offline-first, how to ask for permissions) rather than API detail
Progressive Web Apps Dean Alan Hume Manning, 2017 A hands-on introduction to service workers, caching, the manifest and push, with a foreword by Addy Osmani
Building Progressive Web Apps: Bringing the Power of Native to the Browser Tal Ater O'Reilly Media, 2017 Builds a single sample app through every PWA feature available at the time
Progressive Web Application Development by Example Chris Love Packt, 2018 Example-driven, from the same period
Progressive Web Apps with Angular Majid Hajian Apress, 2019 @angular/service-worker in depth. The Angular APIs have changed since, so pair it with the current Angular docs
Learning Progressive Web Apps John M. Wargo Addison-Wesley A broad introduction that also covers tooling

Keeping this knowledge current

PWA support changes with every browser release. Chrome moved from a four-week to a two-week release cycle with Chrome 153 on September 8, 2026 (the Extended Stable channel stays at eight weeks). Firefox ships roughly every four weeks, and Safari ships a major version each September plus point releases during the year. A sustainable routine:

  1. Subscribe to the release notes of Chrome, Safari, Firefox and Edge (the links are in the trackers table). Search each one for "service worker", "manifest", "push", "notification" and "badge".
  2. Re-run your support script against each new browser-compat-data release, and diff the output against your documentation.
  3. Watch Chrome Platform Status for Intent to Ship and Intent to Deprecate posts that affect you. Background Fetch's November 2025 intent to deprecate and the Web Install API's 2026 intent to ship were both posted to blink-dev. Intents are proposals, not outcomes: as of Chrome 154, Background Fetch still ships, now with CORS enforcement and a Chrome 149 restriction on jobs started from a service worker.
  4. Watch the standards-positions repositories for the proposals in the positions table. A change from no position to positive is the earliest signal that another engine may implement.
  5. Test on real devices, particularly iOS Home Screen apps, whose behavior no desktop emulator reproduces. The Browser DevTools page covers remote debugging.

The site's History & Evolution page records when each capability shipped, and the Production Checklist turns current support into a release checklist.

Further reading

On this site

External references