macOS-primary dotfiles with Linux and WSL support, organized around home/ for home-level files and config/ for XDG-managed config.
bootstrap.sh only needs git, stow, and zsh. On a fresh macOS machine:
brew install git stow zsh./bootstrap.shThis stows home/ into $HOME and config/ into $XDG_CONFIG_HOME, then asks whether to run the matching platform setup script.
Brewfile is the workstation package manifest for the primary macOS machine. It is not intended to be a cross-platform dependency source.
brew bundle installYou can run the platform setup scripts directly later:
./scripts/platform/macos.sh
./scripts/platform/linux.shIf your machine already has dotfiles in place and you want to import them into this repo:
./bootstrap.sh --adopt--adopt is interactive only. It uses stow --adopt, which can overwrite repo files with existing local files. Review the result with git diff.
dotfiles/
├── assets/
│ └── macos/ # Non-stowed assets used by platform setup
├── Brewfile
├── config/ # Stowed into ~/.config
│ ├── fd/
│ ├── ghostty/
│ ├── git/
│ ├── oh-my-posh/
│ ├── ripgrep/
│ ├── tealdeer/
│ ├── topgrade.toml
│ └── zsh/
├── home/ # Stowed into ~
│ └── .zshenv
├── scripts/
│ ├── lib/common.sh
│ └── platform/ # Optional platform setup scripts
└── bootstrap.sh
./bootstrap.shstowshome/into$HOMEandconfig/into$XDG_CONFIG_HOME.- Re-run
./bootstrap.shafter adding or moving files insidehome/orconfig/. - Keep XDG-managed config under
config/; keep only true home-level files inhome/.
home/.zshenv: early shell environment such as XDG dirs andZDOTDIRconfig/zsh: Zsh config fragments and the Oh My Posh promptconfig/git: Git config and global ignore rulesconfig/ghostty: Ghostty configconfig/fd,config/ripgrep,config/tealdeer, andconfig/topgrade.toml: CLI tool config
Brewfile: workstation package manifest for the primary macOS setupscripts/platform/linux.sh: locale and default shell setup for Linux / WSLscripts/platform/macos.sh: macOS defaults, Xcode CLT, Rosetta, custom keyboard layout, and power settings
Keep machine-specific overrides untracked in the paths already ignored by git:
config/zsh/.zshrc.localconfig/zsh/rc.d/*.local.zshconfig/git/gitconfig.local
These files are for local aliases, secrets, machine-specific paths, or other overrides that should not be shared.
bootstrap.shis the only stow entrypoint- re-run
./bootstrap.shafter adding or moving tracked files insidehome/orconfig/ - the Ghostty custom icon lives in
config/ghostty/next to the config that references it - shell plugins (
zsh-autosuggestions,zsh-syntax-highlighting) install viaBrewfile; no separate plugin manager bootstrap is required
Tracked files are live immediately because Stow symlinks them into place. After adding new files, re-run:
./bootstrap.shConfigs are kept out of $HOME where possible:
~/.configfor config~/.local/sharefor data~/.local/statefor state~/.cachefor cache
System and tool updates run through topgrade. Homebrew app auto-updates are disabled in favor of brew upgrade --greedy-auto-updates via topgrade.