Two minutes before
I was using a nifty little calendar app called MeetingBar that lives in the Mac menubar. Loved the simplicity of it. At a glance, upcoming meetings, right there in the bar.
My biggest problem was that I'd completely forget to join a meeting if it didn't take over the screen with an alert. MeetingBar does have that kind of alert, but only when the meeting has a join link. I needed it for every meeting, link or not.
So as is now becoming more and more common, I decided to build my own version with Claude Code's help.
Pure Swift and SwiftUI. EventKit for calendar access, which reads anything macOS Calendar already sees. UserNotifications for banner alerts. A plain NSWindow at screen-saver level for the full-screen overlay. A global Cmd+Shift+J shortcut. No Electron, no third-party UI frameworks. The whole thing is 2 MB.
I wrote three rules before I started: the overlay fires for every meeting, join URL or not. The menu bar always shows something. If an alert misses, log why inside the app. The third one was for me, every app I've built has eventually needed runtime introspection, and most lacked it.
The popover shows your next meeting and the ones after. Title, time, countdown, click to join. The full-screen alert is different: black background, big text, two buttons. Its job is to be impossible to miss when your laptop is on the kitchen counter at 9:58 and your 10 AM is starting.
Shipping it for others was a separate job. Apple's notarisation pipeline, Sparkle 2 for auto-update, a DMG with a custom background, a release script that archives, notarises, signs, and pushes the appcast in one command.
One bug didn't go smoothly. Builds 2 through 8 all shipped, looked correct, and couldn't request calendar access. The permission dialog never appeared. The app never showed up in Privacy & Security → Calendars. I eventually tailed log stream --process tccd and found two missing pieces stacked on top of each other: macOS 14 had split the calendar usage descriptions in Info.plist, and notarised apps need a matching privacy entitlement before TCC will even show the dialog. Either one missing and you get total silence: no error, no log, no prompt. Two builds after adding both, the dialog appeared, I clicked Allow, and Zyt loaded my meetings for the first time.
The app's name is Zyt. Wordplay on the German Zeit, meaning time. It also sounds like some Swiss German pronunciations of it. Other names I considered were taken. Zyt was free, three characters, and looked right next to the clock.
The DMG is on GitHub. Build 9 is the first one where calendar access actually works. github.com/thaungsunyein/zyt-releases
Real profile
I stepped back from social media in 2021. The account is real, just quiet. For now.