https://github.com/ihazgithub/topoff
Stop forgetting brew update && brew upgrade. A menu bar app that keeps your Homebrew packages fresh — automatic checks, one-click updates, zero terminal required.
https://github.com/ihazgithub/topoff
brew developer-tools homebrew homebrew-cask homebrew-updater macos macos-app menu-bar-app menubar package-manager productivity swift swiftui utility
Last synced: 2 days ago
JSON representation
Stop forgetting brew update && brew upgrade. A menu bar app that keeps your Homebrew packages fresh — automatic checks, one-click updates, zero terminal required.
- Host: GitHub
- URL: https://github.com/ihazgithub/topoff
- Owner: ihazgithub
- License: mit
- Created: 2026-01-25T19:26:43.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-06-28T01:05:52.000Z (2 days ago)
- Last Synced: 2026-06-28T03:00:20.608Z (2 days ago)
- Topics: brew, developer-tools, homebrew, homebrew-cask, homebrew-updater, macos, macos-app, menu-bar-app, menubar, package-manager, productivity, swift, swiftui, utility
- Language: Swift
- Size: 11 MB
- Stars: 89
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
TopOff
A lightweight native Mac menu bar app for keeping Homebrew packages up to date.
Free · MIT licensed · No telemetry · macOS 14+
Version 2.0 is here — signed and notarized by Apple, so it installs cleanly on first launch. See what's new →
If you use Homebrew, you have probably forgotten to run `brew update && brew upgrade` for weeks at a time. TopOff checks quietly in the background, shows outdated packages from the menu bar, and lets you update with one click.
## Features
- **One-click updates** — Run `brew update && brew upgrade` from your menu bar
- **Automatic update checking** — Periodically checks for outdated packages in the background
- **Smart icon status** — Full mug when up-to-date, half-full when updates are available, animated spinner when actively updating
- **Real-time progress** — See exactly which package is being updated as it happens — click the menu bar during updates to watch live
- **Package details at a glance** — See outdated package names and version changes directly in the menu
- **Selective updates** — Update or skip individual packages
- **Greedy mode** — Optionally include apps that handle their own updates (Chrome, Slack, etc.) in both scheduled checks and upgrades
- **Auto cleanup** — Automatically runs standard `brew cleanup` after upgrades, with an optional deep-prune style for power users
- **Deep cache prune** — Manually run `brew cleanup --prune=all`, or opt Auto Cleanup into it from the Cleanup submenu
- **Admin retry for protected packages** — If a cask needs admin access, TopOff prompts for your password and retries automatically
- **Update history** — View recently updated packages with version changes
- **Configurable check interval** — Check every hour, 4 hours (default), 12 hours, 24 hours, or manually
- **Launch at login** — Always have TopOff ready
- **Automatic retry on network restore** — If the app launches without internet (e.g., at startup before WiFi connects), it automatically checks for updates once connectivity is restored
- **Update notifications** — Checks GitHub for new releases on launch and periodically while running
- **See what changed** — View upgraded packages and freed disk space in the menu
## Screenshots

The menu bar icon tells you at a glance if updates are available:
| Icon | Meaning |
|------|---------|
| Full mug | All packages are up-to-date |
| Half-full mug | Updates are available (needs a refill!) |
| Spinning arrows | Checking for updates or updating — click to see live progress |
| Checkmark | Update completed successfully |
## Installation
### Download (Recommended)
1. Download the [latest DMG](https://github.com/ihazgithub/TopOff/releases/latest/download/TopOff-v2.0.1.dmg)
2. Open the DMG and drag TopOff to your Applications folder
3. Launch TopOff. It's signed and notarized by Apple, so it opens immediately on first launch — no trip through Privacy & Security needed.
### Build from Source
1. Clone this repository
2. Open `TopOff/TopOff.xcodeproj` in Xcode
3. Build and run (⌘R)
### Requirements
- macOS 14.0 or later
- [Homebrew](https://brew.sh) installed
## Usage
1. Click the beer mug icon in your menu bar
2. See which packages need updating with version details
3. Choose **Update All**, **Update All (Greedy)**, or update individual packages
4. Watch the icon animate while updates run
5. Check the menu to see what was upgraded and how much disk space was freed
### Options
All preferences are available under the **Options** submenu:
- **Launch at Login** — Start TopOff when you log in
- **Auto Cleanup** — Automatically runs standard `brew cleanup` after upgrades (on by default)
- **Cleanup** — Run standard cleanup, run **Deep Cache Prune…**, or choose the saved **Auto Cleanup Style**
- **Auto Cleanup Style** — Defaults to standard `brew cleanup`. Power users can opt into `brew cleanup --prune=all` after a confirmation step. This removes Homebrew cached downloads to reclaim more disk space, but does not uninstall apps or command line tools.
- **Greedy Mode** — Always check and update everything, including apps that auto-update themselves (off by default — see [Greedy Mode explained](#whats-the-difference-between-update-all-and-greedy))
- **Check Interval** — How often TopOff checks for outdated packages:
- **View Update History** — See recently updated packages with version changes
| Setting | Behavior |
|---------|----------|
| Every hour | Check every 60 minutes |
| Every 4 hours | Default setting |
| Every 12 hours | Check twice daily |
| Every 24 hours | Check once daily |
| Manual only | Only check when you click "Check for Updates" |
## What's the difference between Update All and Greedy?
Some casks (Chrome, Slack, VSCode, etc.) have built-in auto-update and are normally skipped by Homebrew. Greedy mode tells Homebrew to update them anyway.
**By default**, TopOff gives you both options:
| Button | Command | What it does |
|--------|---------|--------------|
| Update All | `brew upgrade` | Updates packages that don't auto-update themselves |
| Update All (Greedy) | `brew upgrade`, then `brew upgrade --greedy` | Updates everything, including apps that auto-update |
Scheduled background checks use normal mode, so those auto-updating apps won't show up as outdated.
**With Greedy Mode enabled** (in Options), TopOff switches to greedy everywhere:
- Scheduled checks use `brew outdated --greedy` so auto-updating apps appear as outdated
- The normal "Update All" button is hidden since "Update All (Greedy)" covers everything
- This is ideal if you prefer Homebrew to manage all your app updates in one place
Greedy Mode is off by default. You can toggle it anytime under **Options > Greedy Mode**.
## Privacy & Network Connections
TopOff makes only one network connection:
- **GitHub API** (`api.github.com`) — Checks for new TopOff releases on launch and periodically while running
That's it. No analytics, no telemetry, no tracking.
### Why does my firewall show other connections?
If you use a firewall like Little Snitch or Lulu, you may see TopOff associated with connections to other servers (e.g., InfluxData, Google, etc.). **These connections are from Homebrew, not TopOff.**
When TopOff runs `brew update` or `brew upgrade`, it spawns Homebrew as a child process. Firewalls often attribute child process network activity to the parent app. These connections may come from:
- Homebrew's own analytics (can be disabled with `brew analytics off`)
- Specific formulas or casks being updated that have telemetry
- Package download servers
You can safely allow or deny these connections based on your preferences — denying them won't affect TopOff's functionality.
## License
MIT License - feel free to use, modify, and distribute.
## Attribution
TopOff is open source under the MIT License.
If you use, fork, or build on TopOff, attribution to Thomas Haslam and a link to the original project are appreciated where practical, such as in your README, credits, or release notes.
## Credits
Created by **Thomas Haslam**