Capabilities & limits
The README capability table is the source of truth. Black-box probes drive a
real session over POST /new and WebSocket; an HTTP 200 alone isn’t a pass.
Run the suite against any live deployment:
BASE=https://nimbus-os.dev bun test:behavioral- ShellReal shell, 60+ Unix commands, persistent 10 GB filesystemworks
- Runtimesnode, bun via Cloudflare workerd nodejs_compat (V8 + Node-API shim, not the upstream binaries)works
- Runtimespython / python3 — Pyodide-based CPython 3.13 (script + -c + -m + stdlib)works
- Runtimesruby / ruby3 — ruby.wasm-based Ruby 3.3 (script + -e + -r + stdlib)works
- Runtimesclang — LLVM 8 → wasm32-wasi-nimbus, modern wasi-libc sysroot default, multi-TU + user headers + fopenworks
- RuntimesInteractive REPLs — python, ruby, node, bunworks
- Packagesnpm install against the live registry, with cross-session L2 cacheworks
- Packagesnpm alias dependencies such as alias: "npm:<pkg>@<version>"works
- Gitgit clone over HTTPS — chunked checkout engine; facebook/react (7,300 files) in ~28 s; 84,000-file worktrees materialize via bounded continuationworks
- NetworkIn-session loopback networking — curl http://127.0.0.1:<port> reaches servers in other isolates; node server.js auto-promotes to a routeable resident processworks
- NetworkStreaming HTTP through the fabric — SSE / chunked bodies flow live (per-chunk) across the isolate boundary, loopback and external preview alikeworks
- ShellUnix permissions groundwork — durable st_mode, real chmod (octal + symbolic), exec-bit enforcement: ./binary runs only if executable (Permission denied, exit 126 otherwise), generic #! shebang dispatchworks
- ProcessesMulti-isolate processes — client/server apps span facets (opencode runs as a serve + attach pair, each in its own isolate)alpha
- Dev serversVite SPA dev server — full HMR to the preview iframeworks
- Dev serverswrangler dev for single-file Workers; Workers + Static Assetsworks
- SDKProgrammatic sandbox SDK — exec/files/runtimes/processes/ports/Proteus-style toolsworks
- ProcessesJS agent CLI primitives — env/home, npm/npx, child_process.spawn/exec/execFile, piped stdio, streams, logsworks
- ProcessesForeground attached npm-bin TTY tabs — stdin, resize, ANSI output, clean exit; Pi official installer and npm path probedalpha
- PackagesPython package workflows — pip, PyPI pure wheels, requirements/constraints, curated pure source artifacts, declared Pyodide startup-module packages, Flask, python -m flask run, python -m http.server previewalpha
- PackagesRuby package workflows — gem, bundle, pure gems, Rack/WEBrick previewalpha
- AgentSession Agent — editor-workspace chat with Cloudflare OAuth / Workers AI and sandbox toolsworks
- Packagesnpx <pkg> — first-class shebang + auto-install fallbackworks
- Packagesnode_modules/.bin/* resolves and executesworks
- ShellBinary file round-trip via fs.writeFileSync / readFileSyncworks
- ShellSession recovery — WebSocket drop → reconnect preserves cwd, env, filesworks
- RuntimesWASI preview1 — 45 of 46 spec functions; outbound TCP via path_open('/dev/tcp/<host>/<port>') (JSPI); full poll_oneoff (fd / clock / socket subscriptions)works
- Runtimeswasi-threads (thread_spawn) — refused at link timenot supported
No capabilities match that filter.
Mirrors the README capability table— the live-probed source of truth, covered by the behavioral suite intests/behavioral/.
The “no” list
Section titled “The “no” list”Nimbus is built on Workers, Durable Objects, and WASM, not as a Linux VM. A workload that needs one of these missing parts belongs on a microVM or container sandbox (where Nimbus fits).
| Not supported | |
|---|---|
| Docker, apt, custom Linux images | no container substrate exists |
| Native Linux ELF execution | there is no ELF loader |
| Native platform CLI shards, manylinux wheels, native gems | fail before import with an exact ABI diagnostic |
| Raw public TCP listeners | inbound is HTTP(S) through session routes |
Next.js dev server, wrangler pages dev |
explicit limits today |
| GPUs | — |
wasi-threads / -pthread |
refused at link time (design note) |
Known constraints
Section titled “Known constraints”| Constraint | State |
|---|---|
| One active terminal owner per session | sequential reconnect/share preserves state |
node/bun REPL declarations don’t persist |
workerd CSP; scripts unaffected; Python/Ruby REPLs fully stateful |
| 75,000+-object clones | index-pack CPU headroom in progress |
| git transport | HTTPS only, no SSH |
| opencode TUI | serve half boots and streams SSE; attach half renders frames on a thin memory margin, still hardening |
| Hosted demo | evaluation only — no SLA, may be reset, not for secrets |
Verified live: Vite + React, the Cloudflare Vite Plugin, single-file Workers, Workers with Static Assets, npm and git workflows, Python and Ruby scripts, and clang. Astro, SvelteKit, and Remix use the Vite path. Nuxt has Nitro caveats.
A capability joins this list only after a behavioral probe proves it live. Until then it stays on the research page.