Introduction

NanoVM

A RISC-V Linux userland emulator compiled to WebAssembly. It runs BusyBox, Node.js, and the full npm / TypeScript toolchain entirely in the browser — no server required.

NanoVM emulates an RV64GC RISC-V CPU with roughly eighty Linux syscalls — enough of the kernel surface to load real ELF binaries and execute them unmodified, instruction by instruction. Everything lives inside a single WebAssembly module.

What it runs

  • BusyBox — echo, cat, ls, sort, grep, head, tail and the rest of the coreutils.
  • Node.js v25 — a full runtime with require, fs, path, crypto, http, streams, Buffer, EventEmitter and async/await.
  • The npm toolchain — the TypeScript compiler, ESLint and Prettier, all unmodified.

What the emulator handles

Memory management (brk / mmap), file I/O via an in-memory POSIX filesystem, sockets, epoll, timerfds, futex-based threading, and ELF loading — all behind a minimal host boundary of five WASM imports.

NanoVM is a userland emulator: it runs Linux programs, not a full kernel with device drivers. If you need a complete bootable OS, you want a full-system emulator instead.

Where to go next

  • New here? Start with the Quick start.
  • Embedding it in a web app? The SDK (@userland-run/nano-sdk) is the supported way in — start with the SDK overview.
  • Just want Node in the browser? See running Node.js + dev tools in the browser.
  • Building on the emulator directly? See the CLI & JS API and Host API.
  • Curious how it works? Read the Architecture, Syscalls and Performance pages.