1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# The account's tools: what this repo's own config and scripts use, so that a
# machine with only this repo has what the shell, editor and terminals expect,
# plus the handful of Mac apps this account wants on any machine it uses.
# What is not here: per-machine apps and toolchains -- install those by hand --
# and server software, which comes from whatever provisions that machine.
# install.sh applies this with `brew bundle`, which only adds.
# Something breaks without these.
brew "bash" # macOS ships 3.2. szecret's fallback that fetches
# age -- the path taken before this file is applied
# -- dies there on `${os,,}`, and config/bashrc
# looks for the bash-completion 2.x that needs 4.2
brew "tmux" # both terminals start every window in tmux
brew "neovim" # the editor; vi, vim and git all call nvim
brew "age" # szecret
brew "git"
brew "git-lfs" # config/git/config sets up the lfs filter
brew "fzf" # zshrc loads its key bindings from Homebrew
# Used when present.
brew "bat" # man pages, fzf previews
brew "lsd" # ls
brew "ripgrep" # nvim's grep
brew "the_silver_searcher"
brew "gh" # config/profile hands it the GitHub token
brew "mosh" # alacritty-mosh, mosh-tmux.sh
brew "terminal-notifier" # bin/notify
brew "fswatch" # bin/sz-wait-for
brew "n" # node versions, under $N_PREFIX
brew "bash-completion"
brew "shellcheck"
brew "tree-sitter-cli" # nvim-treesitter generates and compiles parsers with it
# Wanted on any machine this account uses, though nothing here reads them.
brew "glow" # markdown rendered in the terminal
cask "alacritty"
cask "hammerspoon"
cask "neovide-app"
# Wanted on any Mac this account uses, though nothing here depends on it.
cask "keepingyouawake" # menu-bar toggle that stops the Mac sleeping
cask "jordanbaird-ice" # Ice: hides and arranges the menu bar itself
# Not in homebrew-cask, so it comes from the author's own tap, with what that
# means: nobody reviewed the cask, and the tap can change what it installs
# between two runs of install.sh, which applies this file again every time.
# What earns it that: the app is signed with a Developer ID and notarized
# (checked 2026-10-01), so macOS can still say who shipped it.
#
# toggleMute was here too and was dropped: ad-hoc signed, no TeamIdentifier,
# and `spctl -a` rejecting the bundle as modified since signing. It only runs
# with its quarantine flag cleared, and nothing in a shared setup script should
# quietly put an unverifiable binary past Gatekeeper on every machine.
tap "b451c/quickmd"
cask "b451c/quickmd/quickmd" # qmd.app: native markdown viewer, live preview,
# AppKit rather than Electron
# Only where no Ghostty is installed yet: a machine running the ghostty@tip
# build would collide with a second cask over /Applications/Ghostty.app.
cask "ghostty" unless File.exist?("/Applications/Ghostty.app")
# Every Nerd Font Homebrew has, asked at run time rather than listed, so new
# families arrive without editing this file. brew bundle evaluates it with no
# brew on PATH, hence the full path it passes in HOMEBREW_BREW_FILE.
brew_bin = ENV.fetch("HOMEBREW_BREW_FILE") { "#{ENV.fetch("HOMEBREW_PREFIX", "/opt/homebrew")}/bin/brew" }
`"#{brew_bin}" search --cask nerd-font`.split.grep(/\Afont-.*-nerd-font\z/).each { |font| cask font }
|