A real computer,
booting real Linux,
in a browser tab.
wasm-vm is a from-scratch RV64GC emulator that runs unmodified Alpine Linux — with networking, persistent disks, OCI containers, and instant snapshots — entirely client-side in WebAssembly. No server. No install. Just a URL.
Not a toy. A whole machine.
Every layer of a real computer, re-implemented and verified — then compiled to run in the one runtime everyone already has.
Unmodified Linux
Boots the stock Alpine riscv64 kernel + userland to a login shell — OpenRC, busybox, apk, the works.
// boot-to-loginPersistent disk
A copy-on-write overlay in IndexedDB survives tab reloads, with crash-consistent virtio-blk flush semantics.
// IndexedDB overlayReal networking
A user-mode TCP/IP stack (slirp) with DHCP + DNS, plus a Tailscale transport — the guest gets a real IP.
// slirp + tailscaleOCI containers
Pull and run real Docker Hub images as isolated containers with wvrun — pid/mount/uts namespaces.
Snapshot & resume
Freeze the whole machine — CPU, RAM, devices — to a coherent blob and resume instruction-exact, fsck-clean.
// save_resumeProvably correct
Differentially tested byte-for-byte against Spike, with a native≡wasm determinism gate on every build.
// diff vs spikeFetch → decode → execute, a few hundred million times.
An interpreter core in Rust, compiled to WebAssembly, driving a full virt platform — CLINT, PLIC, UART, virtio-blk/net/rng — off a deterministic clock.
# booting unmodified Alpine riscv64 in WebAssembly… [ 0.000000] Linux version 6.6.63 (riscv64) — in your browser [ 2.664] Run /init as init process wasm-vm:~# uname -m riscv64 wasm-vm:~# cat /proc/cpuinfo | grep isa isa : rv64imafdc wasm-vm:~# wvrun run busybox echo "hello from a container" hello from a container wasm-vm:~# _
Boot a Linux box. Right now.
It runs entirely on your machine — nothing you do here leaves the tab.