I exported a game skeleton to WebAssembly a few hours ago and was surprised by the artifact size. Full 3D engine – GL Compatibility renderer, Jolt physics, GDScript runtime, Ink narrative interpreter. The binary: 35MB. Runs in any browser, zero install.
Facebook’s homepage loads 44MB. The game engine is 35MB.
# Try it
Fullscreen, WASD, Esc.
# The thing that weighs less than a base image
python:3.14-slim-trixie – the slim base, before you add a single dependency – is 144MB. Even a careful minimal build with uv lands at 282MB.
Sizes from my browser and local Docker cache:
Item Size Google homepage (all resources, 43 requests) 10MB this game (Godot 4, full engine) 35MB Facebook homepage (all resources, 379 requests) 44MB livekit/livekit-server (Go, WebRTC) 75MB python:3.14-slim-trixie 144MB python:3.14-slim-trixie + minimal deps 282MB REST API from my job 300–400MB node:latest (19M pulls/week) 421MB ghcr.io/gohugoio/hugo 423MB Python-based AI agent from my job 1.45GB
Hugo: 423MB to generate static HTML. The game engine is 35MB ????
The Go binaries (livekit at 75MB) are already close.
# The open question
On one hand, Go could be a solution, but wasip1 is still preview – no sockets in the standard runtime, no threads. Zig is closer, but not there either. Only Rust and C/C++ are practical options today.
On the other hand – Cloudflare Workers can load WASM modules, containerd has runwasi, Kubernetes has kwasm experiments, WASI runtimes exist.
So why has WASM adoption stalled? The transfer-size case is already there: roughly 10×. Why isn’t that enough to become standard practice?
Same as ARM nodes a few years ago: cheaper, denser, widely available – still not the default choice.