Packages — overview¶
Reviewed against 1e30dcf + fix/brewfile-profiles + feat/zed-everywhere, 2026-09-22.
Three install mechanisms, one per OS, plus a handful of cross-OS bootstraps. The generated pages in this section list every entry; this page explains how they are wired.
macOS: Homebrew¶
Brewfile.tmplrenders~/Brewfilefrom three fragments in.chezmoitemplates/brew/:common.Brewfile(every Mac),gui.Brewfile(headless = false),personal.Brewfile(work = false),work.Brewfile(work = true).brew bundleruns on first apply (run_once_install-packages-darwin.sh.tmpl) and again whenever any fragment or the template changes (run_onchange_after_brew-bundle.sh.tmplhashes all four).headlessadditionally passes--no-upgrade.brew bundlenever uninstalls. Removing a line stops future installs; existing boxes keep the package until someone runsbrew bundle cleanup --file=~/Brewfileby hand.- The nightly
dotfiles-brew-syncappends anything installed locally but missing from all fragments to the fragment named in~/.config/dotfiles/brew-sync-target(workon work Macs,personalotherwise;commonis hand-edited only), then signs and pushes a commit tomain. Append-only; see Automations. - Also on first run: Homebrew itself if missing, TPM clone, fzf key bindings.
Linux: distro packages + upstream installers¶
run_once_install-packages-linux.sh.tmpldetects apt, dnf, pacman or apk and installs 13 base packages plus each manager's own spelling offd,xzand the build-tools group.- Upstream install scripts: starship, mise, atuin, zoxide, fzf; Tailscale (personal only); Zed (desktops only).
- GitHub release binaries into
~/.local/bin(install_release_bin, honoursGITHUB_TOKEN): delta, eza, lazygit, gh, direnv, yq, tealdeer, xh. Neovim ≥ 0.11 from the upstream tarball into~/.local/nvimwhenever the distro one is older. JetBrainsMono Nerd Font on desktops. - Antidote and TPM are cloned into
~/.antidoteand~/.tmux/plugins/tpm;chshto zsh when interactive. - Still macOS-only by choice:
k9s,kubectl,helm,kustomize,kubeseal,flux,terraform,mkcert,pre-commit,uv. Thek/tfaliases are inert on Linux. ~/.zprofilewill load Linuxbrew if it exists, but nothing installs it.
Windows: winget¶
run_once_install-packages-windows.ps1.tmplinstalls 20 winget IDs (--exact --silent, including Zed) and the latest PSReadLine module. It exits early with a message if winget is missing.scripts/bootstrap.ps1handles Bitwarden secrets; a Scheduled Task runs the nightly update. Still absent: restic, tmux, GnuPG (use Git for Windows'gpg), direnv, pre-commit, k8s tooling.
Cross-OS bootstraps (chezmoi run_* scripts)¶
| Mechanism | What it installs | Where |
|---|---|---|
run_onchange_after_install-gh-extensions.sh.tmpl |
dlvhdr/gh-dash once gh auth status succeeds |
all OS |
run_onchange_after_update-tldr-cache.sh.tmpl |
refreshes the tealdeer page cache | all OS |
run_onchange_after_import-gpg-key.sh.tmpl |
imports gpg-public-key.asc, sets ultimate ownertrust |
all OS |
Zed settings.json → auto_install_extensions |
Zed extensions, by Zed itself on launch | every desktop |
Neovim init.lua |
lazy.nvim, then every plugin, LSP server (via mason) and tree-sitter parser on first start | wherever nvim runs |
~/.tmux.conf |
TPM and its plugins on first tmux start | macOS, Linux |
~/.zshrc (Linux) |
clones antidote if ~/.antidote is missing |
Linux |
→ Neovim · Zed extensions · zsh plugins · tmux plugins
Runtimes¶
Language runtimes are deliberately not installed by the dotfiles. mise is installed everywhere
and ~/.config/mise/config.toml ships with every tool commented out; mise use -g node@lts (etc.) is a
manual, per-box step. Exceptions that are in the Brewfile: go, node, uv, python@3.14, dotnet
(the last two arrived via brew-sync).