Story
I got tired of missing Zabbix alerts, so I built a menu bar app
If you work with Zabbix, you probably know the setup: one browser tab per Zabbix server, a dashboard you refresh out of habit, and alert emails that stopped meaning anything a long time ago. This is the story of why I got rid of all that and built a tiny app that lives in my Mac’s menu bar.
Too many servers, too many tabs
I don’t watch one Zabbix. I watch several: production on one server, staging on another, a few environments that belong to other teams, and an older installation nobody wants to touch. Each one has its own frontend, its own login and its own browser tab.
The tab I needed was never the one I had open. Sessions expired at the worst moment. And with my browser full of tabs, “keeping an eye on Zabbix” really meant remembering to click through all of them every now and then. Sooner or later, I didn’t.
Then there are host groups. On a shared Zabbix you see everyone’s problems: the network team’s switches, the database replicas, the test machines someone forgot to turn off. The few problems that were actually mine drowned in a list of things I couldn’t act on.
Notifications didn’t save me either. Alert emails got a filter, then a folder, then I stopped opening the folder. The chat channel got muted. The irony of monitoring is that the more it tells you, the less you listen.
What I actually wanted
I wanted to glance at one place and know, in a second, whether something needed me. Specifically:
- All my Zabbix servers together, without a tab for each one.
- Only what matters to me: my host groups, my severities, nothing else.
- Somewhere I already look, without switching context.
- A notification only when something is actually new.
On a Mac, that place is the menu bar. It’s always visible, and it already shows the clock, Wi-Fi and battery. A small “Z” turning red with a number next to it is exactly the amount of information I need, until I need more.
So I built Zabbix Toolbar. A red “Z” means something needs me. Click it, and every active problem from every server is there, grouped by server. Click a problem and the event opens in Zabbix. Host groups I don’t care about are filtered out everywhere: list, icon and notifications.
The hard parts
The idea fits in a sentence. Making it something I’d trust during an incident took longer than I expected.
Deciding what “needs me” means
A problem in Zabbix isn’t simply “on” or “off”. Someone may have already acknowledged it. It may belong to a group I ignore. It may be low severity on a server where I only care about disasters. And I may have already seen it myself without wanting to touch it in Zabbix, where acknowledgements are a signal to the whole team.
I ended up separating two ideas that the web frontend mixes together: I’ve seen this (only on my Mac) and I’m acknowledging this (in Zabbix, for everyone). Each server gets to decide which one the checkmark means, because a shared production server and my own lab deserve different habits.
Not becoming the noise I was escaping
The first version notified me about everything it found. Opening the laptop in the morning meant a pile of notifications for problems that had been there all night. That’s exactly the alert fatigue I was trying to get away from.
So the rules got stricter. Problems that already exist when the app starts are counted, not announced. Several new problems at once produce one sound, not a chorus. A problem I snooze comes back laterquietly. And each severity can have its own sound, or none: a disaster should sound like one, a warning can wait.
Every Zabbix is a little different
The servers I watch don’t all run the same version, and they never will. Some are recent, some are years old, some live on internal networks with certificates no browser trusts. The app had to treat them all the same way, so that I don’t have to think about which server is which. Most of the testing time went here, against real servers, not into the interface.
Earning trust
An app that holds the keys to your monitoring has to be boringly trustworthy. Credentials stay in the macOS Keychain. The app talks only to your Zabbix servers: hostnames, problems and server addresses never leave your Mac. The anonymous usage statistics can be turned off with one switch, and theprivacy policy lists exactly what they contain. The app is sandboxed, reviewed by Apple and distributed through the Mac App Store, so installing it doesn’t feel like a risk.
The other 80%
Building the app for myself took a few evenings. Making it something other people can install took much longer: documentation, getting through App Store review, a website, a privacy policy, a release process I can run without thinking. None of it is visible in a screenshot, and all of it is the difference between a side project and something you can recommend to a colleague.
Building it with an AI pair
I built Zabbix Toolbar with an AI coding assistant (Claude Code) next to me the whole time, and I want to be honest about how that went.
It made the work go much faster: the interface, the tests, the release script, this website and its docs. It even wrote a small check that makes sure every button name mentioned in the docs actually exists in the app.
What it didn’t do is decide. What counts as “needs me”, how quiet the app should be, what stays on the Mac: those were my calls, and they’re what make the app useful. It also made mistakes, sometimes confidently, including running a command one folder too high and touching files outside the project. Working in small steps, with a written plan, tests before code and a separate review at the end, is what kept those mistakes small and easy to catch.
My takeaway: an AI pair is a multiplier on judgment, not a substitute for it. The product decisions are still yours, and so is checking the work.
Where it is now
Zabbix Toolbar runs on macOS 14 Sonoma or later and works with Zabbix 6.0 through 7.x. It’s the first thing I look at when I sit down, and the Zabbix tabs are finally closed.
If you watch more than one Zabbix, or one Zabbix with too many host groups, give it a try and tell me what’s missing. Ideas and bug reports are welcome on GitHub.