Development environment synchronization, remote access, and AI tooling for Mac-Studio and MacBookPro.
This repo provides:
- Rsync sync script - Mirror directories between machines for offline work
- Tailscale setup - Mesh VPN for secure remote access from anywhere
- Claude MCP setup - Configure Claude Code with Grafana and other MCP servers
See TAILSCALE.md for network setup guide. See claude-mcp/README.md for AI tooling setup.
# Preview what would sync (dry-run)
./sync-ecfx.sh status
# Push ecfx directory to remote machine
./sync-ecfx.sh push --target=ecfx
# Pull dotfiles from remote machine
./sync-ecfx.sh pull --target=dotfiles| Command | Description |
|---|---|
push |
Push from current machine to remote |
pull |
Pull from remote to current machine |
status |
Dry-run preview of changes |
| Option | Description |
|---|---|
--target=<target> |
What to sync: ecfx, dotfiles, or all (default: ecfx) |
--force |
Skip git dirty warnings |
--yes |
Skip confirmation prompt |
-v, --verbose |
Verbose rsync output |
| Target | Directories | Description |
|---|---|---|
ecfx |
~/ecfx/ |
GitLab projects |
dotfiles |
~/.claude/, ~/.claude-components/, ~/.kube/, ~/.aws/, ~/.zshrc |
Dev environment config |
all |
Both above | Full sync |
| Machine | Hostname | SSH Alias |
|---|---|---|
| Mac Studio | Mac-Studio |
mac-studio |
| MacBook Pro | MacBookPro |
macbook-pro |
Add the following to ~/.ssh/config on both machines:
Using Tailscale MagicDNS names works from anywhere:
Host mac-studio
HostName mac-studio
User traviscarter
IdentityFile ~/.ssh/id_ed25519
Host macbook-pro
HostName macbook-pro
User traviscarter
IdentityFile ~/.ssh/id_ed25519
If you only need to connect on the same local network:
Host mac-studio
HostName Mac-Studio.local
User traviscarter
IdentityFile ~/.ssh/id_ed25519
Host macbook-pro
HostName MacBookPro.local
User traviscarter
IdentityFile ~/.ssh/id_ed25519
If you haven't already, set up passwordless SSH:
# Generate key if needed
ssh-keygen -t ed25519 -C "your_email@example.com"
# Copy to other machine
ssh-copy-id mac-studio
# or
ssh-copy-id macbook-prossh mac-studio "hostname"
ssh macbook-pro "hostname"# Pull latest from Mac Studio before leaving
./sync-ecfx.sh pull --target=all# Push changes made on MacBook
./sync-ecfx.sh push --target=all- Commit all git changes in
~/ecfx/repos - Run
statusfirst to preview changes - Then run
pushorpull
Excludes common build artifacts and dependencies:
node_modules/- Node.js dependencies.terraform/,*.tfstate*- Terraform statetarget/,build/,.gradle/- Java/Gradle build outputsdist/- Generic build outputs.venv/,venv/,__pycache__/- Python environments.DS_Store- macOS metadata
Excludes cache and temporary files:
cache/,http-cache/- Various cacheshistory.jsonl- Command history*.swp,*.swo- Vim swap files
- Git dirty check: Warns if repos have uncommitted changes
- Confirmation prompt: Asks before executing (use
--yesto skip) - Dry-run mode:
statuscommand previews without changes - Lock file: Prevents concurrent sync operations
- SSH validation: Verifies connectivity before sync
- Ensure remote machine is on and awake
- Check
~/.ssh/confighas correct entries - Test with:
ssh mac-studio "echo ok"orssh macbook-pro "echo ok" - Ensure SSH keys are configured for passwordless login
The script detects the current machine via hostname -s. Expected values:
Mac-Studiofor the Mac StudioMacBookProfor the MacBook Pro
If you see "Another sync is in progress" but no sync is running:
rm ~/dev-tooling/.sync.lock~/dev-tooling/
├── sync-ecfx.sh # Main sync script
├── excludes/
│ ├── ecfx.exclude # Exclude patterns for ~/ecfx/
│ └── dotfiles.exclude # Exclude patterns for dotfiles
├── README.md
└── .gitignore