Skip to main content

Use cases

Each case below was run in a real VM.

Claude Code in the browser​

An agent with no brakes, in a box. Claude Code runs inside a MicroVM with --dangerously-skip-permissions: it edits, installs and executes without asking, because whatever goes wrong stays in the VM.

rc machine create --name agent --image node:22 --net -e IS_SANDBOX=1 \
--init "npm install -g @anthropic-ai/claude-code"
rc machine start --name agent
rc machine web-terminal --name agent -- claude --dangerously-skip-permissions
web terminal Β· runner.codes
β–β–›β–ˆβ–ˆβ–ˆβ–›β–ˆ Claude Code v2.1.304 β–β–œβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–€ Opus 5.5 Β· Claude Max ▝▝ ▝▝ /tmp/demo

❯ Write a tiny Python web server that answers "hello from the playground" on port 8000, start it in the background and check it with curl.

Ran 2 shell commands

● curl isn't installed here, so I'll check the server with Python's HTTP client instead.

Ran 1 shell command

● The server is running in the background on port 8000 and answers hello from the playground. I couldn't check it with curl because curl isn't installed in this environment. Instead I fetched the page with Python's built-in HTTP client and got 200 text/plain with that text.

  • Code: /tmp/demo/server.py uses only Python's standard library and answers any GET request.
  • Log: /tmp/demo/server.log records each request.

To check it with curl yourself, install it first (for example ! apt-get install -y curl), then run curl localhost:8000. To stop the server, run pkill -f server.py, or kill its process ID if pkill isn't available either (pgrep wasn't).

✻ Churned for 15s · done 4:18 PM

──────────────────────────────────────────────────────────────────────────────────────────────────── ❯ install curl and check it ──────────────────────────────────────────────────────────────────────────────────────────────────── ⏡⏡ bypass permissions on (shift+tab to cycle)

Real session (2026-10-20): Claude Code wrote and started a server on port 8000, and the port became a tab.
WhatHow
projectthe host folder mounted at /workspace: what the agent writes shows up there
terminalrc machine web-terminal: 127.0.0.1 only, with a token in the URL
root without confirmationIS_SANDBOX=1 in runner.code; without it Claude refuses --dangerously-skip-permissions as root
portsany server the agent starts (uvicorn, Vite, a database) becomes a tab at the end of the bar, with the app inside, and answers on your computer's 127.0.0.1. The shell tab gives a separate terminal and eventos shows what opened and closed
SSH[auth] ssh_agent = true: git push with the host's keys, which never enter the VM
loginonce, via the subscription /login or an API key; it lives in /root/.claude on the machine's disk and survives a stop
resumeclosing the tab stops nothing; to pick up after exiting: rc machine web-terminal --name agent -- claude --dangerously-skip-permissions --continue
API key that never enters the VM--credential [email protected]:set-header=x-api-key

Every tab open on the same URL shares one PTY: resizing one window changes the size for all of them.

Try it: claude-in-chrome.runner.codes​

The same terminal, published: at claude-in-chrome.runner.codes each visitor gets a machine of their own with Claude Code open and no permission prompts. You run /login with your own account, and the login stays on your machine only.

claude-in-chrome.runner.codes
claude: session started
shell: session started
port 8000 opened on the machine
Real events from a playground machine: the port 8000 server opens at https://8000-<id>.runner.codes/.
WhatHow
machineone Fly Machine per visitor (Fly exposes no /dev/kvm, so the microVM is Fly's), 2 vCPUs and 2 GiB
who you arethe browser visitorId (FingerprintJS v3, MIT) only picks which machine is yours; the terminal token is a server HMAC
portsany server you start answers at https://<port>-<id>.runner.codes/ and becomes a tab
networkopen internet; the Fly private network and the /.fly/api proxy are closed to the visitor
limit3 machines; with all of them in use the page says "playground is full"
time30 min idle stops it; 24 h without use deletes the machine and its disk

The code lives in cmd/rc-playground (the front), cmd/rc-visitor (inside each machine) and deploy/playground/flake.nix (the images, built with Nix). The step-by-step operation is in the runbook, section 8w.

Code playground​

Exercises, auto-grading, documentation sandboxes: each submission runs in a fresh MicroVM, with no network, and is gone at the end. 15 languages through the same route, 26–43 ms per request with the pool warmed. See the HTTP API.

rc serve --listen 127.0.0.1:8080 --pool-size 2
curl -s -X POST http://127.0.0.1:8080/api/v1/run -H 'content-type: application/json' \
-d '{"language":"python","stdin":"oi","files":[{"name":"main.py","content":"print(input().upper())"}]}'

Local LLM on the GPU​

llama.cpp with Vulkan inside the VM, talking to the host GPU through virtio-gpu (Venus β†’ MoltenVK β†’ Metal): 56.7 tokens/s on the GPU versus 10.3 on the CPU (Qwen2.5 0.5B). No host directory is mounted unless you declare a volume. Details in GPU.

Desktop in the browser​

The browser screen (--display), with keyboard and mouse, at http://127.0.0.1:6080: for testing a GUI app or letting an agent use a screen. Details in Display in the browser.

Desktop with Claude Code, operated by an agent​

examples/desktop-claude/runner.code sets up an XFCE desktop in the microVM: black background, the Arquivos, Claude, Navegador and Terminal shortcuts, Firefox as the default browser and Claude Code installed. The screen follows the browser window, every application opens maximized, and a logout brings the session back on its own.

cd examples/desktop-claude
rc machine create --name desk
CLAUDE_CODE_OAUTH_TOKEN=... rc machine start --name desk # the guest only sees a placeholder of the token
open http://127.0.0.1:6080

From there, three ways to send work to that VM's Claude, all through the Go SDK (examples/desktop-claude-agent): claude -p via exec (answer in JSON), the task typed into its window, or typed through the screen API. And, with rc mcp, the Claude Code on your machine operates the VM's screen the way it operates a browser: screenshot, click, keyboard.