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
❯ 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)
| O quê | Como |
|---|---|
| projeto | a pasta do host montada em /workspace: o que o agente escreve aparece nela |
| terminal | rc machine web-terminal: só em 127.0.0.1, com token na URL |
| root sem confirmação | IS_SANDBOX=1 no runner.code; sem ele o Claude recusa --dangerously-skip-permissions como root |
| portas | qualquer 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 |
| login | uma vez, pelo /login da assinatura ou pela chave da API; fica em /root/.claude no disco da máquina e sobrevive ao stop |
| continuar | fechar 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.
https://8000-<id>.runner.codes/.| O quê | Como |
|---|---|
| máquina | uma 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 |
| portas | qualquer servidor que você subir responde em https://<porta>-<id>.runner.codes/ e vira uma aba |
| rede | internet aberta; a rede privada do Fly e o proxy /.fly/api ficam fechados para o visitante |
| teto | 3 máquinas; com todas em uso a página avisa "playground is full" |
| tempo | 30 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.