Personal macOS dotfiles, managed with GNU Stow.
Each tool lives in its own Stow package; install.sh installs dependencies via
Homebrew Bundle and links everything
into $HOME.
~/<checkout_dir>/install.shinstall.sh is idempotent — safe to re-run any time. It will:
- Install Homebrew if missing.
brew bundle installeverything inBrewfile(formulas, casks, taps, npm globals).stow -Revery package, symlinking configs into$HOME.- Clone the tmux plugins into
~/.config/tmux/plugins/.
Then: exec $SHELL, open nvim (plugins auto-install via vim.pack), and start tmux.
~/<checkout_dir>/
install.sh # bootstrap script
Brewfile # Homebrew bundle (regenerate: brew bundle dump --force)
.gitignore
zsh/ .zshrc
nvim/ .config/nvim/ # Neovim 0.12+ (vim.pack + native LSP)
tmux/ .config/tmux/ # tmux.conf + custom/ + plugins/ (gitignored)
ghostty/ .config/ghostty/
aerospace/ .config/aerospace/ # window manager (active)
sketchybar/ .config/sketchybar/ # status bar
starship/ .config/starship.toml
nushell/ .config/nushell/
gh-dash/ .config/gh-dash/
flashspace/ .config/flashspace/ # workspace manager
yabai/ .yabairc .skhdrc # retired WM, kept for reference
scripts/ test-font.sh, archive/
docs/ cheatsheets, yabai.md
Stow maps each package's contents relative to $HOME, so nvim/.config/nvim/init.lua
becomes ~/.config/nvim/init.lua.
mkdir -p myapp/.config/myapp
$EDITOR myapp/.config/myapp/config.toml
stow -R --target ~ --dir ~/<checkout_dir> myappThen add myapp to STOW_PACKAGES in install.sh and commit.
After installing/removing something with Homebrew:
brew bundle dump --force --file Brewfilestow -D --target ~ --dir ~/<checkout_dir> <package>tmux/.config/tmux/plugins/and**/lazy-lock.jsonare gitignored — plugins are cloned byinstall.sh(tmux) or auto-managed at runtime (nvim)..zshrcguards all optional tools (starship,fnm,atuin,zsh-autosuggestions) withcommand -v, so a half-installed machine still boots a usable shell.- No hardcoded
/Users/...paths remain —$HOMEis used throughout.