RISC-V · Linux · WebAssembly

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.

RV64GC
full base + M/A/F/D/C
100%
client-side, offline-capable
byte-exact
Spike-matched execution
nativewasm
deterministic by construction
What it does

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-login
💾

Persistent disk

A copy-on-write overlay in IndexedDB survives tab reloads, with crash-consistent virtio-blk flush semantics.

// IndexedDB overlay
🌐

Real networking

A user-mode TCP/IP stack (slirp) with DHCP + DNS, plus a Tailscale transport — the guest gets a real IP.

// slirp + tailscale
📦

OCI containers

Pull and run real Docker Hub images as isolated containers with wvrun — pid/mount/uts namespaces.

// wvrun run/exec
⏱️

Snapshot & resume

Freeze the whole machine — CPU, RAM, devices — to a coherent blob and resume instruction-exact, fsck-clean.

// save_resume
🎯

Provably correct

Differentially tested byte-for-byte against Spike, with a native≡wasm determinism gate on every build.

// diff vs spike
How it works

Fetch → 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.

wasm-vm — ttyS0
# 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:~# _
Ready when you are

Boot a Linux box. Right now.

It runs entirely on your machine — nothing you do here leaves the tab.