// docs
Run capture on the old Mac, carry the data folder over, then provision on the new one. Always dry-run first.
The fastest path: one command, then a clickable setup. No git clone, no flags.
curl -fsSL https://migration-machine.callmesukhi.com/install.sh | bash
It downloads migration-machine and launches a guided UI (powered by swiftDialog) that walks you through capturing the old Mac or setting up the new one, builds a manifest for you, and previews every step before anything runs. Already have the repo? Run ./migrate wizard.
install.sh, skim it, then run it. Either way, the setup/provisioning path previews everything as a dry run before it changes a thing; the old-Mac backup/capture path runs after you confirm.It's plain bash with no runtime to install. Clone it on each machine.
git clone https://github.com/callmesukhi/migration-machine.git
cd migration-machine
Or install it with Homebrew:
brew install callmesukhi/tap/migration-machine
migrate wizard
The repo is the tool. Your captured config is data, kept in a separate folder so you can carry it between machines. Point at it with --data DIR or the MIGRATION_DATA environment variable. Default: ~/migration-data.
| Command | What it does |
|---|---|
migrate capture | Export this Mac's config into the data folder (run on the OLD Mac). |
migrate provision -m M | Provision a fresh Mac from manifest M (run on the NEW Mac). |
migrate provision --list | List available manifests. |
migrate provision -m M --dry-run | Preview every step. Changes nothing. |
migrate provision -m M --only ID | Run a single step by id. |
migrate restore --only PHASE | Restore captured config only (no provisioning). |
migrate bootstrap -m M | Ensure Xcode CLT, then provision (bare Mac). |
A global --data DIR goes before the command. MIGRATE_UI=cli|gui|auto forces the progress UI.
Grant your terminal Full Disk Access first (System Settings → Privacy & Security), or some files silently skip.
./migrate --data ~/Sync/migration capture
Set a strong passphrase for the encrypted secrets bundle when prompted, then let your sync finish.
Copy an example manifest, point it at your dotfiles repo, dry-run, then go.
cp manifests/example-homebrew.json manifests/local-mymac.json
$EDITOR manifests/local-mymac.json
./migrate --data ~/Sync/migration provision -m local-mymac --dry-run
./migrate --data ~/Sync/migration bootstrap -m local-mymac
sudo; those prompts need a terminal.No script can do these. Budget an hour.
ssh-add -l, a test git fetch, and gpg --list-secret-keys.A file is missing from capture. Check the capture log for a WARN. Usual cause is Full Disk Access not granted.
An app ignored its restored prefs. It was running during import and overwrote them on quit. Quit it, then --only restore-config.
The MacPorts step stops. MacPorts has no one-line installer; set config.macportsPkgUrl to the .pkg for your macOS version.
VS Code extensions did not install. Enable the code CLI in VS Code, then re-run the step.
More detail lives in docs/RUNBOOK.md in the repo.