Skip to content

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.tmpl renders ~/Brewfile from three fragments in .chezmoitemplates/brew/: common.Brewfile (every Mac), gui.Brewfile (headless = false), personal.Brewfile (work = false), work.Brewfile (work = true). brew bundle runs 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.tmpl hashes all four).
  • headless additionally passes --no-upgrade.
  • brew bundle never uninstalls. Removing a line stops future installs; existing boxes keep the package until someone runs brew bundle cleanup --file=~/Brewfile by hand.
  • The nightly dotfiles-brew-sync appends anything installed locally but missing from all fragments to the fragment named in ~/.config/dotfiles/brew-sync-target (work on work Macs, personal otherwise; common is hand-edited only), then signs and pushes a commit to main. Append-only; see Automations.
  • Also on first run: Homebrew itself if missing, TPM clone, fzf key bindings.

→ Brewfile inventory

Linux: distro packages + upstream installers

  • run_once_install-packages-linux.sh.tmpl detects apt, dnf, pacman or apk and installs 13 base packages plus each manager's own spelling of fd, xz and 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, honours GITHUB_TOKEN): delta, eza, lazygit, gh, direnv, yq, tealdeer, xh. Neovim ≥ 0.11 from the upstream tarball into ~/.local/nvim whenever the distro one is older. JetBrainsMono Nerd Font on desktops.
  • Antidote and TPM are cloned into ~/.antidote and ~/.tmux/plugins/tpm; chsh to zsh when interactive.
  • Still macOS-only by choice: k9s, kubectl, helm, kustomize, kubeseal, flux, terraform, mkcert, pre-commit, uv. The k/tf aliases are inert on Linux.
  • ~/.zprofile will load Linuxbrew if it exists, but nothing installs it.

→ Linux inventory

Windows: winget

  • run_once_install-packages-windows.ps1.tmpl installs 20 winget IDs (--exact --silent, including Zed) and the latest PSReadLine module. It exits early with a message if winget is missing.
  • scripts/bootstrap.ps1 handles Bitwarden secrets; a Scheduled Task runs the nightly update. Still absent: restic, tmux, GnuPG (use Git for Windows' gpg), direnv, pre-commit, k8s tooling.

→ Windows inventory

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).