kvbox.sh
Use cases

Coding agents

Run Claude Code or another agent inside a box with full permissions, or let the agent on your laptop drive boxes.

A coding agent works best when it can run anything: install packages, start servers, delete files. A box lets it do that without risk to your laptop. It is a real VM with its own kernel, and nothing on the host is visible from inside.

An agent inside a box

Claude Code comes with the base image, next to Node.js, Python, Docker and a headless Chrome with agent-browser, so the agent can build, run and click through what it makes. Keep your API key as a secret so every box has it, then make a box:

kvbox env set ANTHROPIC_API_KEY --secret      # asks for the value, never shown again
kvbox new agent --size m
kvbox connect agent

Another agent (Codex, OpenCode, …) installs the usual way: the kvbox user has passwordless sudo. Inside, clone your repo and start the agent with full permissions (claude --dangerously-skip-permissions): the box is the boundary. Start it inside tmux (sudo apt install tmux) and it keeps working when you close your laptop; kvbox connect agent and tmux attach later pick the session up again.

When the agent builds something with a web UI, give the box an address to look at it: kvbox claim agent my-agent --port 3000 (Publish ports).

One box per task

Once a box has the agent, your repo and its dependencies, snapshot it. Each new task then starts from that state in under a second, in its own box:

kvbox snapshots new agent agent-ready
kvbox new --from agent-ready fix-login
kvbox new --from agent-ready add-billing

The boxes cannot reach each other unless you link them, so two agents never step on each other's files or ports. Remove a box when its work is merged: kvbox rm fix-login -y.

The agent on your laptop drives boxes

The other way around: your agent stays on your machine and uses boxes as its places to run things. Give it the kvbox skill:

npx skills add https://kvbox.sh/kvbox/SKILL.md

It then makes boxes, runs commands with kvbox exec (whose exit code is the command's) and reads results with --json. See Agents.

On this page