My application settings in sync (macOS) by Mackup
⚠️ This repo is public. Never commit credentials — shell and git config are synced out of~, so an exported token would be published. See Security.
Mackup uses copy mode (not symlinks). macOS Sonoma 14+ no longer supports symlinked preferences.
mackup backupcopies files into this repo;mackup restorecopies them back to~.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Apple Silicon uses
/opt/homebrew, Intel uses/usr/local. The$BREW_HOMEvariable in.zshenvhandles this — update it if needed.
CLI tools are managed by mise, installed with its own script (not brew — on Intel, brew would compile it from source):
curl https://mise.run | sh
~/.local/bin/mise use -g uv pipx:mackup
brew install git-cryptMackup now works in copy mode, so this repo does not need to live at ~/dotfiles.
git clone git@github.com:zo-ly/dotfiles.git
cd dotfilesUnlock encrypted files (key stored in OneDrive):
git-crypt unlock ~/OneDrive/dotfile.keycp ./Mackup/.mackup.cfg ~/
cp -r ./Mackup/.mackup ~/
~/.local/bin/mise exec -- mackup restoreOn an Intel Mac, also pin the tools whose upstream no longer ships x86_64 macOS binaries
(see Mackup/.config/mise/config.intel.toml):
echo 'export MISE_ENV=intel' >> ~/.zshenv.localRequired before setting up the shell prompt and terminal:
- Fira Code Nerd Font — for Starship prompt
- NerdFontsSymbolsOnly — for kitty
Open a new terminal first, then:
mise install # everything in ~/.config/mise/config.toml, as prebuilt binaries
brew install btop # no macOS release binary upstreamkitty, via its official installer (docs):
curl -L https://sw.kovidgoyal.net/kitty/installer.sh | sh /dev/stdinsh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlightingLazyVim manages plugins automatically. On first launch just open Neovim and wait for the installation to complete:
nvimMackup restores the ccstatusline widget config (~/.config/ccstatusline/settings.json), but not the statusLine entry in ~/.claude/settings.json. Run the TUI once and choose Install to Claude Code:
npx -y ccstatusline@latest- Raycast — import extensions from the
raycast/folder - Bob — translation/OCR app (paid build); import
Bob/config.bobconfigfrom inside the app
mackup backupThen commit and push the changes in this repo.
mise use -g <tool> # CLI tool with a macOS release binary; else brew install <tool>
brew install --cask <app>
mise upgrade # upgrades and removes the replaced versions
brew upgrade # on Intel, check `brew upgrade -n` first: anything without a bottle builds from source
mise self-update
mise prune -y # occasionally: versions no config references any moreAfter mise use -g, run mackup backup and commit; on the other machine git pull && mackup restore && mise install.
cd ~/dotfiles && git pull
curl https://mise.run | sh
mackup restore # still the brew one at this point
echo 'export MISE_ENV=intel' >> ~/.zshenv.local # Intel onlyCheck ~/.config/mise/config.toml for a token or machine-only tools before mackup restore —
it is overwritten. Then, in a new terminal:
mise install
for f in starship neovim zoxide fzf ripgrep fd git-delta gh glab lazygit lazydocker onefetch mackup mise eza tailspin; do
brew list "$f" &>/dev/null && brew uninstall "$f"
done
brew autoremove && brew cleanup -s