Permission prompts
Every command Claude wants to run that isn't on the allowlist becomes a yes/no interruption. On a configured machine you've already said yes to your common ones — git, gh, ssh, scp, rclone — once.
When you run Claude Code on more than one machine — a desk PC, a laptop, a Mac in the studio, a Windows box at the shop, a droplet on the side — you want the same allowlists, the same MCP servers, the same custom commands, the same status line, the same hooks. This page is the hub. It covers syncing one user's config across machines; the five deep-dive pages below cover the rest.
Inventory of ~/.claude/, five sync methods ranked, the recommended setup, a worked settings.json for a multi-PC fleet, the permissions, hooks, MCP servers, skills, auto-memory pattern, and pitfalls. For inter-Claude communication, OS-specific behaviour, shell & terminal details, and disaster recovery — see the five sub-pages.
This page (the hub) handles the config-sync question. Each sub-page handles a topic that needs its own real treatment — same depth, same design, all interconnected. Read in any order; they cross-reference each other.
Six primitives for getting Claudes to talk: SSH+exec, shared task queues, cross-host MCP, notification routing, managed agents, and thread hand-off. Three worked end-to-end multi-Claude flows. The page you asked for when you said "communication between Claudes."
/architectureFour shapes for a Claude fleet — primary+secondaries, mesh, hub-and-spoke, cloud-as-hub — with the decision matrix, the WholeTech setup worked end-to-end, where bottlenecks live, and how to migrate between patterns without breaking anything.
/os-matrixWhere the OSes diverge: paths, line endings, junctions vs symlinks, Seatbelt vs Landlock vs nothing, schedulers (Task Scheduler, launchd, cron, systemd), per-OS gotchas, and the one-config-fits-all tricks that mostly hold up.
/terminalsWhy your shell choice affects Claude. PowerShell 7, bash, zsh, fish, the terminal emulators that host them. Quoting, hooks per shell, permission patterns per shell, profile files, and cross-shell portable scripts.
/recoveryProcedures for the nine realistic failure modes: stolen laptop, locked Anthropic account, corrupted ~/.claude/, lost API keys, blown MCP auth, dead droplet, dead NAS, lost memory file, sync conflicts. Plus the early-warning monitors and the quarterly fire drill that catches gaps before you need them.
Every Claude session you have on an unconfigured machine costs you something. Every permission prompt is an interruption. Every "I don't have that MCP server here" is a workflow that doesn't run. Every custom slash command you set up on one machine and forgot on the others is muscle memory that fails three times before you remember why. The point of syncing isn't tidiness — it's keeping Claude usefully the same wherever you sit down.
Every command Claude wants to run that isn't on the allowlist becomes a yes/no interruption. On a configured machine you've already said yes to your common ones — git, gh, ssh, scp, rclone — once.
If your Gmail MCP is wired up on the desk PC and not the laptop, the same prompt produces different work. Syncing the server list (not the secrets) keeps the toolset consistent.
/session-close, /ultrareview, your own slash commands — if they only exist on one machine, you'll forget which one and re-implement them somewhere else.
The "about me" and "things to avoid" instructions Claude reads at the start of every session. Drift here means Claude treats you differently per machine — minor but real.
The cosmetic stuff still matters when you're switching machines daily. Same theme = same scanning patterns = faster reading of diffs and logs.
The single biggest leverage point — if Claude remembers your preferences on one box and not another, "don't phone it in" has to be learned twice. (See §12 — sync this one carefully.)
On Windows that's C:\Users\<you>\.claude\; on macOS/Linux it's ~/.claude/. Below: every file and directory you're likely to find, what's in it, and — most importantly — whether you should sync it across machines.
| Path | What it is | Sync? |
|---|---|---|
| settings.json | User-level config: theme, model, permissions, hooks, MCP servers, environment, status line. | ✓ yes |
| CLAUDE.md | Personal global instructions. Read at the start of every session as "user's private global instructions for all projects". | ✓ yes |
| keybindings.json | Your custom keyboard shortcuts and chord bindings. | ✓ yes |
| commands/ | Your own slash commands. Each .md file becomes /<name>. | ✓ yes |
| agents/ | Custom subagents you've authored — each one a markdown file with frontmatter describing when to use it. | ✓ yes |
| skills/ | Skill bundles you've created or pulled in. Folder per skill, with SKILL.md and supporting files. | ✓ yes |
| plugins/ | Installed plugin bundles. Synced if you want the same plugins everywhere. | ~ usually |
| output-styles/ | Custom response-style presets (terse, narrative, code-only, etc.). | ✓ yes |
| statusline-config.json | Status-line layout you've configured (cwd, model, branch, token count, etc.). | ✓ yes |
| auth.json | Anthropic authentication credential. Tied to a single browser sign-in. Recreate per machine. | ✗ never |
| .credentials.json | Encrypted local secrets (API keys you've stored). Machine-bound. | ✗ never |
| mcp-needs-auth-cache.json | Per-machine cache of which MCP servers need (re-)authentication. | ✗ no |
| sessions/ | Log of every chat you've had on this machine. Often hundreds of MB. | ✗ no |
| shell-snapshots/ | Cached snapshots of the shell environment Claude ran in. | ✗ no |
| session-env/ | Environment variable snapshots from open sessions. | ✗ no |
| cache/ | Local cache directory for downloaded artefacts. | ✗ no |
| telemetry/ | Local usage data. Machine-specific. | ✗ no |
| file-history/ | Edit history for files Claude has touched on this machine. | ✗ no |
| paste-cache/ | Recent paste buffer cache. | ✗ no |
| tasks/ | In-flight task records for the harness. | ✗ no |
| history.jsonl | Append-only log of all prompts you've ever typed on this machine. | ✗ no |
| .claude.json | CLI state (one level up, in ~/.claude.json): which projects you've opened, recent sessions, last-used directory. | ✗ no |
| projects/<slug>/ | Per-project state: history, memory, settings overrides. The memory/ subfolder is the high-value piece (see §12). | ~ memory only |
| backups/ | Automatic backups of changed config files. Machine-local. | ✗ no |
| downloads/ | Files Claude has downloaded into this machine's working area. | ✗ no |
Claude reads config from multiple places and merges them. Knowing the precedence is what lets you sync the right thing at the right level.
Set by your organisation's IT. Wins over everything below. If you're a solo or small-team Paul-style operator, you almost never see this. Used for SSO enforcement, deny-lists, audit configuration.
Per-invocation overrides you pass on the shell. Useful for one-off "this session, just this once" exceptions. Don't sync — they live in your shell history, not on disk.
Per-project, gitignored, not shared with collaborators. The right place for personal "yes I trust this repo's npm test" allowlists. Don't sync between machines — each machine has its own working copies.
Per-project, checked into git, shared with the team. Owns team-wide MCP servers, hooks that everyone running on this repo should have, allowed tool lists agreed across the team. Synced naturally via the repo.
Your defaults across every project on this machine. This is the one you want synced — it carries your identity, your common allowlists, your hooks, your MCP servers, your status line.
Higher numbers lose to lower numbers — enterprise wins over CLI flags, CLI flags win over project-local, project-local wins over project-shared, project-shared wins over user-global. For multi-machine sync the actionable scope is 5 (user global). Everything else either propagates automatically (via git) or shouldn't propagate at all (per-invocation, machine-local).
Five approaches, in roughly the order I'd recommend trying them. The right answer for most multi-machine setups is some combination of the first two.
Make ~/.claude/ a git repo. Commit the things worth syncing; gitignore the noise. Push to a private GitHub repo. On every new machine: clone, restore. On every change: commit. Same model devs already use for their dotfiles.
Point one specific subfolder of ~/.claude/ at a sync service. Works well for the high-churn pieces — your skill library, your auto-memory — where committing to git every time you tweak a memory file is friction. Use a junction/symlink: ~/.claude/skills/ → C:\Users\<you>\OneDrive\claude-skills\.
Pick a primary machine. Nightly scheduled task rsyncs the synced parts of ~/.claude/ to a NAS or to the other machines (one-way). Same pattern as the WholeTech 6-leg push, just for your config.
Don't sync at all — just keep a script that recreates your config from scratch. Stored in the same dotfiles repo, run once when you set up a new PC. Pairs well with method 1 (clone + run).
Just scp / copy-paste files when you need them. Fine for a one-time migration; a recipe for drift if it's your only mechanism. Useful when the other machines are dev machines you barely touch.
For a WholeTech-style setup — a handful of Windows PCs, the droplet, maybe a Mac in the mix — the sweet spot is git for declarations, sync folder for skills and memory, nothing for the rest. Concrete steps:
~/.claude/ as a git repo. cd ~/.claude then git init. Create a private GitHub repo (e.g. walhus/claude-dotfiles) and add it as origin..gitignore that excludes the noise. See the template below.settings.json, CLAUDE.md, keybindings.json, commands/, agents/, skills/, output-styles/, statusline-config.json. Push.~/.claude/, then git clone <repo> ~/.claude. Restore auth.json and any machine-specific bits from the backup, or re-run claude login.git -C ~/.claude add && commit && push. Pull on the other machines first thing in the morning (or wire it into a scheduled task — see §14).~/.claude/.gitignore# auth & secrets — never commit auth.json .credentials.json *.env # session state — machine-specific, large sessions/ history.jsonl shell-snapshots/ session-env/ file-history/ paste-cache/ tasks/ .claude.json # caches cache/ telemetry/ backups/ downloads/ mcp-needs-auth-cache.json # per-project state, except memory (sync that explicitly if you want) projects/*/history.jsonl projects/*/sessions/ projects/*/cache/ # OS junk .DS_Store Thumbs.db desktop.ini
claude login.
The single most important file to sync. Every key it accepts, in plain English:
| Key | Type | What it sets |
|---|---|---|
| theme | string | Visual theme: dark, light, dark-daltonized, etc. |
| model | string | Default model alias: opus, sonnet, haiku, or a specific ID. |
| permissions | object | allow, deny, ask lists for tool and command patterns. See §8. |
| hooks | object | Shell commands to run on lifecycle events (Stop, UserPromptSubmit, PostToolUse, etc.). See §9. |
| mcpServers | object | Map of MCP server name → launch config. See §10. |
| env | object | Environment variables Claude should set when launching tool calls. Avoid putting secrets here. |
| statusLine | object | Status-line layout. Run /statusline to configure interactively, then commit the resulting JSON. |
| outputStyle | string | Default response style (one of your output-styles/ entries). |
| additionalDirectories | string[] | Extra paths Claude is allowed to read/edit beyond the cwd. Use sparingly — every entry is a footgun. |
| cleanupPeriodDays | number | How long to keep session logs locally before deleting. |
| apiKeyHelper | string | Shell command that prints an API key to stdout. Use when you don't want the key on disk. |
| disableAllHooks | boolean | Emergency off-switch for every configured hook. |
Older versions of Claude Code used mcp_servers (snake case) and a separate mcp.json file; current versions use mcpServers in settings.json. If both exist, the explicit settings.json wins. When you migrate, copy mcp.json into settings.json's mcpServers block and delete the standalone file.
This is a settings.json tuned for a WholeTech-style operator: multiple Windows PCs, an SSH droplet, MCP servers for Google + Slack, hooks for end-of-task notification, and an allowlist that takes the friction out of git/gh/ssh/scp/curl/rclone. Copy, then strip out anything you don't use.
{ "theme": "dark", "model": "opus", "outputStyle": "default", "cleanupPeriodDays": 30, // === environment === "env": { "DROPLET_HOST": "root@wholetech.com", "DROPLET_IP": "143.198.182.180", "WEBSITES_ROOT": "C:\\Users\\walhu\\websites", "EDITOR": "code --wait" }, // === permissions === // allow = run without asking; deny = block outright; ask = always confirm "permissions": { "allow": [ // git essentials "Bash(git status:*)", "Bash(git diff:*)", "Bash(git log:*)", "Bash(git add:*)", "Bash(git commit:*)", "Bash(git push:*)", "Bash(git pull:*)", "Bash(git fetch:*)", "Bash(git branch:*)", "Bash(git checkout:*)", "Bash(git stash:*)", // GitHub CLI — read-only ops "Bash(gh pr view:*)", "Bash(gh pr list:*)", "Bash(gh pr diff:*)", "Bash(gh repo view:*)", "Bash(gh issue list:*)", "Bash(gh run list:*)", "Bash(gh run view:*)", // droplet ops — trust the host you control "Bash(ssh root@wholetech.com:*)", "Bash(ssh root@143.198.182.180:*)", "Bash(scp:*)", "Bash(rsync:*)", // dns + cert + http "Bash(nslookup:*)", "Bash(dig:*)", "Bash(curl.exe:*)", "Bash(certbot:*)", // package managers — read-only by default "Bash(npm ls:*)", "Bash(npm view:*)", "Bash(pnpm ls:*)", "Bash(npm run:*)", "Bash(pnpm run:*)", "Bash(yarn:*)", // backup + sync "Bash(rclone listremotes:*)", "Bash(rclone ls:*)", "Bash(rclone lsd:*)", "Bash(rclone size:*)", // safe read tools "Read(*)", "Grep(*)", "Glob(*)", "WebFetch(*)" ], "deny": [ // hard blocks — never run these without explicit confirmation "Bash(rm -rf /:*)", "Bash(rm -rf ~:*)", "Bash(git push --force:*)", "Bash(git push -f:*)", "Bash(git reset --hard:*)", "Bash(rclone delete:*)", "Bash(rclone purge:*)", "Bash(certbot delete:*)", "Bash(certbot revoke:*)" ], "ask": [ // always confirm — risky but legitimate sometimes "Bash(npm publish:*)", "Bash(gh release:*)" ] }, // === hooks === // see §9 for full hook recipes "hooks": { "Stop": [{ "matcher": "", "hooks": [{ "type": "command", "command": "powershell -c \"[console]::Beep(880,200)\"" }] }] }, // === mcp servers === // each entry is the launch command for an MCP server. Secrets via env, not hardcoded. "mcpServers": { "filesystem-websites": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "C:\\Users\\walhu\\websites"] }, "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GH_PAT}" } } }, "statusLine": { "format": "{cwd} · {model} · {branch} · {tokens}" } }
${env:GH_PAT} indirection — the actual token isn't in the file. Set GH_PAT in your shell profile or in a per-machine .env that isn't in the synced repo. Same pattern for anything you'd be sad to leak.
Permissions are the single biggest friction reducer. Every tool/command pair that appears in your day-to-day belongs on the allowlist; every command that's destructive belongs on the deny list. Below: the patterns that pay back in any multi-PC fleet.
"Read(*)" — allow Read on anything. (Almost always safe.)"Bash(git status:*)" — allow git status with any args."Bash(ssh root@wholetech.com:*)" — allow ssh to that specific host with any args."Bash(rm -rf /:*)" — match an exact destructive pattern."Bash(curl http*)" — match a prefix.Patterns match against the full command line. Use :* as the trailing wildcard if you want to allow any arguments. Lists are matched most-specific-deny-wins → allow → ask.
The shortlist of things you'd hate Claude to do without asking: rm -rf /, rm -rf ~, git push --force to any branch, git reset --hard, rclone delete, rclone purge, certbot revoke.
npm publish, gh release create, terraform apply, anything that produces a public artefact. You want them available without trip-wires, but never silent.
Everything you'd type ten times a day: git read commands, gh read commands, ssh to your own hosts, scp, curl, nslookup, npm/pnpm run, rclone ls. Less friction, no real risk on systems you own.
// version control — every read, write to your own remotes "Bash(git *:*)", // allow everything in git — narrower if you prefer "Bash(gh pr view:*)", "Bash(gh pr list:*)", "Bash(gh pr diff:*)", "Bash(gh run view:*)", "Bash(gh run list:*)", "Bash(gh repo view:*)", // SSH to hosts you control (be specific — don't whitelist ssh:*) "Bash(ssh root@wholetech.com:*)", "Bash(ssh root@143.198.182.180:*)", "Bash(scp:*)", // HTTP probes & DNS "Bash(curl.exe -s*)", "Bash(curl.exe -sI*)", "Bash(curl.exe -X GET*)", "Bash(nslookup:*)", "Bash(dig:*)", "Bash(host:*)", // rclone — read-only verbs "Bash(rclone ls:*)", "Bash(rclone lsd:*)", "Bash(rclone size:*)", "Bash(rclone listremotes:*)", "Bash(rclone check:*)", // safe Claude built-ins "Read(*)", "Grep(*)", "Glob(*)", "WebFetch(*)", "WebSearch(*)"
Bash(ssh:*) globally — that allows ssh to any host. Allowlist each host you own as a separate pattern. Same for Bash(curl:*) — that's a network-write primitive disguised as a read.
The bundled skill fewer-permission-prompts scans your transcripts, ranks common read-only commands by frequency, and proposes an allowlist for the project's .claude/settings.json. Run it on the primary PC, copy the suggestions up to ~/.claude/settings.json if they're broadly applicable, and commit.
A hook is a shell command Claude runs automatically when something happens. Lifecycle events available: UserPromptSubmit, PreToolUse, PostToolUse, Stop, SubagentStop, Notification, SessionStart. Three I'd recommend across every machine:
The single highest-value hook: an audible cue that Claude finished. Lets you walk away during long runs without watching the screen.
"hooks": { "Stop": [{ "matcher": "", "hooks": [{ "type": "command", // Windows: PowerShell beep. macOS: 'afplay /System/Library/Sounds/Glass.aiff'. Linux: 'paplay /usr/share/sounds/freedesktop/stereo/complete.oga' "command": "powershell -c \"[console]::Beep(880,200)\"" }] }] }
Pair the beep with a Pushover / ntfy / Slack message so you get notified on your phone. Especially useful when Claude is running a background agent or a cloud task.
"Stop": [{ "matcher": "", "hooks": [{ "type": "command", "command": "curl.exe -s -d \"Claude finished\" ntfy.sh/walhus-claude" }] }]
Run Prettier/Black/gofmt automatically on files Claude touched. Keeps the diff clean and saves you from "Claude wrote it with the wrong quote style" comments in code review.
"PostToolUse": [{ "matcher": "Edit|Write|MultiEdit", "hooks": [{ "type": "command", // CLAUDE_FILE_PATHS is set by the harness; format only what was touched "command": "for f in $CLAUDE_FILE_PATHS; do npx prettier --write \\\"$f\\\" 2>/dev/null || true; done" }] }]
A pre-tool gate that intercepts git push to main/master and forces a confirmation.
"PreToolUse": [{ "matcher": "Bash", "hooks": [{ "type": "command", // returns nonzero (= block) if pushing to main "command": "powershell -c \"if ($env:CLAUDE_TOOL_INPUT -match 'git push.*\\bmain\\b') { Write-Host 'Refusing to push main — confirm in chat'; exit 2 }\"" }] }]
disableAllHooks: true escape hatch exists for a reason.
MCP servers are how Claude reaches outside its sandbox — Gmail, Calendar, Drive, Slack, your own filesystem trees, GitHub, Postgres. The declaration is portable; the auth is not. Sync the declarations, re-auth per machine.
"mcpServers": { "filesystem-websites": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "C:\\Users\\walhu\\websites"] }, "filesystem-secrets": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-filesystem", "C:\\Users\\walhu\\.secrets"] }, "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GH_PAT}" } }, "postgres-walhus": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-postgres", "${env:WALHUS_DB_URL}"] } }
The Google MCP servers (Gmail, Calendar, Drive) and Slack auth via OAuth on first use. The browser flow writes a token into ~/.claude/mcp-needs-auth-cache.json and a per-server token file. Don't sync those. Each machine does its own one-time auth.
The Google + Slack MCP servers in this fleet (Gmail, Calendar, Drive, Slack — see /integrations) authenticate via claude.ai and don't appear in mcpServers at all — they're managed connectors. The ones that DO live in mcpServers are the local ones: filesystem trees you've granted access to, your GitHub server, your Postgres pointer.
Practical rule: add a new MCP server on the primary PC; commit the settings.json change; pull on the others; let each one do its own auth dance.
These four are folders of declarations rather than fields in settings.json, so the sync story is even simpler: copy the folder, restart Claude.
| Where | What | Sync method |
|---|---|---|
| ~/.claude/skills/ | Skill bundles — folders containing SKILL.md with frontmatter declaring when to use it, plus any scripts/templates it needs. |
Commit to dotfiles repo. Active set determined by frontmatter; no settings.json entry required. |
| ~/.claude/agents/ | Custom subagents. Each is a markdown file with frontmatter (name, description, model, tools). | Commit to dotfiles repo. Available to every session on every synced machine. |
| ~/.claude/commands/ | Slash commands. my-thing.md becomes /my-thing. |
Commit to dotfiles repo. Same name on every machine, same behaviour. |
| ~/.claude/plugins/ | Installed plugin bundles. Some are vendored (own code), some are pulled from a marketplace at install time. | Commit the installed bundles for reproducibility; or commit a manifest and reinstall on each machine. |
| ~/.claude/output-styles/ | Named response styles you can switch to with /output-style. |
Commit to dotfiles repo. |
/session-close — appends a session summary to sessions.wholetech.com. If you use it on one machine, sync the skill so the rolling log keeps growing wherever you happen to be working./fewer-permission-prompts — built-in skill that proposes allowlist entries from your transcripts. Useful on a fresh machine to bootstrap an allowlist without typing every rule.If you find yourself maintaining the same five custom commands across machines, bundle them as a plugin and publish it (private repo is fine). Then every machine runs /plugin install <repo> and gets the same set. Updates propagate by running install again. Heavier than git-syncing the commands/ folder, but cleaner if you ever want to share the bundle with someone else.
Auto-memory is the file-based memory system at ~/.claude/projects/<project-slug>/memory/. Each memory file is a markdown card with frontmatter; MEMORY.md is the index. This is where Claude remembers who you are, what you're like to work with, and what you've already corrected it on. It's the highest-leverage thing you could sync — and the most context-sensitive.
The auto-memory for the C--Users-walhu-websites project on this machine currently holds, indexed in MEMORY.md:
*.wholetech.comThat last one is the case for syncing. The rule was established on one machine in one conversation; if it doesn't propagate to the others, Claude on the other machines will phone things in until you re-correct.
Memory is context-specific. A memory written while configuring a Mac may not apply on Windows. A memory about a specific project's quirks doesn't help another project. And memories that capture in-flight conversation state (rare, but it happens) can mislead.
Sync the memory directory structure via a symlink/junction to a OneDrive folder, so memories propagate live, but treat the memory index as authoritative and prune aggressively:
~/.claude/projects/<slug>/ into a sync-able location: ~/OneDrive/claude-memory/<slug>/.mklink /J "C:\Users\walhu\.claude\projects\<slug>\memory" "C:\Users\walhu\OneDrive\claude-memory\<slug>". On macOS/Linux: ln -s ~/OneDrive/claude-memory/<slug> ~/.claude/projects/<slug>/memory.~/.claude/. Slightly more friction (you commit on every edit) but versioned, diffable, and you'll see exactly what changed. The skills that author memory automatically already write text-only files, so diffs read cleanly.
The number-one accidental leak. auth.json contains your Anthropic session; .credentials.json can contain API keys. Always gitignore both before the first commit. Use git check-ignore -v auth.json to verify.
If two machines edit the same settings.json simultaneously, Dropbox creates conflicted copies with mangled names. Claude reads whichever it finds first. Symptoms: settings randomly revert. Fix: pick one primary, or use git.
C:\Users\walhu\... on Windows isn't /Users/walhu/... on Mac. Either keep separate settings files per OS, or use ${env:HOME} and forward slashes (settings.json is JSON so Windows accepts forward slashes too).
sessions/ can grow to hundreds of MB. If you forget to gitignore it the first commit is huge; if you forget to exclude it from OneDrive, your quota tanks. Both .gitignore and your sync tool's exclude list need to know.
You change settings on Machine A, commit, push. Open Machine B a week later — old settings. Wire a git pull into your Machine B startup script, or alias claude to "pull dotfiles, then run".
Schema changes over time — keys get renamed, sections move. If Machine A is on 4.7 and Machine B is on 4.6, a synced settings.json may load partially. Keep all your machines on the same Claude Code version, or scope the sync to keys both versions accept.
The whole point of doing the sync work is that a new machine is fast. Below: the steps to go from a blank Windows install to a fully-configured Claude in about ten minutes. Adapt freely.
npm install -g @anthropic-ai/claude-code (or the equivalent from /newby/).claude once, sign in via the browser. This creates ~/.claude/ with the auth files but nothing else.~/.claude/ aside. mv ~/.claude ~/.claude.bak (or rename in Explorer). Keeps a safety net.git clone git@github.com:<you>/claude-dotfiles ~/.claude.auth.json from ~/.claude.bak back into ~/.claude — or just re-run claude login.~/.secrets/godaddy.env, ~/.secrets/rclone.conf, or whatever per-PC creds you keep out of git./your-custom-command works.On Windows, a daily morning task that git -C ~/.claude pull --ff-only means you arrive at work and the latest settings are already there. Same idea as the CC-Mirror-* tasks on the WholeTech fleet.
# Windows Task Scheduler one-liner — registers a daily 09:00 pull schtasks /create /tn "Claude dotfiles pull" /tr "git -C C:\Users\walhu\.claude pull --ff-only" /sc daily /st 09:00
Drop the dotfiles repo into the same 6-leg backup pattern you already run — droplet, B2, GitHub, Drive, HS NAS, CC NAS. Then losing a PC doesn't lose your Claude config; even the secrets you carefully kept out of the repo are independently backed up via your existing scheduled tasks.