Keep your AI agent skills in the cloud and sync them automatically.
skill-sync watches a local skills directory (e.g. ~/.claude/skills/) and pushes
every skill to a Git repo on a daily schedule — so your skills are backed up, versioned,
and ready to pull onto any machine. It resolves symlinks, strips runtime/secret files,
and only commits when something actually changed.
Pairs well with an MCP skill server that serves those skills back to your agents, but works standalone as a plain backup tool too.
Agent skills tend to pile up as loose folders on one laptop. Move to a new machine and
they're gone. skill-sync makes a Git repo the single source of truth: write skills
locally, they land in the cloud automatically, pull them anywhere.
- macOS (scheduling uses
launchd) git,gh(logged in viagh auth login),rsync,perl- A Git repo you can push to (works with private repos via the
ghcredential helper)
git clone https://github.com/YOUR_NAME/skill-sync.git
cd skill-sync
cp config.example.sh config.sh # then edit REPO_URL (and any other settings)
./install.shinstall.sh checks dependencies, registers a daily launchd job, and runs an initial
sync. It's idempotent — re-run it any time.
| Variable | Meaning | Default |
|---|---|---|
REPO_URL |
Git URL of the repo that stores your skills | (required) |
BRANCH |
Branch to push to | main |
SKILLS_DIR |
Local directory holding your skills | $HOME/.claude/skills |
SKILLS_SUBDIR |
Sub-directory inside the repo where skills live | skills |
SCHEDULE_HOUR |
Hour (0–23) of the daily sync | 11 |
Each skill is a sub-directory containing a SKILL.md. Skills without a resolvable
SKILL.md (e.g. broken symlinks) are skipped, never deleted from the cloud.
bash sync-skills.sh # sync right now
tail -f sync-skills.log # watch the log
./uninstall.sh # stop the scheduled job (skills & repo untouched)- Clone/refresh a clean working copy of your repo under
~/.cache/skill-sync/repo. rsync -aLeach local skill into<repo>/<SKILLS_SUBDIR>/, dereferencing symlinks and excludingnode_modules,.venv, logs,config.json, andstate-*.json.- If a
SKILL.mdfrontmatter has noname:, inject one from the directory name. - Commit and push only if there's a diff.
- macOS only for scheduling (Linux
cron/systemdsupport welcome via PR). - Sync is additive per skill: deleting a skill locally does not remove it from the cloud (remove it from the repo manually if needed).
- Push uses your
ghcredential helper, so private repos work without storing tokens.
MIT — see LICENSE.