userland.rundocs70Try the demo
Help

FAQ

Short answers about what NanoVM is, what it runs, how fast it is, how it is sandboxed and what a page needs.

What is NanoVM?

A platform for running programs inside a browser tab with no server: a shared kernel (virtual filesystem, process router, bus, networking, capabilities) and four runners. It runs real RISC-V Linux binaries such as BusyBox and Node.js, Node.js programs on the browser's JS engine, wasm32-wasip1 tools and sandboxed JavaScript. See the overview.

Is it a full operating system?

No. It runs Linux programs against a syscall layer (98 syscalls in the RISC-V runner); there is no Linux kernel, no device drivers and no bootloader, so it can't boot an OS image. See Syscalls.

Which runners are there and how do I choose?

riscv (exact, slow), node on the host engine (fast, reimplemented built-ins), wasm (WASI apps at native wasm speed) and boa (sandboxed JS). engines chooses where nano.node() runs. See Runners & engines.

Which Node.js version?

Node.js v25.4.0. On the RISC-V runner it is the upstream binary built for riscv64 and installed from the catalog; the host engine reports the same version and implements a subset of the built-in modules.

Can I install npm packages?

Tarballs can be fetched with the browser's fetch() and unpacked with fs.loadTarGz; the TypeScript, ESLint and Prettier toolchain is in the catalog. Guest programs reach the internet only through the /dev/__net__ fetch bridge, which follows CORS, so stock npm install from inside the VM is not something these docs can show working today. See Networking.

How fast is it?

The RISC-V runner is an interpreter: the repository's Node.js benchmarks ran 47× to 1,603× slower than native (558× in total) before the latest block-engine work. The host-engine Node runner and the wasm runner run at JIT and native wasm speed. See Performance.

Is it sandboxed?

Guest code runs inside WebAssembly in your page and can only use what the host exposes: the in-memory filesystem, the /dev/__net__ fetch bridge (subject to CORS, and you can turn it off) and the preview bridge. The Boa runner adds capability grants for untrusted scripts. Host-engine Node programs run as JavaScript in a worker of your origin, so treat them as trusted code. See Scripting.

What does the page need?

Cross-origin isolation (COOP/COEP headers, or the shipped service worker), a browser with shared WebAssembly memory, and enough memory: 256 to 512 MB for BusyBox work, about 1.8 GB for Node.js on the RISC-V runner. See Requirements.

How do I embed it?

Install @userland-run/nano-sdk and call createNano(), or drop in the <nano-terminal> element. See the quick start and Embedded terminal.

How does it compare to WebContainers?

Both run developer tools client-side and both need cross-origin isolation. NanoVM can run unmodified Linux binaries (including the real Node.js) on its RISC-V runner and is open source (AGPL-3.0) with a commercial license option; the trade-off is interpreter speed on that runner. The comparison pages cover WebContainers and others.

What is the license?

The runtime (nano), the terminal, the catalog tools and this website are AGPL-3.0-only OR LicenseRef-UEL; the SDK is MPL-2.0 OR LicenseRef-UEL. UEL is the commercial Userland Enterprise License from And The Next GmbH.

What doesn't work yet?

See Limitations: it lists each gap we observed with SDK 0.2.10, with the exact behavior.