Herdr VM documentation Open VM

About VMVM

VMVM is a self-contained 32-bit Linux computer that runs entirely in your browser. It boots a real Alpine Linux guest inside a JavaScript x86 emulator, with optional full IPv4 networking, on-device AI inference, browser automation, voice input, and a public web IDE with live preview.

Executive summary

VMVM delivers a full Linux development environment with zero installation. No OS, browser extension, or cloud backend is required for the core experience: the disk image, emulator, and tools are all served as static files and execute in the browser tab. The page also ships three optional integrations — full IP networking through a WebSocket gateway, on-device large-language-model inference through WebGPU, and browser automation through an extension — each of which can be used alone or together.

The project includes a public Dev IDE at /ide/: a browsercode-style editor with a Monaco code editor, file tree, console, and live preview that runs a scaffolded app inside the guest and reverse-proxies it through nginx. Projects can be written, saved, and recompiled with native esbuild running inside the guest, and the preview hot-reloads on save.

Key highlights:

Technical summary

The guest is a fixed-size Alpine Linux i386 ext4 image (64–104 MiB across six cumulative tiers) booted by a Linux 6.6 i386 kernel in the v86 JavaScript emulator. v86 provides a serial console (primary), emulated IDE/ATA disk, NE2000 or VirtIO NIC, and optional VGA; the page renders the terminal with xterm.js.

Hosting. The deployed site is a purely static bundle behind nginx (fapstaff.com). The disk images are loaded with HTTP Range requests (206), with a compatibility fallback that downloads the whole image and forces libata.force=pio4 when DMA interrupts fail. A service worker caches static assets but always revalidates the VM manifest so image updates reach users promptly.

Networking. network/cmd/v86net-gateway is a Go binary WebSocket-to-TAP gateway. Each WebSocket message carries exactly one Ethernet frame. The default userspace backend uses a gVisor TCP/IP stack for DHCP/DNS/NAT through ordinary sockets with no elevation; an optional native backend uses a TAP adapter (Linux) or Wintun (Windows) for maximum throughput. Sessions are origin-bound, short-lived, and authenticated with a token carried in Sec-WebSocket-Protocol. Guest egress to loopback, RFC1918, link-local, and cloud-metadata addresses is blocked by default.

On-device AI. llm/vendor/litert-lm bundles LiteRT-LM 0.14.0 (Apache-2.0), a WebGPU inference runtime that executes a selected Gemma model in the browser's GPU; the guest reaches it through a serial RPC bridge (vmllm). No API key or extension is required.

Browser bridge. Guest commands such as vmfetch, vmclip, vmexport, vmgithub, and vmai call browser APIs through a host-side RPC layer instead of a NIC, keeping those capabilities available without the gateway.

Dev IDE. The Dev tier image runs vmbro-httpd, a Chi-based Go supervisor on guest port 3000. It scaffolds a project from one of seven templates, compiles TypeScript/Astro with native esbuild and QuickJS inside the guest, and streams a live preview on port 3100. nginx reverse-proxies /ide/ to 3000 and /preview/ to 3100, and HMR pushes reload events over SSE so the preview updates on save.

High-level implementation details

Runtime architecture

Browser tab
 ├── v86 (libv86-network.js + v86-network.wasm)
 │    ├── SeaBIOS → kernel (bzImage-network) → Alpine ext4 disk image
 │    ├── serial console → xterm.js
 │    └── NIC → V86WebSocketNetwork → wss://…/v1/ethernet
 ├── LiteRT-LM (WebGPU) ← Gemma 4 E2B model ← OPFS
 ├── MoonshineJS (ONNX/WASM) ← microphone → text
 ├── Agent bundles (Deep Agents / Mastra / Rig) ← guest RPC
 └── Service worker (network-first static cache)

Host / server
 ├── v86net-gateway (Go): WSS ↔ gVisor userspace NAT | TAP/Wintun native
 ├── PeerJS signaling server (private) for WebRTC remote chat
 └── nginx: static files + /ide/, /preview/, /v1/sessions, /peerjs/

Guest (Alpine i386)
 ├── vmbro-httpd (Go/Chi): port 3000 — Dev IDE shell + project server
 ├── vmbro-dev: preview server on port 3100
 ├── esbuild (ia32), QuickJS: native compile + render
 └── vm* RPC commands, vmlang / rig / vmmastra agents, tmux, git…

Data paths

Security and privacy posture

Components and licenses

VMVM is assembled from the following components. Bundled third-party notices travel with the distribution; the Gemma model and Moonshine models carry their own upstream terms.

ComponentRoleVersionLicense
v86Browser x86 emulator (libv86.js, WASM)0.5.xBSD-2-Clause
SeaBIOS / VGABIOSGuest firmwareLGPL-3.0
Linux kerneli386 guest kernel (bzImage-network)6.6GPL-2.0
Alpine LinuxGuest userland base3.xMixed (MIT/GPL/etc.)
BusyBoxGuest shell and coreutilsGPL-2.0
xterm.jsTerminal emulatorMIT
PeerJSWebRTC signaling for remote chat1.5.5MIT
jsQRCamera QR scanning (remote page)1.4.0Apache-2.0
qrcode-generatorPairing QR rendering2.0.4MIT
mermaidFlow diagrams in documentationMIT
Monaco editorCode editor in the Dev IDE0.52.2MIT
MoonshineJS + Tiny English modelLocal speech-to-textMIT
ONNX Runtime WebMoonshine/encoder-decoder inferenceMIT
Silero VADVoice-activity detectionMIT
LiteRT-LM coreWebGPU LLM runtime0.14.0Apache-2.0
@litertjs/wasm-utilsLiteRT-LM WASM support2.5.0Apache-2.0
Gemma 4 E2B modelOn-device language model weightsGoogle Gemma terms
DeepAgentsJSvmlang agent framework1.11.1MIT
LangChain / LangGraphAgent graph and tooling1.5.0 / 1.4.4MIT
@mastra/corevmmastra agent framework1.52.1Apache-2.0
ai (Vercel AI SDK)LLM provider interface5.0.220Apache-2.0
zodSchema validation4.4.3MIT
esbuildBundler/compiler (host + guest ia32)0.25.xMIT
QuickJSEmbedded JS runtime (Astro render)MIT
HonoHTTP routing in templatesMIT
AstroTemplate page renderingMIT
Go (toolchain)Gateway, vmbro-httpd, launcher1.25BSD-3-Clause
coder/websocketGateway WebSocket server1.8.14ISC
gvisor-tap-vsockUserspace TCP/IP NAT stack0.8.9Apache-2.0
gvisor.dev/gvisorNetstack supportApache-2.0
go-chi/chi/v5HTTP router for vmbro-httpd5.2.2MIT
golang.org/x/*Go extended librariesBSD-3-Clause
WireGuard / WintunWindows native gateway driver0.14.1MIT
gopacket / miekg/dns / insomniacslk-dhcpPacket, DNS, DHCP supportBSD-3-Clause
logrusGateway logging1.9.4MIT
tmuxGuest terminal multiplexer3.5aISC
GitGuest version controlGPL-2.0
ripgrepGuest fast searchMIT (dual Unlicense/MIT)
shfmtGuest shell formattingBSD-3-Clause
ctags / make / patchGuest dev utilitiesGPL-2.0 / GPL-3.0 / GPL-3.0
ZellijGuest multiplexer0.44.3MIT
ZerostackGuest agent (browser-orchestrated)1.5.0GPL-3.0
rig-corerig agent runtime0.40.0MIT
Grafana k6Performance-testing tier2.0.0AGPL-3.0
herdri686 guest agent binary0.7.4Project
vaptrIn-guest vulnerability scannerProject
AutoBro extensionBrowser automation providerProject

This table lists direct dependencies. Transitive Go and npm dependencies inherit their own licenses, and the distribution ships their notices where required. The Gemma 4 E2B weights are not committed to this repository and remain subject to Google’s model terms.