CLI tool
wickenico/WailBrew avatar
wickenico/WailBrew

WailBrew's version number lives in two files and a sed pipeline edits both, and its Go module is named WailBrew

Minimalistic Homebrew GUI made with Go, Wails and React.

2,843 stars109 forksTypeScriptMIT

At a glance

What is it?
A native Homebrew interface for macOS built with Wails, Go and React, distributed as a signed cask. The build file patches itself for sed dialect, the module path is a bare capitalised name, and the configuration folder section stops mid sentence.
Who is it for?
Fit this if you want a real macOS application in front of Homebrew rather than another shell script wrapper, and if managing services and taps from the same window is the point rather than a bonus. The feature list is broader than the comparison table gives it credit for: services control, a doctor run with deprecated formula detection, cleanup with a dry run preview, a leaves view, a command palette, and a UI in eleven languages.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 4, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One version number, three fields, two files, edited by sed

The build file treats the version as text to be rewritten rather than as a value to be declared.

It starts by asking a Node script for the number, with the version taken from `frontend/package.json` by `./get-version.js`, and then hands that number to the compiler through linker flags, `-ldflags "-X main.Version=$(VERSION)"`. So the binary's version is injected at build time and the source of truth is a frontend manifest.

The bump targets are where it gets interesting. The patch bump target reads the `"version"` field out of `frontend/package.json` with grep and sed, splits it into major, minor and patch, increments the patch, and then applies a substitution to three places: the `"version"` field in `frontend/package.json`, the `"version"` field in `wails.json`, and the `"productVersion"` field in `wails.json`. It ends by echoing that both files were updated. The minor bump target does the same with the minor component and resets the patch to zero.

So a release is three string replacements across two files, with no verification step that all three agreed before the edit. A version that was already inconsistent between the frontend manifest and the Wails config stays inconsistent in a different direction.

The universal build target exists alongside the default one, targeting `darwin/universal`, which is the binary that matches the claim of running natively on both Apple Silicon and Intel.

The build file detects macOS to pick a sed dialect

The first ten lines of the Makefile are two portability shims, and both are about the machine rather than about the app.

make
VERSION := $(shell ./get-version.js)

WAILS := $(shell command -v wails 2> /dev/null || echo $(GOPATH)/bin/wails)

UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
	SED_I := sed -i ''
else
	SED_I := sed -i
endif

The first shim looks for the `wails` binary on the path and falls back to one inside the Go workspace's bin directory, so a contributor does not need the tool installed globally as long as it has been built locally.

The second is the reason the bump targets can work at all across platforms. BSD sed, which is what ships on macOS, requires an empty string argument after `-i` to mean in place, while GNU sed treats a following argument as the backup file suffix and rejects it. The Makefile asks `uname -s` and defines `SED_I` accordingly, then every in-place edit in the version targets goes through that variable instead of calling `sed -i` directly.

The remaining detail is the frontend package manager. The install target is `cd frontend && pnpm install`, so the frontend is a pnpm project, and the version is read out of it by a Node script rather than by make.

The Go module is named WailBrew and has one direct dependency

The module declaration in `go.mod` is a bare capitalised name with no domain in front of it.

`module WailBrew` identifies the module inside this repository and nowhere else. It is not a path anything could fetch, which is fine for an application that is never imported by another module and would be a problem the moment it were.

The dependency list is unusually lopsided. There is exactly one direct requirement, `github.com/wailsapp/wails/v2` at v2.16.0, and then twenty eight entries marked indirect. Nothing in the application's own code requires a library directly; everything arrives through the framework.

Looking at what those indirect entries are for tells you what the framework drags in. Native notifications come from `git.sr.ht/~jackmordaunt/go-toast/v2`, which is how a background update check reaches the Dock badge. The platform webview plumbing shows up as `wailsapp/go-webview2` for Windows, `jchv/go-winloader` for Windows, `go-ole` and `godbus/dbus` for the other platforms, plus `gorilla/websocket` for the dev server's live reload. An HTTP server stack is present too, `labstack/echo/v4` with `gommon` and two `valyala` packages for templating and buffers.

One oddity in the list: four indirect entries come from the same author, `leaanthony`, covering `go-ansi-parser`, `gosod`, `slicer` and `u`. A project scaffolder and a string slicer arriving as transitive dependencies of a desktop shell is the kind of thing a reader would want explained, and nothing in the repository does.

The Go version is declared as 1.26.0.

The cask route is the signed one, and the requirements floor is macOS 11

There are three ways to get this application onto a Mac and the documentation ranks them.

The recommended one is a single cask command:

bash
brew install --cask wailbrew
brew uninstall --cask wailbrew

That route is also the one described as signed and notarized and distributed through the official Homebrew cask, which is the claim that matters for Gatekeeper. The second route is downloading the latest release directly from the project's releases page, offered in a sentence that begins by asking whether you prefer a direct download. The third is building it, since the repository carries the Wails build configuration and a Makefile.

What the documentation does not say is whether the release artifact you download by hand carries the same signature and notarization as the cask. It presents the direct download as a convenience for people who would rather not add a tap, and leaves the trust question open.

The platform floor is stated for both architectures: macOS 11.0 Big Sur and later on Apple Silicon, and macOS 11.0 Big Sur and later on Intel. Homebrew itself has to be installed. The testing position is given with some care, saying the app is primarily tested on the latest macOS versions while the project strives to maintain compatibility with older supported versions, and asking for an issue if a version causes trouble.

Moving the configuration folder never overwrites and only deletes an empty folder

The configuration folder section is the most precisely specified behaviour in the documentation, and it ends mid sentence.

The flow is: open Settings, then Configuration folder, choose an empty folder, for example `~/.config/wailbrew`, and click Move. WailBrew transfers your settings and your Brewfile snapshots, and uses the new location immediately and after restarting. Three rules govern the transfer. Existing files in the destination are never overwritten. Other files in the old folder are left where they are. The old folder is removed only when it ends up empty.

The pointer to the folder is deliberately kept somewhere else. The selected location is recorded in `WailBrew/config-location.json` under the operating system's configuration directory, which is `~/Library/Application Support` on macOS and `$XDG_CONFIG_HOME` or `~/.config` on Linux, and that small record stays in its standard location so the application can find the chosen folder on startup.

Two things follow. An environment variable named `WAILBREW_CONFIG_FILE` takes precedence over the saved selection, and when it is set in the app's environment the folder control is disabled, at which point the documentation stops mid sentence.

The Linux paths are the other loose end. This is a macOS cask with a macOS 11 floor and a Windows and Linux webview stack arriving through its framework, and the configuration logic carries the Linux locations with it, which suggests the code was written for more platforms than the distribution targets.

The comparison table is the project's own account of another project

One section sets WailBrew beside Cakebrew in a table, and half of it is a set of claims about software this repository does not contain.

The rows cover managing formulae, where both are marked as supported; managing casks, where WailBrew is full and Cakebrew is marked limited; Homebrew services management, where WailBrew is supported and Cakebrew is marked not supported; `brew doctor` and cleanup, where Cakebrew is marked partial; Apple Silicon native support, which both have; a localized interface in eleven languages, which only WailBrew is given; light and dark mode, where Cakebrew is marked partial; being actively maintained, where Cakebrew is marked not; and open source, where both are marked yes with WailBrew noted as MIT.

None of the Cakebrew cells is linked to a source, dated or measured. The relationship is stated in the text above the table, that WailBrew was inspired by Cakebrew and aims to be a modern, actively maintained successor.

Two observations. First, the app's own claim to being actively maintained is exactly the claim the table denies its predecessor, so the row is doing rhetorical work as much as descriptive work. Second, the README names one alternative and one inspiration, while the wider Homebrew interface ecosystem contains several other names, so the table is a comparison with a single entry rather than a survey.

For a reader deciding between them, the services row is the substantive difference, since start, stop, restart and run against a service is the one capability on that list that a package manager does not otherwise provide.

A no-quarantine toggle, mirror sources and a log of every command

The advanced settings are the part of this application that changes what your machine does, and they are listed without much ceremony.

There is proxy and mirror source support, explicitly including China mirrors, described as being for faster installs on restricted networks. There is a configurable set of outdated-check flags, with greedy cask updates given as the example. There is a custom brew path with architecture auto-detection, custom cask options, a no-quarantine toggle, and auto-relaunch plus auto-cleanup after upgrades.

Two of those deserve a second look. A mirror source redirects where packages are fetched from, so the trust decision moves from Homebrew's default host to whatever host you name. A no-quarantine toggle removes the Gatekeeper quarantine attribute from what has been downloaded, which is exactly the check that exists to warn you about an application that arrived from somewhere new. Neither is dangerous on its own, and both are the kind of setting that should be turned on deliberately.

Session logging is the third. It is described as being for transparency into every command run, which means the application keeps a record of the brew invocations it issued on your behalf. For most people that log is the most useful artifact in the whole feature set when something has gone wrong, and it is worth knowing it exists before you need it.

The rest of the extras are ordinary quality of life: a command palette with keyboard shortcuts, and light and dark mode synced with the macOS appearance.

Editorial conclusion

Fit this if you want a real macOS application in front of Homebrew rather than another shell script wrapper, and if managing services and taps from the same window is the point rather than a bonus. The feature list is broader than the comparison table gives it credit for: services control, a doctor run with deprecated formula detection, cleanup with a dry run preview, a leaves view, a command palette, and a UI in eleven languages. Four things to settle before you install it. Which route you take, because the cask is the one described as signed and notarized while a direct release download is offered without stating whether it carries the same signature. What you enable in the advanced settings, since a proxy and mirror source option, a no-quarantine toggle and greedy cask update flags each change what your machine downloads and executes. Where its settings live, since the configuration folder can be moved and the override environment variable wins over the saved choice. And what you do about session logging, which records every command the app runs, since that log is exactly what you would want if something unexpected ever executed.

Frequently asked questions

What is WailBrew?

A graphical interface for Homebrew on macOS, built with Wails, Go and React, for installing, updating and managing formulae, casks, taps and services. It is MIT licensed and distributed through the official Homebrew cask as a signed and notarized application.

How do I install and then remove WailBrew?

With brew install --cask wailbrew and brew uninstall --cask wailbrew. Downloading the latest version directly from the project's releases page is offered as an alternative to the cask route, and building from source is possible with the Wails toolchain.

Which macOS versions does WailBrew run on?

macOS 11.0 Big Sur and later on both Apple Silicon and Intel Macs, with Homebrew required. The app is primarily tested on the latest macOS versions, and the project says it strives to maintain compatibility with older supported versions.

Which languages is the WailBrew interface available in?

Eleven: English, German, French, Turkish, Simplified and Traditional Chinese, Brazilian Portuguese, Russian, Korean, Hebrew and Spanish. Translation contributions are taken through pull requests, with a translation guide in CONTRIBUTING.md.

Does WailBrew manage Homebrew services?

Yes. It lists all services with their status and can start, stop, restart and run them directly from the interface. The project's own comparison table marks service management as unsupported in Cakebrew.

Can I move where WailBrew stores its settings?

Yes. Settings, Configuration folder moves settings and Brewfile snapshots to a folder you choose, never overwrites existing files in the destination, and removes the old folder only when it is empty. The choice is recorded in WailBrew/config-location.json, and WAILBREW_CONFIG_FILE overrides the saved selection.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. Releases
  5. wickenico/WailBrew on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/wickenico-wailbrew.svg)](https://hysenlabs.com/projects/wickenico-wailbrew)