MacWrench 1.1.4 — Fixing the Homebrew crash

This patch fixes a crash in the Homebrew tab that some users hit when navigating between packages.

The bug

If you were browsing your Homebrew packages and clicking between formulae and casks, the app could crash. Not every time — it depended on timing. But often enough to be a problem.

The crash showed up as a NavigationLink losing its backing data mid-transition. You'd tap a package, the detail view would start loading, and then the whole thing would bail.

Root cause

We use TCA (The Composable Architecture) to manage state, and the Homebrew tab had a design flaw: the refresh action (checking which packages are outdated) and the upgrade action (actually updating them) shared the same code path. When both ran at the same time — say you hit refresh while an upgrade was still in progress — the state updates would conflict. The NavigationLink's data would get pulled out from under it, and the view would crash.

Stale Homebrew lock files made this worse. If a previous Homebrew operation failed or was interrupted, it could leave a lock behind. That lock would block subsequent operations silently, which meant the app's state and Homebrew's actual state would drift apart.

The fix

We separated refresh and upgrade into independent operations that can't step on each other. If one is running, the other waits. The state updates are now isolated, so NavigationLink always has consistent data to work with. We also added cleanup for stale lock files so a previously failed operation doesn't block future ones.

Also in this batch: v1.1.3

This shipped alongside v1.1.3, which replaced our custom self-update system — about 600 lines of code that downloaded DMGs, extracted them, and used AppleScript to install updates — with the Sparkle framework. Sparkle is the standard for macOS app updates. It handles delta updates, code signing verification, and the install-and-relaunch flow. Updates now just work the way you'd expect on macOS.

Full list of changes is in the changelog.