ccsync is a Bun CLI, daemon, OpenTUI console, and Convex backend for syncing AI coding-agent skills and MCP server configuration across machines.
The default model is simple: sign in once with GitHub, create a CLI token, run ccsync init on each machine, then leave ccsync daemon start running.
Install from Homebrew:
brew tap opencoredev/cc-sync https://github.com/opencoredev/cc-sync
brew install --HEAD opencoredev/cc-sync/ccsyncOpen the account page, sign in with GitHub, and create a CLI token:
https://cc-sync.devThen connect the machine:
ccsync init
ccsync daemon startFull docs:
https://cc-sync.dev/docs- Registry skill references by agent/name/ID.
- Explicit custom skill content.
- MCP server definitions from global user-level config files.
- Device presence, sync health, and manifest revisions.
ccsync only targets user-level/global agent setup. It does not sync project-level config.
The scanner is adapter-based and currently checks Claude Code, Cursor, Codex CLI, OpenCode, Windsurf, Cline, Roo Code, Continue, Aider, Gemini CLI, Qwen Code, Amp, and Kiro.
apps/cli Bun CLI, daemon, scanner, apply engine, OpenTUI console
apps/web GitHub auth/account screen for CLI token issuing
packages/backend/convex Convex schema, Better Auth integration, sync functions
packages/ui Shared shadcn primitives for the web account pagebun installBuild the CLI binary locally:
bun run cli:buildDuring development, run the CLI directly:
bun run cli -- --help
bun run cli -- status
bun run cli -- scanCreate/configure the Convex project:
bun run dev:setupSet backend env vars in Convex:
SITE_URL=https://your-ccsync-web-url
GITHUB_CLIENT_ID=...
GITHUB_CLIENT_SECRET=...Set web env vars in apps/web/.env:
VITE_CONVEX_URL=https://elated-rat-35.convex.cloud
VITE_CONVEX_SITE_URL=https://elated-rat-35.convex.siteThen run the web app and backend when developing:
bun run devUse the web account page to sign in with GitHub and create a CLI token.
ccsync init
ccsync status
ccsync daemon start
ccsync daemon pause
ccsync daemon resume
ccsync tui
ccsync push
ccsync pullccsync init stores local config at ~/.config/ccsync/config.json with mode 0600. The hosted Convex backend and web account URL are the defaults. The raw CLI token is not stored; the CLI stores its SHA-256 hash, which acts as the daemon credential.
Installed/global skills sync as lightweight references by default to keep manifests tiny. To sync actual skill file contents, mark the skill as custom with one of these:
- Put it under a
custom-skillsdirectory. - Add an empty
.ccsync-customfile in the skill root. - Add
ccsync: customto the skillSKILL.md.
The daemon uses fs.watch on detected global agent paths, then debounces local pushes for 20 seconds by default. It also polls Convex every 60 seconds for remote revisions and applies newer manifests locally. Last write wins for the MVP, with command output showing what was created, updated, skipped, or failed.
Useful local checks:
bun run --cwd apps/cli check-types
bun run --cwd apps/web build
bunx convex codegen --typecheck=enable
bun run check-types