The invisible details of a good menu bar app

Menu bar apps live or die on details nobody consciously notices — launch time, icon weight, and knowing when to shut up.

A menu bar app is a strange product category. Users don’t open it — they live next to it. That changes what quality means.

When I started building Shipnote I kept a list of every menu bar app I’d removed over the years, and why. Almost none were removed for missing features. They were removed for being present at the wrong moments.

The icon is the whole interface

Your icon gets roughly 18×18 points to communicate three states: everything’s fine, something needs you, and something’s wrong. If users have to click to find out which state they’re in, the icon has failed.

The mistake I made first: using color to signal state. Menu bar icons are template images — they should be. The system tints them, dark mode inverts them, and your careful orange dot becomes invisible. Shape changes beat color changes every time.

Launch at login is a promise

If someone enables “launch at login,” they’re telling you the app has become infrastructure. Infrastructure has different rules:

  • It must never show a window at startup.
  • It must never be the reason the login takes longer.
  • It must survive updates without asking anything.
// Register quietly. No windows, no prompts, no "What's new".
if SMAppService.mainApp.status == .notRegistered {
    try? SMAppService.mainApp.register()
}

Knowing when to shut up

The hardest feature I shipped was a notification I removed. Shipnote used to notify when unreleased changes crossed a threshold. Testers turned it off within days — not because the information was wrong, but because release timing is a decision, not an alert.

The replacement was a subtle badge on the icon. Same information, zero interruption. Usage of the feature went up.

The pattern generalizes: a utility earns trust by being ambient. Every interruption spends that trust, and the balance runs out faster than you think.