ONNX Runtime just deprecated WebGL and JSEP. Read the changelog, not the WebNN press release.

#on-device #webgpu #webnn #onnxruntime #npu

ONNX Runtime v1.29.0 shipped yesterday with a one-line breaking change that ends a four-year era:

onnxruntime-web has announced the deprecation of WebGL and JSEP. The native WebGPU EP is the recommended path going forward. See the deprecation and migration plans for details (#29716, #31683).

If you're running ONNX in a browser today you are almost certainly on one of these two. WebGL was the original path — inference smuggled through fragment shaders, because that was the only compute a browser would give you. JSEP was the clever bridge: a JavaScript Execution Provider that let the WASM build call out to a JS-implemented WebGPU backend, shipped years before a native WebGPU EP existed.

Both were workarounds for a missing primitive. The primitive exists now, so they're going away. Migration plans are in #29716 and #31683, and this is a real one — start it.

Count the changelog lines

Today, W3C published WebNN as a Candidate Recommendation Draft. The framing in most coverage will be "browser NPU access is arriving." I'd read the ONNX Runtime changelog before believing it, because that document is the best available signal for where the engineering hours actually go.

Here is the WebNN EP section of v1.29.0, in full:

Added uint8-packed 4-bit GatherBlockQuantized and LpNormalization, reused the shared WASM loader for Blob-backed external data, and fixed per-axis QDQ and MatMulNBits edge cases.

One sentence. Now the WebGPU EP section, abbreviated:

AreaWhat landed in v1.29.0
New operatorsDFT, HardSwish, Max/Min, Trilu, GRU, PRelu, MatMulBnb4, MRotaryEmbedding
Integer supportExpanded across Clip, Reshape, Cast, Add, Tile, Concat, Expand, Gather, CumSum, Max, Min
AttentionInitial WebGPU PagedAttention implementation; Softmax and non-flash Attention moved to online algorithms
PrecisionMatMulNBits wide-tile accumulation precision
Vendor kernelsIntel subgroup-matrix MatMul/Gemm, including f16, batched-B and odd-N
LatencyDeferred dispatch and staging-buffer work to cut cold-start; tuned FlashAttention, subgroup Gemm/MatMul, Split-K on Panther Lake, Xe im2col-matmul
ReliabilityDawn upgrade plus four separate fixes

That's roughly thirty changes against one. PagedAttention in a browser is a serious piece of work — someone is building for long-context LLM inference on the client, and they are building it on WebGPU compute shaders, not on WebNN.

Why a graph API can't win this workload

The structural reason is the same one that pushed ExecuTorch toward custom Metal.

WebNN is a graph API: you describe a network, hand it to the browser, and the browser decides how to run it — possibly on an NPU. That's a good fit for a fixed vision or audio graph. It's a bad fit for an autoregressive decoder, where you need a growing KV cache, paged allocation, dynamic sequence lengths, and the ability to write your own attention kernel. A graph API where you don't control the kernels cannot give you PagedAttention, and PagedAttention is what makes client-side long context tractable.

Honest state of browser ML, August 2026: WebGPU is the answer for LLM inference on the client, and it is now the only supported answer in the largest browser runtime. WebNN is a standards-track API for a different workload, and CR Draft status tells you about spec maturity, not about NPU access you can ship against.

Two more things, if you're on mobile rather than web

The Qualcomm QNN EP got exactly one item this cycle: "QNN added a reshape handler for split-axis reshapes." XNNPACK got one: dynamic Gemm M read from the input tensor at compute time. There is no Core ML EP item and no NNAPI item anywhere in v1.29.0 — I read the full notes rather than inferring from a search.

Meanwhile the Arm story is where the mobile-relevant work actually landed. MLAS picked up:

Arm64 half-precision GEMM and convolution support through KleidiAI, including FP16 MatMul/Gemm/Conv paths and asymmetric Q4 and SME2 MatMulNBits kernels

SME2 kernels for Q4 matmul is the line that matters for phone-class inference, and it's on the CPU, not the NPU.

The pattern across this release and the ExecuTorch one is consistent enough to state plainly: for LLM decode, the vendor-managed abstraction layers — WebNN, NNAPI, Core ML, QNN — are getting maintenance, and the paths where you control the kernel are getting the investment. If your on-device roadmap assumes an NPU delegate will absorb your transformer workload, this is a good week to re-examine that assumption.

Separately, worth flagging: v1.29.0 enabled POSIX telemetry on Linux, macOS, Android and iOS for builds compiled with telemetry on. ORT_DISABLE_TELEMETRY=1 before initialization turns it off. WASM stays telemetry-free. Check what your build flags do.