Docker images are hundreds of MB; a full game engine compiles to 35MB WASM
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.
# Landscape
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.