guides
Coding agent sandbox (mounted repo)
Isolated agent or tool in a microVM with your repo mounted read-write.
Run an agent (or any tool) inside an isolated Linux microVM, with your repo mounted read-write, then copy results back to the host.
Prerequisites
grain up
grain image pull # once
grain doctor # QEMU + image OK
# Optional but recommended for grain x / grain cp without SSH:
just agent-linux # from a source checkout1. Create a sandbox with the repo mounted
From your project root:
grain new \
-n agent \
-c 4 -m 4096 -d 20 \
-v "$(pwd):/work" \
--wait agent| Flag | Why |
|---|---|
-n agent | stable name for scripts |
-c / -m | room for builds and LLMs-in-guest |
-v …:/work | virtio-9p share of the host checkout |
--wait agent | ready when guest agent is healthy (falls back to SSH deploy if needed) |
Persistent disk (keep state across stop/start):
grain new -n agent -p -v "$(pwd):/work" --wait agent2. Check the guest
grain agent health agent
grain x agent -- uname -a
grain x agent -- ls -la /work3. Run the agent (or your toolchain)
Examples:
# Install toolchain once (ephemeral VM: re-do after rm)
grain x agent -- sudo apt-get update
grain x agent -- bash -lc 'cd /work && make test'
# Or invoke whatever agent binary/script you use:
grain x agent -- bash -lc 'cd /work && ./scripts/run-agent.sh'Prefer a profile for repeated agent work (~/.grain/config.yaml):
profiles:
coding-agent:
cpus: 4
memory_mb: 4096
disk_gb: 20
mounts:
- {host: ".", guest: "/work"}grain new --profile coding-agent -n agent --wait agent4. Copy results out
Agent-preferred copy (NAME:path):
# guest → host
grain cp agent:/work/out/report.json ./report.json
grain cp agent:/tmp/agent-log.txt ./agent-log.txt
# host → guest
grain cp ./prompts/system.md agent:/work/prompts/system.mdForce agent or SSH:
grain cp --agent agent:/work/out ./out
grain cp --ssh agent:/work/out ./outList guest paths without SSH:
grain fs ls agent /work
grain fs stat agent /work/out5. Tear down
grain rm agent # ephemeral: gone
# or keep disk:
grain stop agent
grain start agent # later6. Optional: allowlisted egress proxy
Keep API tokens on the host and deny other outbound HTTP(S) via the proxy:
grain proxy up
grain proxy client create agent
grain secret set model-key --value '…'
grain proxy allow --host api.example.com --secret model-key
grain new --proxy -n agent -v "$(pwd):/work" --wait agentGuests use HTTPS_PROXY=http://TOKEN@10.0.2.2:3128 (SLIRP gateway). See
proxy.md for default-deny rules, listen address, and security notes.
Tips
- 9p mounts are great for source; heavy I/O (node_modules, caches) is happier on the guest disk under
/home/ubuntuor/var/tmp. - First boot with package installs can take a few minutes —
grain logs -f agent. - Golden image with agent baked in skips SSH deploy: see images.md and
scripts/bake-golden.sh. - For CI-style one-shot create/exec/rm, see ci-ephemeral.md.
- For host-side default-deny HTTP(S) egress, see proxy.md.