Connor's Blog

Stop Autoupdating in My Face

There’s a joke on the internet about how Microsoft doesn’t understand consent due to their forcefulness when it comes to updates across their products, particularly Windows.

Although macOS generally leaves me alone, occasionally showing me a notification about a new update, there’s a huge number of macOS apps that think it’s acceptable to literally shove their updates in your face, stealing focus and trying to acquire privileges to install the update before even asking if you want to update. They don’t always even show you what’s in the update beforehand.

I don’t mean to pick on Cherry Studio, it’s only one app of many that do this, but it was a convenient one to screenshot that did it this evening:

This modal should not be mistaken for a request for consent. It displayed straight away when I opened the app. This is like sitting down in a restaurant, the waiter bringing a main course, putting it on your table, then asking if he can add it to the bill.

Mitchell Hashimoto who develops a terminal emulator called Ghostty realised this was a problem when his app somewhat embarrassingly showed an update prompt during an OpenAI keynote.

He wrote a blog post about changing Ghostty’s updates to be less intrusive. In the post he explains that Ghostty uses a commonly used framework called Sparkle that has this intrusive style by default. For this reason, I would blame Ghostty’s “rude” (Mitchell’s words) update dialog on Sparkle. It’s a bad default that infects apps across the Apple ecosystem.

If an app wants to uninterruptively (without stealing focus or blocking content!) nudge or notify the user about an update, that’s fine. But updates should be a deliberate action, not something that the app tries to force upon the user when they’re probably trying to get shit done.

Disabling Automatic Updates

Since Sparkle is used by so many apps I was hoping to find a global update toggle that would end this rudeness once and for all. I managed to find a flag, but unfortunately it only works if you’ve set it before running an app for the first time. It’s one I’ll be sure to set straight away when I next reset my MacBook:

defaults write -g SUEnableAutomaticChecks -bool NO

Squirrel.Mac is another commonly used update framework. It checks if DISABLE_UPDATE_CHECK=1 is set before trying to update, but from what I can tell, apps can opt out of respecting this flag. I set this environment variable globally anyway with launchctl setenv DISABLE_UPDATE_CHECK 1. Thanks to Mac Ops for this blog post.

There’s also electron-updater, which it appears cannot be globally neutered or disabled at all.