a wonderfully quick, compact, and extensible webassembly runtime for go
documentation · getting started · plugins · benchmarks · discord · sponsor us
Wago is a pure-Go WebAssembly engine that compiles Wasm directly to native machine code.
Note
Wago is still beta. APIs and .wago artifacts may change.
- Fast and lightweight. Using a few kilobytes of ram, we compile 5x faster and execute 40% quicker than wazero.
- Pure Go. Embed Wago without CGO while keeping straightforward Go builds and cross-compilation.
- Standards Compliant We pass the official WebAssembly test suite, millions of fuzzes, and many real-world corpora.
- Extensible by design. WASI, the Component Model, and other host capabilities live outside the core runtime as plugins.
- Standalone executables Compile your
.wasmto tiny native executables. Great for CLIs.
On macOS and Linux:
curl -fsSL https://install.wago.sh/unix | shOn Windows, in PowerShell:
irm https://install.wago.sh/ps | iexOr run the installer with Go:
go run github.com/wago-org/wago/cli/wago-installer@mainTo keep the installer command:
go install github.com/wago-org/wago/cli/wago-installer@latest
wago-installerThese commands install the Wago manager. Run wago version install to install
a runtime. Its picker lists available Official, Beta, and Canary channels in
that order; unavailable channels remain visible and disabled at the bottom. See
Getting started for other installation
methods, release channels, and source builds.
Download and run a small Fibonacci module:
curl -fsSL https://wago.sh/corpora/fib.wasm -o fib.wasm
wago fib.wasm 30832040
Build a standalone executable:
wago compile fib.wasm -o fib
./fib 30Note
If you have any questions or want to invest in the community, please join our Discord
Add Wago to your module:
go get github.com/wago-org/wagoRun the Go API example:
go run github.com/wago-org/wago/examples/02-runtime-typed@latestThe example compiles a module, creates an instance, and invokes an exported
function with wago.I32, wago.I64, wago.F32, and wago.F64 slot encodings.
See
Embed Wago in Go for the complete guide.
Register synchronous imports with ordinary Go functions. Wago infers supported hot signatures once and dispatches them without reflection or allocation:
module.Func("add", func(a, b int32) int32 { return a + b })
module.Func("hypot", func(a, b float64) float64 { return math.Hypot(a, b) })For arbitrary arity, mixed scalar types, or references, use the same Func
method with func(wago.HostCall). The call is a borrowed logical view supported
under both Go and TinyGo. Eligible wide scalar signatures use the parked
argument/result slots directly. High-arity adapters can process the borrowed raw
ABI slices directly with ParamSlots() and ResultSlots(). V128 values are
intentionally unsupported at host callback boundaries for now.
For high-frequency one-way (i32) -> () imports, wago.I32HostEvent avoids a
Go stack transition for every call. Events are delivered in order after the
native invocation returns. This is an explicit deferred contract; use a normal
host function when Wasm must observe the callback's effects immediately.
Wago keeps host integrations outside the core runtime. For example, add WASI to a project with:
wago init
wago add wago-org/wasiSee Use plugins or browse the plugin registry.
Wago supports Linux, macOS, and Windows on amd64 and arm64. WebAssembly feature support varies by backend and host.
See the feature matrix for exact coverage.
💖 We develop wago free-of-charge. If you or your company benefits from using wago or you'd like developement to continue, please consider sponsoring us! It'd truly mean the world
We use the Apache License 2.0 so you can enjoy wago too!
Documentation · Examples · Features · Architecture · Benchmarks · Roadmap · Contributing · Issues · Sponsor us!
P.S. pleaseeeee consider leaving us a star! i really believe in wago and if it makes it big some day, you'll know cuz you starred it!