Open Source

How I Manage Homebrew From a UI

BrewUI is Homebrew's official macOS GUI. I'm a terminal person by default, but here's why I installed it anyway, how the configuration works, and what upgrading and installing packages looks like from the app instead of a shell.

6 min read
Rows of beer taps lined up on a bar
On this page

I like the terminal. brew install, brew upgrade, brew list, that’s muscle memory at this point. So when I saw that Homebrew shipped an official macOS GUI, my first reaction was “why would I need that.” A week of using it changed my mind, mostly because I realized I hadn’t looked at half my outdated packages in weeks. Scrolling through brew outdated in a terminal is nobody’s idea of a good time.

BrewUI is Homebrew’s own native macOS app, built by the Homebrew team itself, not a third-party wrapper, and already past 2,200 stars on GitHub. It’s licensed AGPL-3.0, a stricter copyleft than Homebrew itself, which ships under BSD-2-Clause. This is how I set it up, what tripped me up in configuration, and two real walkthroughs of upgrading and installing a package through it instead of the shell.

Why bother with a UI for a CLI tool

Homebrew’s own numbers made the case for me before the app did. I have 131 outdated formulae and casks sitting on this machine right now. Reading that list from brew outdated is a wall of version strings. Scanning the same list in BrewUI, I can see at a glance which packages are formulae versus casks, which ones are just transitive dependencies I don’t recognize, and which ones I actually care about, with the package’s homepage, license, and dependents one click away.

The terminal wins for automation and speed. The UI wins for the moments where you’re not running a command you already know, you’re deciding what to do next.

Installing and configuring it

Install is one line, same as any other cask:

brew install --cask homebrew-app

That puts a regular app called Homebrew in /Applications. Launch it from Finder, or from the terminal like anything else:

open -a "Homebrew"

The part that actually tripped me up was configuration. BrewUI does not read your shell. It launches Homebrew through an isolated /bin/zsh with your login shell’s startup files, aliases, and exported environment variables switched off entirely. Whatever HOMEBREW_* variables you’ve got sitting in your .zshrc do nothing here.

Instead, Homebrew options go in a brew.env file:

mkdir -p ~/.homebrew
cat >> ~/.homebrew/brew.env <<'EOF'
HOMEBREW_NO_ANALYTICS=1
HOMEBREW_NO_ENV_HINTS=1
EOF

A few rules that aren’t obvious until you hit them:

  • Lines are literal NAME=value. Skip export, shell expansion, and command substitution: none of it works here.
  • User settings (~/.homebrew/brew.env) override installation-level settings, which override system-level settings, unless the system file sets HOMEBREW_SYSTEM_ENV_TAKES_PRIORITY=1.
  • You have to relaunch BrewUI after editing the file. It doesn’t hot-reload.
  • The app’s own Configuration tab shows you what Homebrew’s environment actually looks like from its point of view, which can legitimately differ from what env | grep HOMEBREW shows you in Terminal, because it is a different, deliberately clean environment.

Upgrading a package

The Upgrades tab lists everything outdated, formulae and casks together, with a search box and a filter for each. I searched for gh, the GitHub CLI, which had a real upgrade sitting there: v2.97.0 to v2.100.0.

BrewUI's Upgrades tab with gh selected, showing version, license, and the terminal command before running it

The search turned up something I didn’t expect: it says “Showing 5 of 131 upgrades,” because BrewUI matches gh as a substring, not a whole package name. Ghostscript, highway, and both libnghttp libraries all got swept in along with the real gh, and the Upgrade All button in that top box would have upgraded all five at once. That’s a genuine trap if you’re skimming a search result instead of reading it. I wanted just gh, so I used the detail panel on the right instead: it shows the scoped brew upgrade --formula gh command before running anything, with a Copy button next to it. I could paste that into Terminal myself and get the identical result.

I clicked Upgrade, and the console at the bottom of the window switched from “No activity” to a live stream of the actual brew output: pouring the bottle, cleanup of the old version’s cache, the caveats about zsh completions, and the final confirmation line.

BrewUI's console showing the live brew upgrade gh output, ending with the version bump confirmation

It’s the same transcript brew upgrade gh would print in a terminal, scrollable and copyable. That pattern holds across the whole app: a GUI sitting in front of Homebrew, showing the real command and the real output every time.

Installing a new package

For a fresh install I used jq, which wasn’t on this machine at all. The Discover tab searches the full Homebrew catalog, formulae and casks, over 9,000 packages according to the app’s own count, pulled from the Homebrew JSON API.

BrewUI's Discover tab with search results for jq, showing the install command before running it

Same pattern as the upgrade: the detail panel shows brew install jq before you commit to anything, along with jq’s one dependency (oniguruma), its license, and a link to its homepage. I clicked Install, and the console picked up the real brew install transcript: bottle manifest download, fetch, pour, done.

BrewUI's console mid-install for jq, with the package now marked INSTALLED in the results list

A few seconds later jq showed up flagged as installed in the search results, and it’s usable from the terminal exactly as if I’d typed brew install jq myself, because that’s literally the command that ran.

Is it worth it

What won me over, for someone who trusts the CLI more than any GUI, is that it never lies about what it’s doing. Every mutating action shows the literal command first, and the console shows real brew output. 131 outdated packages is a genuinely unpleasant wall of text in brew outdated; in BrewUI it’s a searchable, filterable list I can triage. And the app is honest about being thin: it shells out to the same brew you already have installed, so whatever bugs or fixes land in Homebrew itself show up here automatically. Even the Configuration tab, which surfaces Homebrew’s actual environment and how it can differ from your Terminal’s, is a decent debugging tool on its own, separate from the rest of the app.

The complaints are smaller but real. It needs macOS 26 or newer, so if you’re on an older release this isn’t an option yet. The brew.env requirement is a genuine onboarding tax: anyone with HOMEBREW_* exports in their .zshrc will be confused the first time BrewUI quietly ignores them, and the fix isn’t discoverable without reading the docs. It’s also new: the repository’s first commit is from March 2026, and it’s still at v0.4.4. It’s Homebrew’s own project and already works well, but it hasn’t had years to accumulate the edge-case fixes brew itself has. And old habits die hard: for a one-off brew install <something-i-already-know-the-name-of>, typing is still faster than opening an app, searching, and clicking. The UI wins for browsing and batch upgrades, not for muscle memory.

I still reach for the terminal first. But BrewUI earned a permanent spot in my Applications folder. It makes brew easier to see, and that’s the whole reason I kept it.