Testing

WASM Threads: Browser Support, Atomics, COOP/COEP

WASM threads work in Chrome 74+, Edge 79+, Firefox 79+, Safari 14.1+ on macOS, and Safari 14.5+ on iOS. Learn the atomics, COOP/COEP, and known issues.

Author

Prince Dewani

May 1, 2026

WASM threads are a W3C WebAssembly proposal that adds shared linear memory and atomic instructions so Wasm modules run on multiple CPU cores through Web Workers. They work in Chrome 74+, Edge 79+, Firefox 79+, Opera 62+, Safari 14.1+ on macOS, and Safari 14.5+ on iOS, while Internet Explorer and Opera Mini do not support them.

This guide covers what WASM threads are, browsers that support them, how they work, how to enable them, use cases, and known issues.

What is WASM Threads?

WASM threads is a WebAssembly extension from the W3C WebAssembly Working Group that adds shared linear memory and atomic memory instructions. The browser runs each Wasm thread inside a Web Worker and shares one SharedArrayBuffer-backed memory between them so a Wasm module can use real parallelism.

Which browsers does WASM Threads support?

Every major engine ships WASM threads on desktop and mobile, with global usage near 95%, but every browser still requires the page to be cross-origin isolated through COOP and COEP before SharedArrayBuffer is exposed.

Loading browser compatibility data...

WASM Threads compatibility in Chrome

Chrome supports WASM threads from Chrome 74+ on Windows, macOS, Linux, ChromeOS, and Android. Chrome 70 to 73 had threads disabled by default behind the chrome://flags/#enable-webassembly-threads flag. Chrome 4 to 69 did not support WASM threads at all. Cross-origin isolation through COOP and COEP became mandatory for SharedArrayBuffer in Chrome 92+ on desktop.

WASM Threads compatibility in Edge

Microsoft Edge supports WASM threads from Edge 79+ on Windows, macOS, and Linux, the first Chromium-based Edge build. Pre-Chromium EdgeHTML 12 to 18 and Internet Explorer never added WASM threads. Edge enforces the same COOP and COEP cross-origin isolation rule that Chrome does before SharedArrayBuffer is exposed.

WASM Threads compatibility in Firefox

Firefox supports WASM threads from Firefox 79+ on Windows, macOS, Linux, and Android. Firefox 57 to 78 had SharedArrayBuffer disabled after the Spectre disclosure, so threads only worked behind a flag. Firefox now requires Cross-Origin-Opener-Policy: same-origin and Cross-Origin-Embedder-Policy: require-corp before any page can use SharedArrayBuffer or WASM threads.

WASM Threads compatibility in Safari

Safari supports WASM threads from Safari 14.1+ on macOS Big Sur and later, and from Safari 14.5+ on iOS and iPadOS. Safari 11 to 14.0 did not support WASM threads. Safari 15.2+ enforces COOP and COEP cross-origin isolation before exposing SharedArrayBuffer, matching the Chromium and Gecko gate.

WASM Threads compatibility in Opera

Opera supports WASM threads from Opera 62+ on Windows, macOS, and Linux, and from Opera Mobile 80+ on Android. Opera 9 to 61 did not support WASM threads. Opera Mini does not support WASM threads in any version because it renders pages on a server proxy and never exposes a real Wasm engine to the device.

WASM Threads compatibility in Samsung Internet

Samsung Internet supports WASM threads from Samsung Internet 11.1+ on Galaxy phones and tablets running Android. Samsung Internet 4.0 to 11.0 did not support WASM threads. The browser shares the Chromium SharedArrayBuffer gate, so the page must serve COOP and COEP before WASM threads can spawn.

WASM Threads compatibility in Android Browser

Chrome for Android supports WASM threads from Chrome 74+, and Firefox for Android supports them from Firefox 79+. The legacy stock Android Browser and UC Browser for Android also support WASM threads on recent Chromium-based builds. The cross-origin isolation rule applies on Android the same way it does on desktop, and the device must have at least two CPU cores to see real parallel speedups.

WASM Threads compatibility in Internet Explorer

Internet Explorer does not support WASM threads in any version. Internet Explorer never shipped a WebAssembly engine, so neither shared memory nor atomics are reachable. Microsoft has retired Internet Explorer 11, so move any threaded Wasm workload to Chromium-based Edge or Chrome.

Note

Note: WASM threads break across Safari, Firefox, and mobile browsers when the COOP and COEP headers are missing. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!

How do WASM Threads work?

WASM threads stack three browser primitives - Web Workers, SharedArrayBuffer, and Wasm atomics - to give a Wasm module real parallelism. The Wasm module imports a shared linear memory; the main thread spawns one Web Worker per logical CPU core; every worker instantiates the same module against the same SharedArrayBuffer-backed memory. Atomic instructions (atomic.load, atomic.store, atomic.rmw, atomic.wait, atomic.notify) let one thread sleep on a memory address until another thread wakes it.

Higher-level synchronization primitives like mutexes, channels, and read-write locks build on those wait and notify atomics. Toolchains such as Emscripten for C and C++, and wasm-bindgen-rayon for Rust, hide this plumbing and expose familiar pthread or Rayon iterator APIs instead.

// Paste this into the DevTools console of a cross-origin isolated page
// to confirm WASM threads support.
async function hasWasmThreads() {
  if (typeof SharedArrayBuffer === "undefined") {
    return false;
  }

  try {
    new WebAssembly.Memory({ initial: 1, maximum: 1, shared: true });
    return true;
  } catch (err) {
    return false;
  }
}

hasWasmThreads().then((supported) => {
  if (supported) {
    console.log("WASM threads are available on this page.");
  } else {
    console.log("WASM threads are not available. Check COOP and COEP headers.");
  }
});

How do you enable WASM Threads in your browser?

WASM threads ship on by default in every supported browser, but the page itself has to opt in to cross-origin isolation. Without the right headers, SharedArrayBuffer is undefined and the Wasm module fails to spawn workers.

  • Send the COOP header: Set Cross-Origin-Opener-Policy: same-origin on the top-level HTML response so the browser process-isolates the page from cross-origin openers.
  • Send the COEP header: Set Cross-Origin-Embedder-Policy: require-corp on the same response so every subresource has to opt in to being embedded.
  • Opt in every cross-origin subresource: Serve images, fonts, scripts, and Wasm files with Cross-Origin-Resource-Policy: cross-origin or a CORS response, otherwise the browser blocks them.
  • Reload the page: Cross-origin isolation only applies to a freshly loaded document. Hard-reload after editing the headers so the next load picks up the new policy.
  • Confirm the gate: Open the DevTools console and check that crossOriginIsolated is true and typeof SharedArrayBuffer is "function". If either fails, the COOP or COEP header is missing or a cross-origin subresource was blocked.
  • Run feature detection: Paste the snippet from the previous section into the console to confirm WebAssembly.Memory accepts the shared: true flag before loading the threaded Wasm module.

If crossOriginIsolated stays false, open the Network panel, look for a blocked subresource, and add the missing CORP or CORS header on its origin.

What are the use cases of WASM Threads?

WASM threads pay off whenever a workload is CPU-bound and embarrassingly parallel, since the cost of moving bytes through postMessage already dominated the previous Web Worker pattern.

  • Image and video codecs: Squoosh uses WASM threads for client-side image compression and reports 1.5x to 3x speedups depending on the codec. FFmpeg.wasm encodes and transcodes video in the browser using a threaded build of libavcodec.
  • 3D engines and games: Unity, Unreal Engine, and Godot ship threaded Wasm builds so the physics, animation, and audio systems can run on separate worker threads while the render loop owns the main thread.
  • PDF and CAD viewers: Apryse, PDFTron, and AutoCAD Web use WASM threads to parse, render, and search large documents without freezing the main thread.
  • Cryptography and ZK proofs: Browser-side cryptography libraries and zero-knowledge proof generators parallelize hashing and field arithmetic across CPU cores using threaded Wasm builds.
  • Scientific computing: Pyodide, R for Wasm, and BLAS-on-Wasm builds use threads to keep linear algebra workloads close to native speed inside the browser sandbox.
...

What are the known issues with WASM Threads?

WASM threads are stable across every major engine, but the cross-origin isolation requirement and the worker startup cost still trip teams up in production.

  • COOP and COEP break embedded content: Cross-Origin-Embedder-Policy: require-corp blocks any iframe, image, or script that does not opt in. Ad networks, third-party analytics, and legacy CDN assets often lack the CORP or CORS header and silently disappear.
  • SharedArrayBuffer is gated to secure contexts: The page must be served over HTTPS and be cross-origin isolated. localhost works for development, but plain HTTP staging environments do not, which surprises QA teams the first time.
  • Worker startup is expensive: Spawning one Web Worker per CPU core takes 20 to 100 ms each on mid-range mobile, so a fresh page load that immediately spins up a thread pool feels janky. Pool the workers and reuse them.
  • Memory growth is shared: When one thread calls memory.grow, every other thread sees the new pages. The toolchain has to handle the case where a pointer becomes stale during reallocation.
  • Debugger support is uneven: Chrome DevTools and Firefox DevTools step through threaded Wasm using DWARF, but breakpoints inside a worker thread sometimes fail to bind on Safari Web Inspector.

In my experience, the COOP and COEP rollout is the single most expensive part of shipping WASM threads - the headers force every embedded asset to be audited, and the page silently falls back to single-threaded mode when one CDN forgets to send Cross-Origin-Resource-Policy.

...

Citations

All WASM threads version numbers and platform notes in this guide come from these primary sources:

Author

Prince Dewani is a Community Contributor at TestMu AI, where he manages content strategies around software testing, QA, and test automation. He is certified in Selenium, Cypress, Playwright, Appium, Automation Testing, and KaneAI. Prince has also presented academic research at the international conference PBCON-01. He further specializes in on-page SEO, bridging marketing with core testing technologies. On LinkedIn, he is followed by 4,300+ QA engineers, developers, DevOps experts, tech leaders, and AI-focused practitioners in the global testing community.

Open in ChatGPT Icon

Open in ChatGPT

Open in Claude Icon

Open in Claude

Open in Perplexity Icon

Open in Perplexity

Open in Grok Icon

Open in Grok

Open in Gemini AI Icon

Open in Gemini AI

Copied to Clipboard!
...

3000+ Browsers. One Platform.

See exactly how your site performs everywhere.

Try it free
...

Write Tests in Plain English with KaneAI

Create, debug, and evolve tests using natural language.

Try for free

Frequently asked questions

Did you find this page helpful?

More Related Hubs

TestMu AI forEnterprise

Get access to solutions built on Enterprise
grade security, privacy, & compliance

  • Advanced access controls
  • Advanced data retention rules
  • Advanced Local Testing
  • Premium Support options
  • Early access to beta features
  • Private Slack Channel
  • Unlimited Manual Accessibility DevTools Tests