A macOS menu bar app that makes meetings impossible to miss. Tardy watches the calendars in the Mac Calendar app and escalates as a meeting gets closer, from a quiet dot to a flashing LATE counter, with one-click join for Zoom, Teams, Google Meet and more.
- Overview
- Quick Install
- Features
- Supported Meeting Providers
- Usage
- Documentation
- Contributing
- License
Calendar alerts on macOS, iOS and Apple Watch all look and sound the same, and they are easy to swipe away. A meeting 15 minutes out gets the same treatment as one starting in 30 seconds.
Tardy escalates instead. The menu bar shows today's date and a dot for your next meeting, adds the time as it approaches, sounds an alert at 10, 5 and 2 minutes with one more sound each time (you pick the times and counts), runs a live countdown, and flashes a LATE counter once the meeting has started until you join or dismiss it.
Important
Tardy works with the native Mac Calendar app. It reads events through macOS's calendar store, so every calendar you want watched (iCloud, Google, Exchange/Microsoft 365, CalDAV, subscriptions) must be added to Calendar.app first: Calendar > Settings > Accounts. Calendars that only live in a web app or another calendar client are invisible to Tardy.
Everything runs locally. Tardy makes no network calls except checking
tardy.vpetkov.net for app updates.
curl -fLO https://tardy.vpetkov.net/Tardy.dmg
open Tardy.dmg
# Drag Tardy to Applications, then launch it and allow Calendar accessRequires macOS 14 (Sonoma) or later. The app is signed and notarized by Apple
(spctl -a -vv -t install Tardy.dmg should name team 8J9W3ZG4ZN), and
every version is also on the Releases page.
To build from source, see docs/DEVELOPING.md.
- Escalating alerts: up to 5 sound alerts with notifications (default 10, 5 and 2 minutes, playing 1, 2 and 3 sounds), a live countdown from 5 minutes, and a flashing LATE counter that auto-clears after 5 minutes
- Live date icon: today's weekday and date, plus a red (personal) or blue (work) dot for your next meeting
- One-click join: a large Join button when a meeting with a link is close, or click any meeting in the list
- Meeting list: Now / Starts in … / Later today, with each meeting's time and provider
- Work and Personal calendars: mark each calendar Work or Personal; the dot colors follow
- Settings window with import and export, so a setup moves between Macs in one file
- Menu bar clock: optional, with seconds, AM/PM, 24-hour time, day and date; the dropdown always shows a live clock
- Always running: "Run as a service" (on by default) starts Tardy at login and reopens it within seconds if it quits or crashes
- Keyboard shortcut: ⇧⌘M opens and closes the menu from anywhere; change it in Settings > Shortcuts
- Light on battery: wakes only when something on screen needs to change, and refreshes when your calendars change instead of polling
- Automatic updates through Sparkle
Tardy finds an https meeting link in an event's location, URL or notes (in that order) and recognizes these providers. Only those hosts get a Join button, and invites you've declined or that were canceled are left out entirely:
| Provider | Example link |
|---|---|
| Zoom (including ZoomGov) | https://company.zoom.us/j/123456789 |
| Microsoft Teams (work and personal) | https://teams.microsoft.com/l/meetup-join/… |
| Google Meet | https://meet.google.com/abc-defg-hij |
| Webex | https://company.webex.com/meet/name |
| GoTo Meeting | https://meet.goto.com/123456789 |
| Amazon Chime | https://chime.aws/1234567890 |
| Slack Huddles | https://app.slack.com/huddle/… |
| Whereby | https://whereby.com/room |
| Jitsi Meet | https://meet.jit.si/room |
| Discord | https://discord.gg/invite |
| RingCentral Video | https://v.ringcentral.com/join/… |
| Zoho Meeting | https://meeting.zoho.com/… |
Only https:// links are ever opened. A meeting without a recognized link still
gets every alert; clicking it opens Calendar.
| Menu bar | When |
|---|---|
[WED 16] ● |
Next meeting more than 30 min away |
[WED 16] ● 2:30-3:00pm |
Within 30 min |
[WED 16] 12m - Standup |
15 min |
🔴 4:59 - Standup (until 3:00pm) |
5 min, live countdown |
⚠ LATE 1:23 (flashing) |
Started |
Sound alerts run on their own schedule, set in Settings > Alerts:
| Default alert | Sounds | Notification |
|---|---|---|
| 10 min before | 1 Sonar | "Meeting in 10 minutes" |
| 5 min before | 2 Sonar | "Meeting in 5 minutes" |
| 2 min before | 3 Sonar | "Meeting in 2 minutes" |
With Progressive sounds on, each alert plays one more sound than the one before; turn it off to choose each count. Add up to 5 alerts, 1 to 60 minutes before.
- Click the icon for today's meetings, Join and Dismiss, Mute Sounds and Settings… (⌘,). With Run as a service on, Quit Tardy reopens it a few seconds later; turn the service off in Settings > General to quit for good.
- Settings has panes for General (launch at login, run as a service), Alerts (mute, sound schedule), Calendars (watch each one, Personal or Work), Clock, Shortcuts, Updates, and Import & Export.
- ⇧⌘M (configurable) toggles the menu. Leave it open to watch the live clock.
Settings can be exported to a file and imported on another Mac; see docs/CONFIGURATION.md.
- docs/CONFIGURATION.md: every setting and its
defaultskey - docs/DEVELOPING.md: building, signing, notarizing, releasing and updates
- docs/ARCHITECTURE.md: how alerts, scheduling and the menu work, and the macOS pitfalls behind them
Issues and pull requests are welcome. See CONTRIBUTING.md.
MIT © Ventz Petkov