BrowserPod.io • Docs • Try it on BrowserCode • Discord
BrowserPod is a microVM that runs in the browser.
A Pod boots a Linux-like kernel in WebAssembly, with a small footprint and on-demand loading. It provides multiple language runtimes, including Node.js, Python and Rust, and extensive tools including git, bash, npm and pnpm. Pods run on the end user's browser, with zero latency, near-instant boot, and zero compute costs.
New in BrowserPod 4.0: BrowserPod is now free to use for any purpose, under the BrowserPod Community Licence. Unlimited and unmetered. When a pod needs the internet (a public URL, npm, GitHub), you can connect it to BrowserPod Edge, a complete networking layer, or provide a custom network backend.
Developers use BrowserPod to sandbox untrusted and AI-generated code in the browser, build web applications that embed server-side processes client-side, create interactive documentation and playgrounds and run AI coding CLIs in-browser without modification (e.g., Claude Code, Codex).
| Feature | Description |
|---|---|
| Kernel | BrowserPod's in-browser kernel exposes a comprehensive Linux-compatible syscall interface rather than a limited JavaScript shim. |
| WebAssembly executables | BrowserPod runs full, unmodified WebAssembly builds of native tools and runtimes, running them directly in the users' browser. |
| Local execution | Code runs on the user's device: zero latency between an agent and its code, and no compute cost to you. |
| Runtimes | In-browser runtimes for Node.js, Rust, Python (preview), with Go coming soon. |
| Sandbox | BrowserPod runs directly in the browser, inheriting its security boundary. |
| Filesystem | A block-based streaming virtual filesystem provides images on demand, and any file changes stay local to the browser session using either IndexedDB or the Origin Private File System (OPFS). |
| Fidelity | The full Node.js runtime is shipped, and supports most frameworks and tools (including React, Angular, Next.js, Express.js and Vite), with Wasm overrides for native dependencies (see Native binaries). Rust CLI tools work unmodified, including jj, ripgrep and Codex. |
| Networking | Pods can reach the network through the page's fetch(): HTTP, HTTPS and WebSocket to origins that allow CORS (BrowserPod.opinionatedFetch works also with npm registry). BrowserPod Edge adds Portals, TCP connections and outbound HTTP access without CORS limits, under an allowlist. Custom allowlists come with Edge Pro. |
| Portals | Ports that open in BrowserPod can be shared via a temporary private URL. This secure URL routes external traffic directly to the service running in the browser, enabling live previews and collaboration without any backend servers. Portals are part of BrowserPod Edge. |
| Tools | BrowserPod provides a wide range of developer tools and frameworks, including bash, git and ripgrep, plus pnpm and npm for Node.js. |
| Multithreading | Web workers enable true multithreading for complex, multi-process workloads. |
| Terminal | To connect a process's I/O, pass it a Terminal, an in-browser pseudo-terminal handle created via createDefaultTerminal or createCustomTerminal. BrowserPod uses xterm.js by default, but also supports other Wasm-compatible pseudo-terminals (e.g., ghosttyweb). |
npm create browserpod-quickstart
Pick a template:
| Template | What it runs |
|---|---|
vite-basic |
Node.js REPL |
bash |
Bash terminal |
vite-web |
Express server with a live preview (uses Portals) |
No API key is needed. To enable Portals, which let you preview and share services running inside your pod, create a free BrowserPod Edge key at console.browserpod.io and paste it after choosing a template. You can also add VITE_BP_APIKEY to the project's .env later.
npm install @leaningtech/browserpod
yarn add @leaningtech/browserpod
import { BrowserPod } from "@leaningtech/browserpod";
const pod = await BrowserPod.boot({
network: await BrowserPod.createFetchNetwork({ fetch: BrowserPod.opinionatedFetch }),
});
const terminal = await pod.createDefaultTerminal(document.querySelector("#console"));
await pod.run("bash", [], { terminal });The page must be cross-origin isolated.
When a pod needs Portals, TCP, or outbound access without CORS limits, boot it on an Edge network with a key from console.browserpod.io:
const pod = await BrowserPod.boot({
network: await BrowserPod.createEdgeNetwork({ apiKey }),
});
pod.onPortal(({ url, port }) => console.log(`Port ${port} is live at ${url}`));Edge has a free monthly allowance; see pricing.
BrowserPod supports Node.js and Rust, with Python in preview. Go is coming soon; Ruby will follow.
| Runtime | Availability | Since |
|---|---|---|
| Node.js | Live 🟢 | browserpod-1.0 |
| Rust | Live 🟢 | browserpod-3.0 |
| Python | Preview 🟠 | — |
| Go | Coming soon 🟠 | — |
| Ruby | Planned ⚪ | — |
Chromium-based browsers (Chrome, Edge) give the best results. Firefox and Safari work with some limitations, and memory-heavy workloads may fail in mobile devices.
BrowserPod runs Node.js in a Wasm environment. Packages that ship native binaries for specific CPU architectures will not run unless they provide a Wasm build.
Many popular build tools publish an official Wasm version alongside the native one. You can tell your package manager to install the Wasm version instead, anywhere in your dependency tree, without changing your own code.
| Native package | Replace with | What it does |
|---|---|---|
esbuild |
npm:esbuild-wasm@* |
Bundler used by Vite and many dev servers |
rollup |
npm:@rollup/wasm-node@* |
Bundler used by Vite for production builds |
@parcel/watcher |
npm:@parcel/watcher-wasm@* |
Watches files for changes during development |
Add them under overrides in your package.json:
{
"overrides": {
"esbuild": "npm:esbuild-wasm@*",
"rollup": "npm:@rollup/wasm-node@*",
"@parcel/watcher": "npm:@parcel/watcher-wasm@*"
}
}If you use Yarn, the field is called resolutions instead of overrides. The contents are the same.
Some frameworks ship their Wasm build as a separate package that you add as a normal dependency, rather than as an override:
| Package | Needed for |
|---|---|
@next/swc-wasm-nodejs |
Wasm build of the SWC compiler used by Next.js |
@oxc-minify/binding-wasm32-wasi |
Minifier for Nuxt and other Oxc-based toolchains |
@oxc-parser/binding-wasm32-wasi |
Parser for Nuxt and other Oxc-based toolchains |
@oxc-transform/binding-wasm32-wasi |
Transformer for Nuxt and other Oxc-based toolchains |
BrowserPod uses SharedArrayBuffer, which means it can only run on cross-origin isolated pages.
To enable cross-origin isolation, your page must send both of these headers:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
- Documentation: Complete guides, tutorials, and API reference
- BrowserCode: Try BrowserPod in your browser, with nothing to install
- For coding agents:
AGENTS.md, the BrowserPod skill and the docs as Markdown - Showcase: Community projects built on BrowserPod
- Discord Community: Get help and share your projects
- GitHub Issues: Report bugs and request features
- Yarn 6 playground: Yarn 6 runs on BrowserPod in its official playground.
BrowserPod is free for any use, with attribution — personal, commercial and production — under the BrowserPod Community Licence (LICENSE.txt).
- Credit BrowserPod: show "Powered by BrowserPod" with a link to browserpod.io where your pods run; headless tools and agents credit it in their docs or README. Edge Pro includes the Community Licence without attribution.
- Load the runtime from our CDN. Self-hosting, vendoring and redistribution (OEM) need an Enterprise Licence.
- No call-home: the runtime only downloads its own files and disk data. See the Runtime Privacy Policy.
- Networking is optional: BrowserPod Edge (Portals, outbound networking, TCP) has its own Terms and Pricing Policy, with a free monthly allowance.
Previous licence and policy versions are kept at browserpod.io/legal.
