Docker for your coding agents

One workspace.
Any agent. Any harness.

Version, swap, and share the config layer that shapes how your agent thinks — CLAUDE.md plus .claude/ — as isolated, named personas.

Skills, subagents, MCP servers and permissions live as one global blob today, locked to one harness. Agent Containers turns them into containers you swap per task, snapshot like code, hand to your team — and export to OpenCode, Codex, Gemini, Kimi or Antigravity with one command.

The problem

Your agent is its config — and it is one global blob.

Claude Code's behaviour is not just the model. It is everything in CLAUDE.md and .claude/: the skills it can call, the subagents it can spawn, the MCP servers it reaches, the permissions it holds. You can't cleanly swap a coder loaded with build skills for a reviewer that deliberately lacks them. You can't version those setups. You can't hand them to a teammate.

your workspace — .claude/ is never touched
▲ acon use  swaps the active container ▲

_base

  • = shared baseline
  • = imported from your .claude/
  • = every persona layers on it

coder

  • + build / codegen skills
  • + refactor subagents
  • · write: allowed

reviewer

  • no build skills
  • write: denied
  • · read-only, by design
The killer feature

An uncontaminated reviewer.

If the same agent that wrote the code also reviews it, its judgment is shaped by the very skills and habits that produced the bug. Agent Containers builds a reviewer that is provably stripped of the coder's powers — and then attests it.

$ acon verify reviewer
 
Persona: reviewer (uncontaminated)
Skills: code-review, security-audit
Withheld skills [build, codegen, refactor]
(deliberately removed)
Denied: Write, Edit, NotebookEdit
Settings: user+project
  • Enforced, not advisory. Write tools are blocked through permissions.deny; only allow-listed skills are materialized.
  • Physically absent. Withheld skills aren't hidden — they never reach the agent's config dir at all.
  • Drift-checked. verify fails loudly if the materialized environment ever diverges from the manifest.
The killer feature · part two

Author once. Run on any harness.

You tuned your setup in Claude Code. Now you want to try OpenCode — or a teammate runs Codex, or CI uses Gemini. Containerize your Claude setup and take it with you. One command renders a persona into the target's own config layout and prints an honest report of what crossed the boundary intact and what was lost.

$ acon export coder --harness opencode
 
Persona: coder (translated → opencode)
instructions AGENTS.md
skills 5 → skills/ ok
subagents 2 → agent/*.md ~translated
mcp "mcp" object (3) ~translated
permissions allow/deny → permission map
dropped sandbox nuance
  • Claude is the source. Every other harness is an export target. Your .claude/ stays the single source of truth.
  • Honest about loss. Each artifact is marked ok, ~translated, or dropped — never a silent lossy conversion.
  • Withholding travels. A withheld skill is physically absent in OpenCode, Codex and Gemini too — not just Claude.
Claude Code
source · CLAUDE_CONFIG_DIR
OpenCode
OPENCODE_CONFIG_DIR
Codex
CODEX_HOME
Gemini CLI
GEMINI_CLI_HOME
Kimi Code
KIMI_CODE_HOME
Antigravity
file placement
AGENTS.md
the open standard
Quickstart

Up and running in four commands.

Requires Go 1.25+. acon is the Agent Containers CLI — git for your agent config.

# install the CLI go install github.com/a2ngerer/agent-containers/cmd/acon@latest
# bind this workspace — seeds _base from your existing .claude/ + CLAUDE.md acon init
# scaffold specialized containers from embedded templates acon new coder --template coder acon new reviewer --template reviewer
# swap the active agent for the task at hand acon use reviewer
# containerize your setup and take it to another harness acon export coder --harness opencode
Command reference

Everything is one verb away.

init [--from]

Bind the workspace; seed _base or clone a shared repo. Auto-detects your harnesses.

new --template

Scaffold a persona from coder / reviewer templates.

use [--harness]

Activate a persona for this workspace, on any harness.

export --harness

Materialize a persona's config for another harness.

harnesses

List supported harnesses and which are installed.

config harness

Get or set the workspace's default target harness.

snapshot / log / diff

Snapshot, history, and the capability delta between personas.

tag / rollback

SemVer-tag a snapshot, or restore a prior state.

push / pull / clone

Share over git — secret-scanned before every push.

verify

Re-attest the materialized Claude env matches the manifest.