Pular para o conteúdo principal

Casos de uso

Cada caso abaixo foi rodado numa VM real.

Claude Code no navegador​

Um agente sem freio, numa caixa. O Claude Code roda dentro de uma MicroVM com --dangerously-skip-permissions: ele edita, instala e executa sem pedir confirmação, porque o que der errado fica na 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
terminal web · 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)

Sessão real (20/10/2026): o Claude Code escreveu e subiu um servidor na porta 8000, e a porta virou uma aba.
O quêComo
projetoa pasta do host montada em /workspace: o que o agente escreve aparece nela
terminalrc machine web-terminal: só em 127.0.0.1, com token na URL
root sem confirmaçãoIS_SANDBOX=1 no runner.code; sem ele o Claude recusa --dangerously-skip-permissions como root
portasqualquer servidor que o agente subir (uvicorn, Vite, um banco) vira uma aba no fim da barra, com a app dentro, e responde no 127.0.0.1 do seu computador. A aba shell dá um terminal à parte e eventos mostra o que abriu e fechou
SSH[auth] ssh_agent = true: git push com as chaves do host, que não entram na VM
loginuma vez, pelo /login da assinatura ou pela chave da API; fica em /root/.claude no disco da máquina e sobrevive ao stop
continuarfechar a aba não para nada; para retomar depois de sair: rc machine web-terminal --name agent -- claude --dangerously-skip-permissions --continue
chave da API sem entrar na VM--credential [email protected]:set-header=x-api-key

Todas as abas abertas na mesma URL dividem um PTY: redimensionar uma janela muda o tamanho para todas.

Experimente: claude-in-chrome.runner.codes​

O mesmo terminal, publicado: em claude-in-chrome.runner.codes cada visitante ganha uma máquina própria com o Claude Code aberto sem confirmação de permissão. Você faz o /login com a sua conta, e o login fica só na sua máquina.

claude-in-chrome.runner.codes
claude: sessão iniciada
shell: sessão iniciada
porta 8000 aberta na máquina
Eventos reais de uma máquina do playground: o servidor da porta 8000 abre em https://8000-<id>.runner.codes/.
O quêComo
máquinauma Fly Machine por visitante (o Fly não expõe /dev/kvm, então a microVM é a do Fly), 2 vCPUs e 2 GiB
quem é vocêo visitorId do navegador (FingerprintJS v3, MIT) só escolhe qual máquina é sua; o token do terminal é HMAC do servidor
portasqualquer servidor que você subir responde em https://<porta>-<id>.runner.codes/ e vira uma aba
redeinternet aberta; a rede privada do Fly e o proxy /.fly/api ficam fechados para o visitante
teto3 máquinas; com todas em uso a página avisa "playground is full"
tempo30 min sem uso desliga; 24 h sem uso apaga a máquina e o disco

O código está em cmd/rc-playground (o front), cmd/rc-visitor (dentro de cada máquina) e deploy/playground/flake.nix (as imagens, pelo Nix). A operação passo a passo está no runbook, seção 8w.

Playground de código​

Exercícios, correção automática, sandbox de documentação: cada envio roda numa MicroVM nova, sem rede, e some no fim. 15 linguagens pela mesma rota, 26–43 ms por requisição com o pool aquecido. Veja a API HTTP.

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())"}]}'

LLM local na GPU​

llama.cpp com Vulkan dentro da VM, falando com a GPU do host por virtio-gpu (Venus → MoltenVK → Metal): 56,7 tokens/s na GPU contra 10,3 na CPU (Qwen2.5 0.5B). Nenhum diretório do host é montado, a menos que você declare um volume. Detalhes em GPU.

Desktop no navegador​

A tela do navegador (--display), com teclado e mouse, em http://127.0.0.1:6080: para testar app gráfico ou deixar um agente usar uma tela. Detalhes em Tela no navegador.

Desktop com Claude Code, operado por um agente​

O examples/desktop-claude/runner.code monta um desktop XFCE na microVM: fundo preto, os atalhos Arquivos, Claude, Navegador e Terminal, o Firefox como navegador padrão e o Claude Code instalado. A tela acompanha a janela do navegador, todo aplicativo abre maximizado, e um logout religa a sessão sozinho.

cd examples/desktop-claude
rc machine create --name desk
CLAUDE_CODE_OAUTH_TOKEN=... rc machine start --name desk # o guest só vê um placeholder do token
open http://127.0.0.1:6080

Daí, três jeitos de mandar trabalho ao Claude dessa VM, todos pelo SDK Go (examples/desktop-claude-agent): claude -p por exec (resposta em JSON), a tarefa digitada na janela dele, ou digitada pela API de tela. E, com o rc mcp, o Claude Code da sua máquina opera a tela da VM como opera um navegador: print, clique, teclado.