NeccessoryNeccessory
Web SDK

Browser Support & Performance

Supported browsers, the secure-context requirement, and performance notes.

Supported browsers

The Web SDK runs on recent versions of Chrome, Edge, Firefox, and Safari. It requires WebAssembly and Web Worker support, which all of these provide.

Secure context is mandatory

Browsers only grant camera access in a secure context — HTTPS or localhost. Serving the page over plain http:// on a remote host makes camera access fail. For local development:

npx serve .
# or
python -m http.server 8080

Both give you localhost, which satisfies the requirement.

Performance

The two tiers have opposite performance profiles, and it is worth knowing which one you are shipping.

On-device

Every inference runs locally in the browser using WebAssembly and Web Workers, so there is no network round-trip during the measurement — only for optionally submitting the final result, and only after it is finished. Nothing about the capture leaves the page. The cost is CPU: on low-end devices the pipeline is more CPU-bound, so a measurement may take slightly longer to stabilize.

Cloud

Only face tracking runs in the browser; pulse recovery and every metric run on our servers. That makes the measurement far cheaper on the device — about 6.9 MB of assets instead of 45 MB, and no heavy inference loop — but it puts the network on the critical path in two ways:

  • Bandwidth. Face crops go out continuously at roughly 117 KB/s. A network that cannot hold that rate degrades the measurement, or trips the fallback to a batch upload.
  • Latency. Live metrics arrive one round-trip behind the capture instead of immediately.

In cloud mode, images of the face are transmitted

The statement above about nothing leaving the page describes the on-device tier only. In cloud mode the browser sends cropped images of the face to our servers for the whole duration of the capture. Read Cloud privacy before choosing that tier.

In both tiers, guide the user to good lighting and stillness for the fastest, cleanest result. See Requirements.

Troubleshooting

  • Camera never opens — confirm HTTPS or localhost, and that another app isn't holding the camera.
  • No result — the capture isn't accumulating clean signal; watch the live signal quality and improve lighting and stillness.
  • Stuck on loading models — cdn.jsdelivr.net is blocked by the network or by your page's CSP; both tiers load the face tracker from there. See Requirements.
  • onError fires — read err.message; check your key and, if submitting to the API, your device clock (±300 s window).