What Paddock touches on your machine
Paddock drives Claude Code, so it runs next to state you already have: a login,
transcripts, a curated CLAUDE.md, maybe an MCP server or two. This page is the
single answer to what does it actually touch? — stated as a guarantee you can
read rather than a property you have to infer.
Every switch mentioned here lives in the claude: block of
paddock.config.yaml,
which has the per-key detail. This page is the summary and the default posture.
The short version
Section titled “The short version”Out of the box, Paddock keeps everything inside its own data directory, with one deliberate exception: it uses the Claude Code login you already have.
That exception exists because isolation is about writes. Reading a login
creates, moves and deletes nothing — and defaulting it the other way produces an
instance that boots cleanly, reports itself ready, and then fails every single
turn with Not logged in.
The default posture, file by file
Section titled “The default posture, file by file”| On your machine | By default | Governed by |
|---|---|---|
~/.claude/.credentials.json (Linux, Docker) | read — symlinked in, never copied | credentials |
| macOS Keychain login | read — the unscoped entry claude /login wrote | credentials |
~/.claude/settings.json | read — see below | hooks |
~/.claude/CLAUDE.md | not read | instructions |
~/.claude/agents/, commands/, plugins/ | not read | instructions |
~/.claude/projects/ (your transcripts) | not read, not written | transcripts |
~/.claude.json (your MCP servers) | not opened | mcpServers |
Anything else in $HOME | not touched | — |
The directory you ran paddock in | not touched, unless you pass --here | — |
Nothing in that table is written to by default. The only write Paddock ever
makes outside its data directory is under transcripts: host, where it creates
(mkdir -p) the encoded project folder under ~/.claude/projects/ — a directory
Claude Code itself would create the first time you ran claude there.
Where Paddock’s own state lives
Section titled “Where Paddock’s own state lives”Everything else is in one directory — ~/.paddock unless you pass --data-dir,
or <dir>/.paddock under --here. Move it to move the instance; delete it to
start over.
Inside it, the piece that matters here is <data-dir>/claude-home: Paddock’s
own Claude home, which it always owns. It is not your ~/.claude and cannot be
made into it — Paddock refuses to start if CLAUDE_CONFIG_DIR or a
claudeHome: key resolves there. That single value is what coupled every concern
on this page together before v0.62, and it also breaks agent memory, because the
harness will not write to a path containing a .claude component.
The settings.json special case
Section titled “The settings.json special case”This is the one default that is neither “isolated” nor “shared”, so it is worth stating plainly.
hooks defaults to own, meaning the shell commands in your
~/.claude/settings.json do not run inside Paddock turns. But that file is a
mixed bag — it carries hooks and permissions, model, statusLine — and a
symlink is all-or-nothing. So Paddock reads it and:
- if it defines no hooks, symlinks it in unchanged;
- if it does, writes its own copy into
<data-dir>/claude-homecarrying your other keys withhooksdropped, regenerated at every startup; - if it will not parse, plants nothing at all, rather than falling back to a symlink that would hand over exactly the hooks the key exists to withhold.
A settings.json you place in Paddock’s own Claude home yourself is never
clobbered: Paddock recognises its own generated file by hash, so editing it makes
it yours.
What --here does, and does not, decide
Section titled “What --here does, and does not, decide”paddock --here opens the current directory as the workspace. It creates
.paddock/ and .chats/ there and adds both to .gitignore, and it offers any
Claude Code sessions you already have for that directory for import.
It decides nothing else. In particular it does not change where transcripts
live or which login is used — those are transcripts and credentials,
independently of the flag and of each other. (In 0.61.1 the flag did decide both;
that is why it was removed as a lever.)
Import copies, never moves: your own history stays where it is, and nothing is imported until you confirm.
Turning sharing on
Section titled “Turning sharing on”Each key is independent, and each takes own (Paddock’s, isolated) or host
(this machine’s Claude Code):
claude: transcripts: own # own | host — default own credentials: host # own | host — default host instructions: own # own | host — default own hooks: own # own | host — default own mcpServers: own # own | host — default ownThe two people most often want:
instructions: host— load your~/.claude/CLAUDE.md,agents/,commands/andplugins/. If you keep a curated user-levelCLAUDE.md, this is the key you want; it is off by default and Paddock’s notice about that is easy to miss (see below).transcripts: host— make a Paddock chat and aclaude --resumein the same directory the same file, live in both directions. Deleting such a chat then releases it rather than removing it, because the transcript is your history rather than Paddock’s copy.
Going the other way, credentials: own is the opt-out from the one default
exception: Paddock will then use only a token in its environment or a login
inside its own Claude home, and a .credentials.json symlink planted by an
earlier boot is withdrawn on the next start.
Credentials you hand to Paddock
Section titled “Credentials you hand to Paddock”Separately from the claude: block, a sibling
mcpServers: block
declares MCP servers to Paddock itself — and it is the one place you type a
credential into Paddock’s own config. Two properties, and one limit:
env:VAR_NAMEis a reference, not a value. Written anywhere a string goes, it is resolved from the environment at startup, so the token stays out of the file — which matters, because that file is git-tracked and writable from the Config screen. An unset variable drops that one server with a warning naming it, rather than starting it without its credential.- Nothing Paddock says about the block contains a value from it. Every
notice, warning and error routes through one renderer that counts
argsandenventries rather than printing them, and strips a URL’s query, fragment and userinfo. There is deliberately no row for the block on the Config screen, so it cannot reach an API response either.
Verifying it yourself
Section titled “Verifying it yourself”Paddock reports what it bridged, what it withheld and which login it found at
startup — but several of those notices are written at info, and the npx
launcher sets LOG_LEVEL=warn. So on the most common install path you will not
see them. Ask explicitly:
npx @edspencer/paddock --verboseTo check the claim rather than the report, look at what is actually in Paddock’s
home — under the defaults, the only thing bridged from ~/.claude is your login:
ls -l ~/.paddock/claude-homeAnd to confirm nothing of yours is being written to, the transcripts your own
terminal claude wrote are untouched under the default transcripts: own:
ls -l ~/.claude/projectsSee also
Section titled “See also”- Config file — the
claude:block — every key in depth - Environment variables — the
PADDOCK_CLAUDE_*overrides - What your agents can do — the tools a turn can reach
- Securing Paddock — who can start a turn in the first place