This survey closed on August 31, 2025.

Access files and directories on the user's local device and create writable files that can be updated.

js
const handle = await window.showSaveFilePicker();
const writable = await handle.createWritable();
await writable.write("Hello, world!");
await writable.close();
Tell us more:
Tell us more:
Tell us more:

Exposes a mechanism for sharing content to various user-selected targets.

js
navigator.share(shareData)
Tell us more:
Tell us more:
Tell us more:

Lets a PWA receive data (text, files, URLs) shared from other apps via the system share dialog.

json
"share_target": {
  "action": "/share",
  "method": "POST",
  "enctype": "multipart/form-data",
  "params": {
    "title": "title",
    "text": "text",
    "url": "url",
    "files": [{ "name": "image", "accept": ["image/*"] }]
  }
}
Tell us more:
Tell us more:
Tell us more:

Allows PWAs to register themselves as handlers for certain file types.

manifest.json
"file_handlers": [{
    "action": "/open-file",
    "accept": {
      "image/svg+xml": ".svg",
      "image/png": ".png"
    }
  }]
Tell us more:
Tell us more:
Tell us more:

Lets a web app register itself as the handler for certain protocols (like mailto: or web+custom:).

js
navigator.registerProtocolHandler("mailto", "https://fancywebmail.com/?compose=%s");
Tell us more:
Tell us more:
Tell us more:

Connect to and communicate with nearby Bluetooth Low Energy (BLE) devices.

js
const device = await navigator.bluetooth.requestDevice({ filters: [{ services: ["heart_rate"] }] });
Tell us more:
Tell us more:
Tell us more:

Directly communicate with USB devices, enabling data exchange without drivers or native apps.

js
const device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x2341 }] });
await device.open();
Tell us more:
Tell us more:
Tell us more:

API that converts microphone input to text.

js
const rec = new SpeechRecognition();
rec.lang = "en-US";
rec.addEventListener("result", e => console.log(e.results[0][0].transcript));
rec.start();
Tell us more:
Tell us more:
Tell us more:

Enables a consistent, secure way for websites to request payments using the browser’s native UI.

js
const request = new PaymentRequest(
  [{ supportedMethods: "basic-card" }], 
  { total: { label: "Total", amount: { currency: "USD", value: "9.99" } } }
);
let response = await request.show();
response.complete("success"));
Tell us more:
Tell us more:
Tell us more:

Read from and write to NFC tags using a device’s built-in NFC reader.

js
const reader = new NDEFReader();
await reader.scan();
reader.onreading = e => console.log(e.message.records);
Tell us more:
Tell us more:
Tell us more:

Issues around accessing device or OS capabilities, interacting with the file system, matching native app feature sets, etc.
State of HTML 2025