WebAssembly,
made for Go.

A novel runtime that balances compile time, memory usage, and execution speed for a simply wonderful experience.

Read the docs → Browse plugins ↗
// compile, instantiate & run wasm, no cgo
compiled, err := wago.Compile(nil, wasmBytes)
if err != nil { panic(err) }
defer compiled.Close()

inst, err := wago.Instantiate(compiled)
if err != nil { panic(err) }
defer inst.Close()

out, err := inst.Invoke("fib", wago.I32(30))
if err != nil { panic(err) }
fmt.Println(wago.AsI64(out[0])) // → 832040
57/57
MVP files pass
16,592
MVP assertions passed
0
lines of cgo
7
native runtime targets

A real engine, not a wrapper.

It reads, checks, and compiles WebAssembly to native code — all in pure Go. No C, no cgo.

Native x86-64 & ARM64

Compiles straight to native code for both architectures in milliseconds, with no warmup.

WebAssembly 3.0

Full support for the WebAssembly 1.0, 2.0, and 3.0 standard, on by default.

Singlepass Backend

Absurdly fast and light. Low memory, high throughput, and competative performance.

Standalone executables

Compile wasm into native standalone executables. Great for CLIs.

Plugin API

Anything is possible. Need HTTP? Install it. Want AVX-512 support? Implement it. We also have a package manager to boot.

3rd-Party Tests

We run the Official WebAssembly test suite along with the entire wazero and wasmtime suites. We pass everything.

Conformance

We show our work

wago tracks the official WebAssembly/testsuite file by file. The numbers here come straight from the engine's own test run.

100% applicable MVP files pass
→ Read the full SPECTEST.md
WebAssembly 1.0 MVP feature details · historical (bd742cd) 17/17 pass
i32 / i64 integer ops pass
f32 / f64 ops pass
f32 / f64 ceil / floor / trunc / nearest / copysign pass
Conversions + reinterpret pass
Float→int trunc NaN/overflow traps pass
Control flow: block / loop / if / else / br / br_if / br_table / return pass
call / call_indirect pass
select, drop, nop, unreachable pass
Locals pass
Globals pass
Linear memory load/store pass
memory.size / memory.grow pass
Active data segments pass
Tables + active element segments pass
Function imports / exports pass
Memory / table / global imports & exports pass
start function pass
WebAssembly 2.0 finished proposals 6/6 pass
Sign-extension ops pass
Non-trapping float→int pass
Multi-value pass
Reference types pass
Bulk memory pass
Fixed-width SIMD pass
WebAssembly 3.0 finished proposals 9/9 pass
Tail calls pass
Extended const expressions pass
Typed function references pass
Memory64 pass
Multiple memories pass
Garbage collection pass
Exception handling pass
Relaxed SIMD pass
Branch hinting pass
Future features active proposals 2/31 partial
JS Promise integration planned
Web Content Security Policy not planned
Threads & atomics flag
Compact import section pass
Wide arithmetic pass
ESM integration not planned
Stack switching planned
Custom page sizes planned
Custom descriptors & JS interop unsupported
Relaxed dead-code validation unsupported
Numeric values in WAT data unsupported
Extended name section unsupported
Rounding variants unsupported
Compilation hints planned
JS primitive builtins not planned
Acquire-Release Atomics planned
Multibyte array access unsupported
Half precision (FP16) unsupported
Type imports unsupported
Component model partial
C / C++ embedding API unsupported
Flexible vectors unsupported
Memory control unsupported
Reference-typed strings unsupported
Profiles unsupported
Shared-everything threads unsupported
Frozen values unsupported
More array constructors unsupported
JIT interface unknown
Type reflection (JS API) unsupported
JS text-encoding builtins unknown
Get started

Up and running in one command

Add wago to your module and embed it, or drive the engine straight from the CLI to run, compile, or validate any .wasm.

$ curl -fsSL https://install.wago.sh/unix | sh
Read the quick start guide →
End-to-end latency

Fresh process in milliseconds

The whole process, from spawn to exit, timed end-to-end across six real workloads. Compare process startup and execution together on the architecture that matches your machine.

wazycompiler 16.6 ms
wazerocompiler 18.6 ms
wasmtimecranelift 19.7 ms
wagosingle-pass 21.1 ms
wavmllvm 33.3 ms
v8turboshaft 38.3 ms
wasm3interpreter 114 ms
wasmiinterpreter 228 ms
Apple M4 Max, darwin/arm64
Performance

Runtime Statistics

Summary metrics · lower is better
Compileper compile
wago 3.39ms
wazero 19.3ms
5.7× faster
Compile heapper compile
wago 924 KB
wazero 9.7 MB
10.8× less
Machine codecompiled corpus
wago 134 KB
wazero 240 KB
1.8× less
Instantiaterunnable corpus
wago 10.6µs
wazero 21.2µs
2× faster
Executionrunnable corpus
wago 27.5µs
wazero 47.8µs
1.7× faster
Compile + instantiatesum of geometric means
wago 3.40ms
wazero 19.3ms
5.7× faster
Host → Wasmraw Instance.Invoke (i32) → i32
wago 12.1ns
wazero 29.6ns
2.4× faster
Wasm → hostInstance.Invoke typed import callback
wago 21.8ns
wazero 379.2ns
17.4× faster
linux · amd64 · AMD Ryzen 7 7800X3D 8-Core Processor · wago b2c2f57

The 40-workload runtime suite, including 21 command programs, was measured on both architectures at Wago 4651e8cd (September 23, 2026): three samples per measurement, shown as medians. The boundary rows use a caller-owned session held across repeated calls; opening and closing that session is excluded from each timed call. Compare values within an architecture. Every displayed workload has measurements from both Wago and Wazero; the full correctness corpus remains separate. The end-to-end startup sweep above was last measured September 10, 2026. See the benchmark corpus & methodology.

Plugins

The Most powerful Plugin API

Need HTTP? Install a plugin. Need WASI? Add it. Need new host bindings? Build them with the plugin API.

Community

Join us on Discord

Ask questions, share what you're building, and follow wago's progress with the community.

Join Discord ↗

Embed wasm in your Go app

Apache-licensed and built in the open. Add it to your module in one command and call straight into native wasm, no cgo.

Read the docs →