Skip to content

Storage Layout

ccpod stores everything under ~/.ccpod/ plus a small set of Docker named volumes. There is no global database, no daemon, no hidden state.

~/.ccpod/
├── profiles/
│ ├── default/
│ │ ├── profile.yml # the profile definition
│ │ ├── .ccpod-sync-lock # last git-sync timestamp (if source: git)
│ │ └── config/ # cloned Claude config (only if source: git)
│ └── team/
│ └── profile.yml
├── credentials/
│ ├── default/ # auth tokens for "default" profile
│ └── team/ # auth tokens for "team" profile
└── state/ # only when state: persistent
├── default/ # projects, todos, history for "default"
└── team/

In tests this can be redirected with CCPOD_TEST_DIR.

NamePurposeLifetime
ccpod-plugins-<profile>Installed Claude pluginsPersists across runs; recreated by ccpod plugins update

Plus per-project networks for sidecars: ccpod-net-<sha256($PWD)>.

When state: persistent, Claude’s history, projects, todos, and sessions are stored on the host at:

~/.ccpod/state/<profile>/

This is a plain host directory (not a Docker volume), so it survives host reboots and is easy to back up or inspect. Wiped by ccpod state clear.

Inside a Claude container:

MountSourceMode
/workspace$PWD on hostrw bind
/ccpod/config/tmp/ccpod-<hash>/ (merged config)ro bind
/ccpod/credentials~/.ccpod/credentials/<profile>/rw bind
/ccpod/pluginsccpod-plugins-<profile>volume
/ccpod/state~/.ccpod/state/<profile>/ or tmpfsrw bind / tmpfs

Two files in your repo control behavior:

FilePurpose
.ccpod.ymlProject config — overlays the profile. ccpod walks up from $PWD to find it.
.mcp.jsonStandard Claude MCP config; ccpod auto-exposes HTTP/SSE ports if ports.autoDetectMcp: true.

Both are optional.