Automatic daily backups of your AI coding assistant memories, configs, and instruction files to a private GitHub repo.
Supports Claude Code, OpenAI Codex, Gemini CLI, Cursor, and any custom AI tool you add.
Multi-tool: backs up multiple AI harnesses simultaneously (Claude, Codex, Gemini, Cursor, Windsurf, or anything with a local config directory)Auto-setup: interactivesetup.sh
detects installed AI tools, creates a private GitHub backup repo, and configures everythingConfigurable allow list: per-sourceinclude
patterns inconfig.json
control exactly which files get backed up. Sane defaults for the top AI tools out of the box.Daily scheduled sync: macOS LaunchAgent runs at your chosen hour. Each commit shows which sources changed:sync(claude,codex): 2026-08-24 15:00:00
Native macOS notifications: a compiled Swift helper app shows banner notifications on each sync. Click to open your backup's commit history on GitHub.Restore anywhere: clone your backup repo on a new machine and rsync the data back
AI coding assistants store persistent memories, custom agents, instruction files, and config locally. This tool syncs them to a private GitHub repo so you never lose them.
Default include lists per tool:
| Tool | Source directory | Files backed up |
|---|---|---|
| Claude Code | ~/.claude |
|
CLAUDE.md , settings.json , config.json , projects/*/memory/** , agents/** , commands/** , hooks/** , skills/** |
||
| OpenAI Codex | ~/.codex |
|
AGENTS.md , AGENTS.override.md , config.toml , *.config.toml , memories/** |
||
| Gemini CLI | ~/.gemini |
|
GEMINI.md , settings.json , commands/** , extensions/** |
||
| Cursor | ~/.cursor |
|
rules/** (.mdc files), mcp.json , permissions.json |
Setup auto-detects which tools are installed and enables them. All include lists are fully configurable.
- macOS (for notifications and scheduled sync via LaunchAgent)
GitHub CLI(
brew install gh
), authenticatedgit
,python3
,rsync
(pre-installed on macOS)
git clone https://github.com/DiegoSalazar/AiSyncing.git ~/AiSyncing
cd ~/AiSyncing
bash setup.sh
Setup will walk you through:
Backup repo: picks a name, auto-creates a private GitHub repo viagh
Git identity: name and email for backup commits (defaults to your global git config)** AI tools**: auto-detects installed tools by checking for their config directories** Schedule**: which hour to run the daily sync (default: 3 PM)** Build and install**: compiles the notification helper, installs the LaunchAgent, pushes the initial backup
The AiSyncing template repo is saved as the upstream
remote so you can pull updates later.
bash ~/AiSyncing/sync.sh
- For each enabled source,
sync.sh
reads theinclude
list fromconfig.json
-
Generates rsync filter rules at runtime (auto-includes parent directories for nested patterns)
-
Rsyncs each source directory into
data/<source>/ -
Commits with a message showing which sources changed:
sync(claude,gemini): 2026-08-24 15:00:00 -
Pushes to your private backup repo
-
Sends a macOS notification (click to open commit history)
Sources with missing directories are skipped with a warning, not fatal. If no sources sync, you get a notification about it.
Everything is in config.json
(created by setup.sh
). See config.example.json
for the full schema.
Each source has an include
array of glob patterns. Edit it to add or remove files:
{
"sources": {
"claude": {
"enabled": true,
"source_dir": "~/.claude",
"include": [
"CLAUDE.md",
"projects/*/memory/**",
"agents/**",
"my-custom-dir/**"
]
}
}
}
Patterns follow rsync include syntax. Parent directories are auto-included for nested paths. Anything not matched is excluded.
Add a new entry to sources
with any name, its config directory, and the files you want backed up. For example, to add Windsurf (Codeium):
{
"sources": {
"windsurf": {
"enabled": true,
"source_dir": "~/.codeium/windsurf",
"include": [
".windsurfrules",
"memories/**",
"config.json",
"settings.json",
"prompts/**"
]
}
}
}
The sync script handles any number of sources. Each gets its own data/<name>/
subdirectory in the backup.
Edit schedule_hour
in config.json
, then re-run bash setup.sh
to update the LaunchAgent.
On macOS, each sync sends a banner notification showing the result. Click it to open your backup's commit history on GitHub.
The notification helper is a minimal Swift app (notifier.swift
) compiled into AiSyncing.app
during setup. It runs as a background process (no dock icon) and uses macOS UserNotifications for proper banner support with click actions.
On first notification, macOS will ask to allow notifications from "AI Syncing". Click Allow.
Falls back to osascript
if the app isn't built (no click-to-open in fallback mode).
Logs: ~/Library/Logs/ai-syncing.log
Clone your backup repo on a new machine and copy the data back:
git clone git@github.com:you/ai-backup.git ~/AiSyncing
rsync -av ~/AiSyncing/data/claude/ ~/.claude/
rsync -av ~/AiSyncing/data/codex/ ~/.codex/
rsync -av ~/AiSyncing/data/gemini/ ~/.gemini/
rsync -av ~/AiSyncing/data/cursor/ ~/.cursor/
bash ~/AiSyncing/setup.sh
bash ~/AiSyncing/uninstall.sh
Stops the LaunchAgent and removes the compiled notification app. Your backup data and config are left in place.
A weekly GitHub Action (Research AI Tools
) monitors official documentation for all supported tools. It fetches doc pages from each tool's repo, hashes the content, and compares against stored baselines. If any docs change or become unreachable, it opens a GitHub issue for review. Can also be triggered manually from the Actions tab.
Setup saves the AiSyncing template as the upstream
remote:
cd ~/AiSyncing
git fetch upstream
git merge upstream/main
MIT