Skip to content

Toolchains & packages

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 upstream Node or Bun binaries, but they are not stubs. 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 at link time because partial wasi-threads support could corrupt data — the design note explains why.

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; probes run Flask and Rack apps 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 isn’t 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 don’t work. Manylinux wheels, native gems, .node addons, and ELF files fail before import with an exact ABI diagnostic.