Isolated microVMs · bare metal
Give the agent root.
Keep the receipts.
Caged runs Claude Code, Aider, Codex and your own MCP agents inside isolated microVMs, each with its own Linux kernel. Every file write, every command and every LLM call is recorded, priced and replayable.
- OWN LINUX KERNEL
- 128 GB HOST
- PER-MINUTE METERING
- FULL SESSION REPLAY
Runs
- Claude Code
- Aider
- OpenAI Codex CLI
- Grok CLI
- Cline
- Continue CLI
- Goose
A container is a shared kernel with good manners. A microVM is a wall.
Namespaces and cgroups are scheduling and accounting features of one kernel that every tenant shares. Code an agent wrote an hour ago does not need an exotic exploit to matter there — it needs one bug in a syscall you have never heard of. A Caged sandbox boots its own Linux kernel and its own root filesystem on KVM, so the thing an agent can break is the machine you gave it.
How it works
From caged run to a session you can scrub through.
- 01 BOOT
A machine of its own
Allocate, kernel, rootfs, ready: every sandbox is a microVM with its own Linux kernel, its own root filesystem and its own network interface on KVM. No kernel is shared with another tenant.
- 02 OBSERVE
Everything is on the record
File operations, commands, tool calls, LLM calls, network requests, desktop actions, errors and lifecycle changes — eight event types, one append-only stream, written as they happen.
- 03 PRICE
Tokens and minutes, as they burn
LLM spend is metered at the egress proxy against a per-model token table. Compute is metered per minute against the tier you booted. The dollar figure exists during the session, not at the end of the month.
- 04 JUDGE
Behaviour moves a score
Reading a secrets file, escalating privilege, calling an unknown host, running something destructive: each is a shipped rule with a fixed deduction, applied as the event arrives, before you read the diff.
Isolation
The blast radius is the VM.
Own kernel per sandbox
A microVM on KVM with its own kernel image and its own rootfs drive. A VM boundary, not a namespace.
No sandbox reaches another
Traffic addressed to the guest subnet is dropped in every network mode, ahead of any allowlist rule. No dev server, debug port or agent socket is reachable from a neighbour.
LLM egress goes through one proxy
The egress proxy is the first accepted destination in every sandbox's chain, and it is where tokens are counted and policy is applied.
Destroy is destroy
Teardown removes the packet-filter rules, the TAP device, the API socket and the VM directory with its rootfs overlay. The event record outlives all of it.
1
Kernel per sandbox
0
Routes between sandboxes
3
Network modes
Observability
Scrub back to the command that broke it.
A session is an ordered event stream, so it replays. Read the commands in the order they ran, the files as they changed, and the LLM calls that asked for them — after the fact, from the record, not from a log you hoped someone kept.
Workforce
You don’t start a session. You hire someone.
A sandbox lasts as long as the work in it. A Persona is the thing that keeps a name, a role, a harness and a record across all of them — and the thing an autonomy tier is attached to.
A Persona outlives the session
A name, a job title, the harness it runs, an autonomy tier, a trust score. It is hired, it can be paused, and once it is offboarded it does not come back — you hire another one.
A Shift is a session with a badge
Starting one opens a session bound to that Persona and mints a credential that expires. Ending the Shift revokes it; so does destroying the sandbox. Only an active Persona gets one.
A Team is an org chart, not a tag
Every member has at most one manager, cycles are refused when the edge is written, and the depth of any chain is capped — so asking for someone's reports or their manager chain always terminates.
The tier decides what needs a human
Probation, supervised, trusted, autonomous. Each compiles to a policy the tool gate evaluates on every call, and a tool that is not in the table is refused at every tier — including autonomous.
Pipelines
A run that can wait for a human.
A pipeline is a directed graph of stages, checkpointed to Postgres at every step and cancellable while it is in flight. Here is one, in the order it ran.
- 01 COMMAND
clone
A command stage gets a microVM of its own. Caged creates it, runs the command inside it, and destroys it before the next stage starts — so one stage cannot leave state behind for the next one to trip over.
- 02 COMMAND
test
A stage that fails retries on the policy the pipeline declared: three attempts by default, ten at the ceiling, and the wait between them capped at thirty seconds. A retry loop cannot run away.
- 03 AWAIT_APPROVAL
review
Here the run stops and waits for a person. It holds no sandbox and no worker: the stage is checkpointed as paused, the goroutine returns, and a server restart leaves it exactly where it was — still waiting.
- 04 COMMAND
ship
Approval lands, the run picks up where it stopped. Stages run in dependency order, and a stage whose dependencies can never be satisfied ends the run naming the edges that stalled it rather than polling forever.
- 05 A2A
hand-off
The last stage delegates to an agent outside Caged over the Agent-to-Agent protocol. If a deployment has no delegator wired, the stage fails closed — it will not report a success it never had.
The stage names and the retried attempt are an example. The stage types, the statuses, the retry ceilings and the pause are the ones the API ships. Two stage types Caged can express are deliberately not drawn: eval gates and trust/cost gates are built without their evaluators on this deployment, and a gate with no evaluator passes by default — so it is not a gate.
Role templates
Hire from a template. Or publish one.
Nine categories, from engineering to finance to security. Private or public. Fork it, version it, rate it — and pin the version you hired, so the employee you onboarded is the one that keeps turning up.
A template is a job, packaged
The harness it runs, the tools it may call, its guardrails, the KPIs it is measured on, a budget it inherits, and the tier it starts at. Installing one hires a Persona wired to a harness built from exactly that.
A published version never changes
Editing mints the next version and snapshots it. An install pins the version it read, so a Persona hired in March is not quietly rewired in June because somebody improved the listing.
An unsafe config cannot be published
The bundled harness config is validated when the template is published, not when it is installed — by the same validator the engine uses, not a second copy of it. A marketplace is how one bad config would travel.
The marketplace metadata is honest
Install counts are incremented in the same transaction as the install they count. Forks record what they came from. The verified badge is set by curation and never by the account that published the template.
Start with one sandbox. Or wire the whole fleet.
- 01 SOLO
I want one agent off my laptop
One sandbox, one agent, a dollar figure while it runs and a session you can replay when it stops.
- 02 TEAM
I have a team running agents all day
Budgets, policies, approval gates and trust scores, with every session on the record in one place.
- 03 PLATFORM
I'm building on top of agents
The REST API, the MCP tool surface over a WebSocket, and the CLI. Bring your own agent; keep the isolation and the ledger.
Pricing
The plan is the concurrency. The meter is separate.
A plan buys how many sandboxes run at once, how long they may live and how far back the history goes. Compute minutes and LLM tokens are metered per session on top — the estimator below prices those from list rates.
Free
Free
Experiment freely
- 5 sandboxes / day
- 1 concurrent
- 30-min timeout
- 7-day history
- 1 API key
- Community support
Pro
Recommended$29
per month
Ship with AI daily
- Unlimited sandboxes
- 5 concurrent
- 4-hour timeout
- 90-day history
- Unlimited keys
- Priority support
Team
$99
per seat per month
Agents at scale
- Everything in Pro
- 15 concurrent (shared)
- Shared dashboards
- Team key mgmt
- Dedicated support
What are your agents costing you?
Price a week of agent work.
$3.00 in / $15.00 out per 1M tokens
$0.002 per minute
Estimated list cost · per week
$63.90
90 sessions · LLM is 93% of it
- LLM tokens
- $59.40
- Compute minutes
- $4.50
An estimate, not a quote: it multiplies the list rates published in Caged's billing code as of 20 September 2026 by the numbers you typed. Disk is not billed and network egress is not billed, so neither appears above. Your real figure comes from the meter on a real session.
Trust
Behaviour, scored. Not vibes.
Every session starts at 100. As events arrive, each one is put to a fixed set of rules, and a match moves the score by a fixed amount — the same amount, every time, for every agent. The score is arithmetic over what happened, not a judgement about what an agent meant.
- −50crypto_miningMining binaries or pool addresses in a command
- −30destructive_commandDestructive command — recursive delete, dropping a database
- −25env_secrets_accessRead of a secrets or .env file
- −20sudo_chmodPrivilege escalation — sudo, chmod 777, chown root
- −15suspicious_networkRequest to a host outside what the sandbox was given
- +5Commit, branch, push
- +3Running the tests
- +1An ordinary code file written
A score is clamped to 0–100. The deductions and credits above are the built-in rules; a policy can add its own.
Developers
Three lines, then it's running.
caged login
caged run --template node-20 --budget 5.00
caged connect sbx_7f3a9c21curl -X POST https://api.caged.dev/v1/sandboxes \
-H "Authorization: Bearer $CAGED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "node-20",
"cpus": 2,
"memory_mb": 512,
"agents": ["claude-code"],
"budget": 5.00
}'# JSON-RPC over the sandbox's MCP socket
# wss://api.caged.dev/v1/sandboxes/sbx_7f3a9c21/mcp
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "terminal_exec",
"arguments": { "command": "pnpm test" }
}
}Config as code
caged upreads a .caged.yaml, so a sandbox definition lives in the repo it works on.A budget is an argument
--budget 5.00is a ceiling on the session, set at the point you start it.Tools, not a shell wrapper
The MCP surface exposes filesystem, terminal, git, process, screen and HTTP tools, each one an observed event.
Questions people actually ask.
How is this different from running the agent in a container?
A container shares the host kernel with every other container on the machine; isolation is namespaces and cgroups inside one kernel. A Caged sandbox is a Firecracker microVM on KVM with its own kernel image and its own root filesystem, so the boundary an agent would have to cross is the virtual-machine boundary rather than a syscall filter.
What exactly gets recorded?
Eight event types: file operations, commands, tool calls, LLM calls, network requests, desktop actions, errors and lifecycle changes. They are appended in order against the session, which is what makes a session replayable afterwards rather than only observable live.
Which agents can I run?
The catalogue is Claude Code, Aider, OpenAI Codex CLI, Grok CLI, Cline, Continue CLI and Goose. Anything that speaks MCP can also drive a sandbox through the sandbox's own MCP WebSocket, which is how a custom agent gets the same recording and the same metering.
How does the cost model work?
Two meters. LLM tokens are priced per model against a published input/output table as calls pass the egress proxy. Sandbox compute is priced per minute against the size you booted, across six vCPU-and-memory tiers. Disk is not billed, and network egress is not billed. A session can carry a budget ceiling set when you start it.
Can one sandbox reach another?
No. Traffic addressed to the sandbox subnet is dropped in every network mode, and that rule sits ahead of any allowlist a sandbox was given, so neither a mode nor an operator's allowlist can open a path between two sandboxes. Outbound internet access is a separate question, and it depends on the network mode you choose: full, allowlist or none.
What happens when I destroy a sandbox?
The packet-filter rules, the virtual network interface, the hypervisor socket and the VM directory with its root filesystem overlay are all removed. The session record does not go with it — that is the point of recording it somewhere the sandbox cannot reach.
Cage your agents. Free your machine.