Wamr is a WebAssembly Micro Runtime distribution designed for efficient execution of WebAssembly modules. It provides two portable commands: wamr, a stack-based interpreter that decodes and runs .wasm binaries, and wamrc, an ahead-of-time (AOT) compiler that converts .wasm modules into native code. As a fork of the bytecodealliance/wasm-micro-runtime project, wamr has been ported from C to Zig and is maintained with AI assistance.
Key features include compliance with WebAssembly standards, support for the Component Model, fast cold start times, minimal binary size without external dependencies, ease of building, cross-platform compatibility, and extensive testing with over 20,000 tests from the WebAssembly/spec repository. The runtime has been used in production environments for years and is supported by security audits.
Ideal for developers needing a lightweight solution for running WebAssembly modules in resource-constrained environments, wamr offers high performance, small footprint, and reliability. It can be installed via winget, providing developers with a straightforward setup process.
README
WAMR: WebAssembly Micro Runtime
A fork of bytecodealliance/wasm-micro-runtime ported from C to Zig and maintained with AI assistance. It passes the WebAssembly/spec test suite of 20k+ tests. It supports the Component Model. It has a very fast cold start, small engine binary size with no dependencies, and is easy to build & fork.
Wasmtime is currently about 3x faster in CoreMark benchmarks. It has years of production usage and use with a proven track record and security audits.
Install
Install pre-built binaries from GitHub Releases with ghr:
$ ghr install cataggar/wamr
See INSTALL.md for alternative installation methods (winget, uv, pip) and detailed instructions.
Tools
wamrc: AOT compiler — compile a .wasm module to a native .cwasm binary (wamrc compile foo.wasm)
wamr: run a WebAssembly module — either a .wasm file via the stack-based interpreter, or a precompiled .cwasm file produced by wamrc (wamr run foo.wasm)
The upstream do_wait timeout is 5s; that matches GitHub Actions runner
timings but is tight on slow developer VMs (e.g. http-fields takes
~11s on the project Azure dev VM). Set WAMR_TESTSUITE_TIMEOUT=
to override it — see
tests/wasi-testsuite-runner-patch/
(#583 A7).
The suite drives the freshly-built wamr CLI through the in-tree adapter at
tests/wasi-testsuite-adapter/wamr-zig.py
and applies the curated skiplists at
tests/wasi-testsuite-skip.json (Preview 1 / 2)
and tests/wasi-p3-testsuite-skip.json
(Preview 3 — currently empty: every wasm32-wasip3 fixture passes). Every entry
in either skiplist must carry a one-line rationale and a follow-up issue number.
When a previously-skipped test starts passing, delete the entry — the suite is
the gate against regressions in already-shipped WASI host functions.
zig build wasi-p3-parity is the cross-runtime gate (#583
C1): it runs the same
wasm32-wasip3 corpus through wamr and upstream
Wasmtime (CI pin v44.0.1, the first stable
release with -Sp3 support) and diffs the JSON reports via
scripts/diff-testsuite-reports.py.
The classifier exits non-zero only on regressions (wamr fails a
fixture that Wasmtime still passes); deltas in the other direction
(Wasmtime fails a fixture wamr passes) are downgraded to fixture /
runtime-bug warnings so a wamr regression that Wasmtime also exhibits
doesn't masquerade as a wamr bug. The CI workflow at
.github/workflows/wasi-p3-parity.yml
runs the gate on push to main and nightly.
WASI
wamr ships the WASI 0.2.x and 0.3.0 interface surface (wasi:cli,
wasi:clocks, wasi:filesystem, wasi:http, wasi:io, wasi:random,
wasi:sockets); both gates are green (zig build wasi-testsuite —
72 / 72 Preview 1 fixtures; zig build wasi-p3-testsuite —
40 / 40 Preview 3 fixtures). Outbound HTTP and HTTPS issue real
requests via std.http.Client and Zig 0.16's std.crypto.tls.
See docs/wasi.md for the full feature matrix —
interface → version → method count → fixture pass-rate → known
limitations — and #583
for post-Preview-3 hardening items.
To exercise the real outbound HTTPS path in unit tests (off by default
so CI stays hermetic):