I've been meaning to move to a new Mac for a while, and the thing that kept stalling me wasn't the apps or the files. It was my agent setup. Between coding agents and a growing list of MCP tools wired into all of them, from Gmail and Calendar to a few of my own, I'd built up a decent pile of agent skills and configs over the last few years, managed the way most people probably start: one folder, symlinked by hand into whichever repo needed it. That worked, until I realised the same folder was quietly doing double duty across every agent I touched, coding or otherwise, and none of it was tracked anywhere. Moving machines meant rebuilding it all from memory.
So before touching the new Mac, I went looking for how other people had solved this. Brian Lovin keeps his Claude Code and Codex config in a git repo, with a script that symlinks everything into place and reports back on what's synced, local only, or conflicting. Nick Ang automated the whole loop with a LaunchAgent that pulls and pushes on every file change, so his Macs stay in sync without him thinking about it. Between the two, I had a shape worth borrowing.
What I already had right
Turns out my instinct wasn't far off. I already kept a single canonical folder at ~/.agents/skills, with ~/.claude/skills, ~/.codex/skills, and ~/.gemini/skills symlinked back to it. It's a documented pattern once you're running more than one agent, which made the next call easier: build on what already worked. What I didn't have was the sync. The folder existed, but nothing was watching it, versioning it, or getting it onto a second machine.
The repo as the conduit
I settled on chezmoi over raw symlinks or a continuous sync tool like Syncthing, mainly for the history. Chezmoi tracks every change through git, so I get real diffs and the option to roll something back. The repo tracks the shared skills folder plus each agent's own config and rules files: CLAUDE.md, AGENTS.md, GEMINI.md, and their settings. Anything to do with credentials tied to the machine is deliberately excluded.
The sync itself is unglamorous: a script runs chezmoi re-add to capture local changes, then chezmoi update to pull whatever the other machine already pushed, wrapped in a lock file so overlapping triggers don't collide. A LaunchAgent fires it on login and every half hour. Which Mac I touch it from doesn't matter; pulling before pushing sorts out the direction on its own.
What actually caught me out
Chezmoi will happily recreate the real ~/.agents/skills folder on a new machine, but not all the symlinks pointing at it, unless told to. Those symlinks are what actually connect the setup to each agent. Chezmoi can track a symlink as a symlink rather than copying what it points to, so the fix was just remembering to add those paths explicitly. Easy to miss, annoying to debug after the fact.
Doing all of this by hand (config, script, plist file) made me appreciate how fiddly it still is for something that should be solved by now. That's part of the itch behind Hanger, something I've been building on the side. More on that later.
For now, the chezmoi setup does exactly what I needed: one source of truth, all the agents reading from it.