WebAssembly,
made for Go.

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

Join the beta →
Read the roadmap → Browse plugins ↗
// compile, instantiate & run wasm, no cgo
mod, _  := wago.Compile(wasmBytes)
inst, _ := wago.Instantiate(mod, nil)
defer inst.Close()

out, _ := inst.Invoke("fib", wago.I32(30))
fmt.Println(wago.AsI64(out[0])) // → 832040
57/57
MVP files pass
96,972
checks passed
0
lines of cgo
86.1%
test coverage

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 2.0

Full support for the WebAssembly 2.0 standard, on by default — SIMD, reference types, and the rest.

Low overhead

Fast and light: low latency, small memory, high throughput.

Zero-copy memory

Your Go code and the wasm share one block of memory, a plain []byte. No copies.

Stable host ABI

Every export gets a typed Go wrapper, so calls stay type-safe and fast.

Tracked conformance

We run the full spec test suite and publish exactly what passes in SPECTEST.md. Nothing hidden.

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 core 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 1/31 partial
JS Promise integration planned
Web Content Security Policy planned
Threads & atomics pass
Compact import section planned
Wide arithmetic planned
ESM integration planned
Stack switching planned
Custom page sizes planned
Custom descriptors & JS interop planned
Relaxed dead-code validation planned
Numeric values in WAT data planned
Extended name section planned
Rounding variants planned
Compilation hints planned
JS primitive builtins planned
Acquire-Release Atomics planned
Multibyte array access planned
Half precision (FP16) planned
Type imports planned
Component model planned
C / C++ embedding API planned
Flexible vectors planned
Memory control planned
Reference-typed strings planned
Profiles planned
Shared-everything threads planned
Frozen values planned
More array constructors planned
JIT interface planned
Type reflection (JS API) planned
JS text-encoding builtins planned
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.

  • One-line source install during preview; public prebuilt binaries are planned for v0.1.0
  • Linear memory is just a Go []byte
install
$ curl -fsSL https://install.wago.sh | sh
cli
$ wago add.wasm 2 3
$ wago run --invoke=fib fib.wasm 30
$ wago run --wasi hello.wasm
$ wago run --bounds=all fib.wasm 30
$ wago validate module.wasm
$ wago version
Startup latency

Cold start in milliseconds

The whole process, from spawn to exit, timed end-to-end across six real workloads. wago lands top-two on every one: it starts in milliseconds and runs native.

wagosingle-pass 5.1 ms
wasmiinterpreter 7.4 ms
wasmtimeCranelift 8.1 ms
wasmercompiler 8.4 ms
wazerocompiler 11.0 ms
v8optimizing 12.3 ms
wavmLLVM 266 ms
Performance

No IR, no compromise

wago compiles straight to native in a single pass: no SSA, no IR, no optimizer, just the novel Valent-Block architecture. It still keeps pace with runtimes that run a full optimizing backend. Every stage, head-to-head with wazero.

wago wazero
Compile latencyfib_rec module
8.8µs
44.4µs
5.1× faster
Instantiate latencyfib_rec startup + mapping
2.1µs
7.9µs
3.7× faster
Call overheadhost → wasm
13.9ns
32.6ns
2.3× faster
Host roundtripwasm → host → wasm
211.9ns
426ns
2.0× faster
Exec latencyfib_rec recursion
295µs
510µs
1.7× faster
N-bodyleapfrog solar-system integrator
268µs
349µs
1.3× faster
Ray tracerrecursive Whitted, depth-4 mirrors
366µs
357µs
same speed
SHA-256hash 8 KiB
33.7µs
53.1µs
1.6× faster
JSON deserializejson-as, SWAR
38.4µs
62.2µs
1.6× faster
linux · amd64

Measured separately on each listed architecture; compare values within an architecture, not across machines. Numbers shift as the engine evolves — see the benchmark corpus & methodology.

Architecture

From bytes to native code

One front end decodes and type-checks every module. Single-pass backends emit native amd64 and arm64 code in one pass; a planned typed IR would add an optimizing tier.

shared front end
.wasm
20 00 20 01 6a
module bytes
decode
local.get 0
local.get 1
i32.add
structure
validate
[i32 i32]
  → [i32] ✓
type-checked
Shipping

single-pass amd64 + arm64

amd64  add eax, ecx
arm64  add w0, w0, w1

Straight to machine code in one pass — Native runtime paths ship in CI on Linux/amd64, Linux/arm64, and Darwin/arm64.

Planned

typed IR → optimizing tier

%2 = add.i32 %0, %1

A target-agnostic IR feeds a second tier — dead-code elimination, constant folding, register allocation — and new backends for arm64, macOS and Windows, still no cgo.

Plugins

Extend the runtime, one import away.

Official and community Go modules add host interfaces, compiler features, and managed runtime services without expanding wago core. Follow each plugin's page for compatibility and stability details.

Public beta waitlist

Get notified at launch

Drop your email and we'll send one message the moment wago's public beta is live — no spam, unsubscribe anytime.

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 →