The State of WebAssembly in 2025
WasmHub Team
February 12, 2025 · 6 min read
WebAssembly has come a long way from its 2017 MVP. What started as a fast binary format for browser compute is now a universal compilation target running in clouds, on edge nodes, inside databases, and as a sandboxing layer for operating systems. Here's a thorough look at where the ecosystem stands in 2025.
WASI Preview 2: Stable and Shipping
The WebAssembly System Interface (WASI) defines how Wasm modules interact with the host operating system — reading files, opening sockets, getting the time, and so on. WASI Preview 1 was a minimal proof of concept. WASI Preview 2, which reached stability in late 2024, is a complete redesign built on the Component Model and the wit-bindgen interface description language.
The biggest practical change is the move from a POSIX-like flat API to a capability-based, interface-typed model. Modules no longer receive ambient OS access; instead, the host explicitly passes in typed capability handles. A module that needs to read a file gets a wasi:filesystem/preopens resource — nothing more. This makes Wasm an exceptionally good sandbox for running untrusted code.
// A WIT (WebAssembly Interface Types) definition
// This is the contract your component exposes to the host
package wasmhub:image-resizer;
interface resize {
record options {
width: u32,
height: u32,
quality: u8,
}
resize-jpeg: func(input: list<u8>, opts: options) -> result<list<u8>, string>;
}
world image-resizer {
export resize;
}With WIT, interfaces are language-agnostic. A Rust component can expose the resize interface above, and a Python host (or a JavaScript host, or another Wasm component) can consume it without hand-written glue code. wit-bindgen generates the bindings automatically.
The Component Model: Composable Modules
The WebAssembly Component Model is the most significant architectural advance since the initial MVP. Classic Wasm modules share nothing — they communicate only via i32/i64/f32/f64 values and raw linear memory. The Component Model adds a rich type system (strings, records, variants, resources, streams) and a standard linking format that lets components be composed like software lego bricks.
In practice this means you can:
- Build a Rust image-processing component and a Python data-pipeline component and wire them together without either side caring what language the other was written in
- Distribute Wasm components as a new kind of universal package
- Compose serverless functions at the platform level, not just the code level
Wasmtime 20+, Fermyon Spin 2, and the wasm-tools CLI all ship stable component model support. The cargo-component crate makes building components from Rust ergonomic enough to use in production.
Major Runtimes
Wasmtime
Maintained by the Bytecode Alliance, Wasmtime is the reference implementation for WASI and the Component Model. It's production-grade, CNCF-affiliated, and written in Rust. Its cranelift backend compiles Wasm to native code with predictable latency, and its Winch "baseline" compiler provides near-instant startup for short-lived functions.
# Run a WASI component from the command line
wasmtime run --wasi=nn my-inference.wasm
# Or embed it in a Rust application
# [dependencies]
# wasmtime = "20"
# wasmtime-wasi = "20"Wasmer
Wasmer focuses on developer experience and portability. Its standout feature is WASIX — a superset of WASI Preview 1 that adds POSIX threads, sockets, and process management, making it possible to run git, curl, and other unmodified CLI tools as Wasm. The Wasmer Registry (wasmer.io) hosts thousands of published packages.
WasmEdge
WasmEdge (a CNCF sandbox project) is optimized for cloud-native and AI workloads. Its WASI-NN extension exposes OpenVINO, TensorFlow Lite, and PyTorch backends to Wasm modules, making it the go-to runtime for ML inference at the edge. It also integrates tightly with containerd, letting you run Wasm modules as first-class container workloads.
Browser Support Landscape
All major browsers — Chrome, Firefox, Safari, and Edge — have supported the Wasm MVP for years. In 2025 the interesting story is the proposals that have shipped:
| Proposal | Chrome | Firefox | Safari |
|---|---|---|---|
| SIMD (fixed-width) | ✅ 91 | ✅ 89 | ✅ 16.4 |
| Threads + Atomics | ✅ 74 | ✅ 79 | ✅ 15 |
| Garbage Collection | ✅ 119 | ✅ 120 | ✅ 17.4 |
| Tail Calls | ✅ 112 | ✅ 121 | ✅ 17 |
| Exception Handling | ✅ 95 | ✅ 100 | ✅ 15.2 |
| Multi-Memory | ✅ 109 | ✅ 106 | ✅ 17 |
Wasm GC is the headline feature: languages with managed memory (Dart, Kotlin, Java, OCaml) can now compile to Wasm and use the browser's own GC instead of bundling their own. This dramatically reduces binary size and eliminates a whole class of memory management bugs. Flutter Web and Dart 3.3+ already ship production builds using Wasm GC.
Tooling Highlights
The tooling story has matured enormously:
wasm-pack— The standard way to compile Rust to Wasm for npm consumption. Version 0.13 added component model output.cargo-component— Build WASI components from Rust with automatic WIT binding generation.wasm-tools— Swiss-army knife CLI for inspecting, transforming, and composing.wasmbinaries.wit-bindgen— Generates language bindings from WIT interface files for Rust, C, Go, and JavaScript.- Emscripten 3.x — Still the most capable toolchain for porting large C/C++ codebases, with WASI output mode added.
What's Still Being Worked On
A few proposals worth watching:
Memory64 adds 64-bit linear memory addressing, removing the current 4 GB limit. Critical for porting large native applications and databases. It's shipping in Wasmtime and Wasmer today; browser support is in progress.
WASI 0.3 will add native async/await support using Wasm's new stack-switching primitive, enabling efficient I/O-heavy workloads without callback hell.
Shared-Everything Linking will let components share memory directly, unlocking zero-copy data transfer between components — important for high-throughput data pipelines.
The Bottom Line
WebAssembly in 2025 is no longer a niche browser optimization trick. It's a universal binary format with a production-grade ecosystem of runtimes, a stable system interface, and a component model that enables a new kind of language-agnostic software distribution. Whether you're building a plugin system, running workloads at the edge, porting a native library to the browser, or sandboxing user code, Wasm likely belongs in your toolbox.