Skip to content

Toolchains & packages

A session ships five toolchains: node, bun, python, ruby, and clang. Compile and run C without leaving the shell.

Terminal window
$ cat > hello.c <<'EOF'
#include <stdio.h>
int main(void) { printf("hello from clang on the edge\n"); return 0; }
EOF
$ clang hello.c -o hello.wasm && ./hello.wasm
hello from clang on the edge

node and bun run on workerd’s nodejs_compat V8 with Nimbus shims for fs, child_process, HTTP, and streams. They are not the upstream Node or Bun binaries. python is Pyodide CPython 3.13. ruby is ruby.wasm 3.3. clang is LLVM 8 with a modern wasi-libc sysroot. It compiles C in the session to wasm32-wasi-nimbus, including multi-file builds, user headers, and fopen against session files. -pthread is refused, because that sysroot ships no wasm32-wasip1-threads libc to link against. Nimbus runs pthread programs correctly. To run one, build it with a full wasi-sdk and the futex shim from the design note, then run the .wasm in a session.

Package installers check the ABI:

Terminal window
npm install zod # ~6 s cold; warm installs 9–16× faster
npx cowsay hello # shebang dispatch + auto-install fallback
pip install flask # pure wheels from PyPI (alpha)
gem install rack # pure gems from RubyGems (alpha)

npm works against the live registry. Tarballs cache in R2 across sessions, large dependency trees shard across peer DOs, and a 611-package app installs in ~165 s cold. pip and gem are alpha. Pure packages work end to end, and Flask and Rack apps run in preview tabs. Curated source artifacts and declared Pyodide extension modules also work. Runtimes are packages too. Run python before installing it and the shell prints the install hint.

The terminal below asks for a runtime that is not installed, installs it with nimbus install, and opens the CPython REPL it just fetched. The install pulls ~19 MiB of Pyodide from the content-addressed cache, usually seconds, up to a minute cold.

nimbus — toolchains

Live sandbox — connecting…

Native artifacts do not work. Manylinux wheels, native gems, .node addons, and ELF files fail before import with an exact ABI diagnostic.