claudeport

CLI · zero accounts · your git repo

Carry your Claude Code config between machines — on your own rails.

claudeport syncs settings, skills, agents, commands, CLAUDE.md, keybindings and plugin selections through a git repo you own. No server. No accounts. Just plain files and plain git.

$ npm install -g claudeport

Requires Node ≥ 20 and git on your PATH.

workstation ~/.claude your git repo the source of truth manifest · denylist notebook ~/.claude push · outward pull · inward
Hover a verb to trace how it moves your files.
01 — Quickstart

Two machines, one repo, four verbs.

Create an empty, private repo anywhere git lives. Then teach each machine about it once.

1

Seed from your main machine

The first init against an empty repo uploads your current config.

$ claudeport init git@github.com:you/claude-config.git
2

Adopt on every other machine

Run the same command elsewhere — a populated repo is adopted instead of seeded.

$ claudeport init git@github.com:you/claude-config.git
3

Live the daily loop

Inspect first, then move files in whichever direction you need.

$ claudeport status   # what's out of sync
$ claudeport diff     # the exact changes
$ claudeport push     # publish this machine
$ claudeport pull     # apply the repo here
02 — Command reference

Every verb, and the path it takes.

Every command is tagged with the direction it moves your files. (The verb chips under the diagram up top trace each flow live.)

03 — What travels

A manifest decides. A denylist overrules.

Run claudeport manifest to pick paths interactively — no hand-editing JSON — or edit the file directly. Either way, the same claudeport.json travels in your repo.

What syncs

The repo's claudeport.json lists paths (relative to ~/.claude). Edit it interactively, or by hand, then push to change it everywhere.

$ claudeport manifest   # interactive picker

[x] settings.json
[x] skills/
[~] agents (2 file(s))
[ ] keybindings.json
↑/↓ move · space toggle · enter save · esc cancel
{
  "version": 1,
  "paths": [
    "settings.json",
    "skills/",
    "agents/",
    "commands/",
    "CLAUDE.md",
    "keybindings.json",
    "plugins/installed_plugins.json",
    "plugins/known_marketplaces.json"
  ]
}

Plugin code never travels — only your selections. After a plugin change, restart Claude Code.

What never syncs

A hardcoded denylist wins over the manifest — even if you add these, they stay put.

  • *credentials*
  • *.pem
  • *.key
  • history.jsonl
  • policy-limits.json
  • remote-settings.json
  • projects
  • sessions
  • session-env
  • file-history
  • shell-snapshots
  • cache
  • paste-cache
  • plugins/cache
  • telemetry
  • backups
  • security
  • downloads
  • todos

Secrets, machine-local state and noise can't leak into your repo by accident.

04 — Safety & trust

Nothing changes without a look first.

Confirm before writing

pull shows what will change and asks before touching anything. Pass --yes to skip in scripts.

Automatic backups

Files it overwrites or deletes are copied first to ~/.claude/backups/claudeport-<timestamp>/.

No silent clobbering

push refuses when the repo moved ahead. Pull first, git-style — your history stays linear.

Only sync a repo you control

Pulled settings, skills and agents can run hooks — arbitrary commands. A repo others can write to is code you'd be running. Keep it private.

05 — Under the hood

Plain files. Plain git. Nothing to trust but yourself.

Your repo clones to ~/.claudeport. push copies manifest-tracked files out of ~/.claude, commits and pushes; pull fast-forwards and copies them back. Inspect, revert or recover anything with ordinary git commands.

Configuration

Each directory resolves as env var → config file → default.

SettingEnv varConfig keyDefault
Claude config dirCLAUDE_CONFIG_DIRclaude-dir~/.claude
Clone locationCLAUDEPORT_DIRsync-dir~/.claudeport