Personal dotfiles for macOS. Files are version-controlled here and symlinked into place by install.sh.
# 1. Install Homebrew (https://brew.sh), clone this repo, then packages
# (also installs uv tools and App Store apps via mas — sign in to the App Store first)
git clone git@github.com:jmlrt/dotfiles.git ~/Code/dotfiles
brew bundle --file ~/Code/dotfiles/Brewfile
# 2. Clone the other personal repos (gh is now installed); uv tools and agent skills live there
gh auth login
gh repo clone jmlrt/toolbox ~/Code/toolbox
gh repo clone jmlrt/spotfm ~/Code/spotfm
gh repo clone jmlrt/clipmd ~/Code/clipmd
gh repo clone jmlrt/skills ~/Code/skills
# 3. Symlink configs (force-replaces anything already at the destinations)
~/Code/dotfiles/install.sh
# 4. Per-machine git config (the signing key is deliberately not tracked)
mkdir -p ~/.config/git
cat > ~/.config/git/config.local <<'EOF'
[user]
signingkey = <YOUR-KEY-ID>
EOFbw-backup, spotfm and clipmd are personal tools installed from the local clones, not via brew bundle; they are listed in the Brewfile only so that brew bundle check/cleanup recognize them. First install:
uv tool install "git+ssh://git@github.com/jmlrt/toolbox.git#subdirectory=bw-backup"
uv tool install --editable ~/Code/spotfm
uv tool install --editable ~/Code/clipmd- Window tiling and keep-awake are native: bind shortcuts to the Window > Move & Resize menu items (System Settings > Keyboard > Keyboard Shortcuts > App Shortcuts), and use the
coffee/decafaliases (caffeinate) instead of Hammerspoon. ~/.personal.zshis sourced byzshrcif present; use it for untracked, per-machine shell extras. On the work machine,~/.elastic.zshplays the same role. Example for the Bitwarden SSH agent:export SSH_AUTH_SOCK="$HOME/Library/Containers/com.bitwarden.desktop/Data/.bitwarden-ssh-agent.sock".ssh/configincludes~/.ssh/config.localif present (silently skipped when missing): put untracked, machine-local hosts there, the same way~/.personal.zshhandles shell extras.- Agent skills: Mistral Vibe loads user skills from
~/.vibe/skillsand~/.agents/skills(the latter is also the Codex path), so symlink selected folders from~/Code/skills— e.g.ln -ns ~/Code/skills/git ~/.vibe/skills/git. Keep only the skills you use; their descriptions are always loaded, so a smaller set matches better. - Git commits and tags are signed by default (
config/git/config); without step 3 the first commit will fail if gpg has no default key. - Migrate the GPG signing key manually (commands only here — never commit the exported key material to any repo):
# old machine: export ASCII-armored (safe to move via any text channel, e.g. clipboard)
gpg --armor --export-secret-keys <KEYID> | pbcopy
# new machine: import, set ultimate trust, and point git at it
mkdir -p ~/.gnupg && chmod 700 ~/.gnupg # 700, not 600: without the execute bit gpg cannot read the directory
pbpaste | gpg --import
echo <KEYID>:6 | gpg --import-ownertrust
git config --file ~/.config/git/config.local user.signingkey <KEYID>
gpgconf --kill gpg-agent # pick up the new gpg-agent.conf / pinentry
# verify, then delete the key material from wherever you staged it
echo test | gpg --clearsign > /dev/null && echo "signing OK"Renew before expiry (a reminder beats a surprise on the next commit): gpg --quick-set-expire <KEYID> 2y.
- The repo's pre-commit hooks include
detect-private-key, which blocks accidental commits of private key material (including OpenPGP blocks); runpre-commit installonce per clone so they are active.