TeamMay 6, 20255 min read

Why Your Team Needs a Shared Brewfile

Different developers, different tools, different versions. A shared Brewfile eliminates 'it works on my machine' by standardizing what every developer has installed.

The Problem: Tool Drift

Ask five developers on your team what version of Node they are running. You will get five different answers. Ask them if they have jq installed. Two of them do not know what it is. Ask about gh, the GitHub CLI. Three have it, two use the web interface instead.

Tool drift is the natural result of manual setup. Each developer installs what they need when they need it, skips tools they do not recognize, and never updates tools they installed six months ago. Over time, every machine on the team diverges.

The consequences are real: build scripts that assume jq is installed fail silently on machines where it is missing. A developer debugging a production issue cannot use the team's standard tools because they never installed them. Pair programming sessions start with "wait, you don't have that installed?"

A Brewfile Is a Team Standard

A Homebrew Brewfile is a declarative list of packages, casks, and taps. Running brew bundle install against a Brewfile installs everything in it. If a package is already installed, Homebrew skips it. This makes Brewfiles idempotent — safe to run repeatedly.

Team Brewfile
# ~/.Brewfile — Team standard tools # Core development brew "git" brew "gh" brew "node" brew "python@3.12" brew "go" # CLI utilities brew "jq" brew "yq" brew "ripgrep" brew "fd" brew "fzf" brew "bat" brew "httpie" # Infrastructure brew "docker" brew "docker-compose" brew "awscli" brew "terraform" # Database clients brew "postgresql@16" brew "redis" # Applications (macOS casks) cask "visual-studio-code" cask "iterm2" cask "docker" cask "slack"

Creating Your Team Brewfile

Start by surveying what your team actually uses. Run brew bundle dump --file=~/Brewfile.dump on a few developers' machines and compare the results. The tools that appear on every machine are your baseline. Add any tools required by build scripts or team workflows.

Keep the team Brewfile focused on what the team needs. A JSON processor like jq that your deploy scripts require belongs in the team Brewfile. A personal productivity app like a Pomodoro timer does not. Aim for the common denominator plus required tools.

Version pinning: Homebrew does not pin versions well, but you can specify versioned formulas like python@3.12 or postgresql@16 for tools where version consistency matters. For strict version control, consider adding version managers like nvm or pyenv to the Brewfile and managing versions through those.

Syncing the Brewfile with ConfigSync

Add your team Brewfile to ConfigSync and set up automatic installation on pull:

Sync and auto-install
# Track the team Brewfile configsync add file ~/.Brewfile # Set up post-pull hook to install automatically # In ~/.configsync/config.yaml: hooks: post_pull: - "brew bundle install --file=~/.Brewfile --no-lock" # Push the config configsync push -m "team Brewfile with auto-install hook"

Now every developer who pulls gets the updated Brewfile and the post-pull hook automatically runs brew bundle install. New packages are installed without anyone having to read a changelog or follow manual instructions.

Handling Personal Additions

Developers will want tools beyond the team standard. The cleanest approach is to use the team Brewfile as a baseline and maintain a separate personal Brewfile:

Personal additions
# Team Brewfile at ~/.Brewfile (synced via ConfigSync) # Personal additions at ~/.Brewfile.personal (also synced) # Post-pull hook installs both: hooks: post_pull: - "brew bundle install --file=~/.Brewfile --no-lock" - "brew bundle install --file=~/.Brewfile.personal --no-lock 2>/dev/null || true"

The 2>/dev/null || true on the personal Brewfile ensures the hook does not fail if the personal file does not exist. Developers who have personal additions get them installed. Developers who do not have a personal Brewfile skip it silently.

Keeping It Updated

When the team adopts a new tool, the workflow is simple:

Add a new team tool
# Add the tool to the team Brewfile echo 'brew "k9s"' >> ~/.Brewfile # Push the update configsync push -m "add k9s for Kubernetes management" # Every developer gets it on next pull # The post-pull hook installs it automatically

No Slack announcement. No wiki update. No hoping everyone reads the message. The Brewfile is the source of truth for team tools. When it changes, every developer's machine converges to the new standard on their next pull.

A shared Brewfile is one of the simplest changes a team can make with the highest impact. It eliminates tool drift, speeds up onboarding, and ensures that every developer can run every script, build, and workflow the team depends on.

Ready to try ConfigSync?

Sync your entire dev environment across machines in minutes. Free forever for up to 3 devices.