TodayStrip shows a single item at a time and rotates between them by relevance — a meeting two minutes out takes the strip and holds it, a running timer does the same, the weather waits its turn. No account, no analytics, no background service.
The strip
- One item at a time, rotating by priority, with a cross-fade between them
- A meeting about to start or a running timer pins the strip until it resolves
- Something that becomes urgent cuts in instead of waiting its turn
- Scroll over the strip to step through manually; rotation pauses while the panel is open
Next event
- Leads with your free time when the next meeting is far off — "Free until 14:00" — and switches to a countdown inside the last hour
- Detects Zoom, Meet, Teams, Webex, Whereby, Jitsi, Slack and Discord links in the invitation
- When the call is minutes away, clicking the strip joins it directly
- All-day, cancelled and declined events are skipped; calendars are individually selectable
Timer
- Countdown with presets, or a stopwatch, with a notification and sound when time is up
- Owns the strip while it runs
Weather
- Reports what changes: rain starting within the hour, frost tonight — and falls back to plain conditions when nothing is happening
- Current location (coarse) or a place you pick, in Celsius or Fahrenheit
Focus, battery, today's note
- The active Focus, read from the files Control Center writes — see the caveat
- Battery percentage and remaining time, loud only when it is actually low
- One line per day, with the previous week a click away
Every module can be switched off, and a module with nothing to report drops out of the rotation on its own.
Download the latest TodayStrip.dmg from Releases
and drag TodayStrip to your Applications folder.
Releases are signed and notarized by Apple, so they open without Gatekeeper warnings.
On first launch, TodayStrip asks for calendar access. Weather asks for location only if you leave it on "current location" — pick a city in Settings instead and it never asks.
macOS exposes no public API for the active Focus. TodayStrip reads the same JSON files Control
Center writes under ~/Library/DoNotDisturb/, which means two things:
- The app cannot be sandboxed, so it will never ship on the Mac App Store.
- It may break. If Apple moves or reshapes those files, the module reports nothing and disappears from the strip. Nothing else is affected.
Turn the module off in Settings if you would rather not rely on it.
Two global shortcuts, registered through Carbon so they need neither Accessibility nor Input Monitoring permission:
| Shortcut | Action |
|---|---|
| ⌥⌘T | Open the panel |
| ⌥⌘R | Start or pause the timer |
And a URL scheme, so Shortcuts, Raycast, Alfred or a shell script can drive it:
open "todaystrip://timer/25"
open "todaystrip://stopwatch"
open "todaystrip://timer/stop"
open "todaystrip://note?text=Ship%20the%20release"
open "todaystrip://open"Open TodayStrip.xcodeproj in Xcode and run the TodayStrip scheme.
xcodebuild -project TodayStrip.xcodeproj -scheme TodayStrip -configuration Debug build
xcodebuild -project TodayStrip.xcodeproj -scheme TodayStrip -destination 'platform=macOS' testNo API keys, no accounts, no entitlements to provision — clone and run. Weather comes from Open-Meteo, which needs none.
StatusItemController ← the NSStatusItem, cross-fades between items
↑
StripRotator ← priority + rotation, pure logic, no AppKit
↑
AppModel ← the only object that knows all six sources exist
↑
StripSource × 6 ← Calendar, Timer, Focus, Battery, Weather, Note
Sources know nothing about rotation, the menu bar, or each other. Each observes one thing and
publishes a StripItem when its answer changes.
Two conventions make the interesting parts testable without a clock or a network:
- Wording and priority live in pure static functions —
WeatherHeadline.of,CalendarHeadline.of,CalendarSource.item(for:now:),AppModel.clickAction— that takenowas a parameter. StripRotatortakes all its time throughtick(_:).
AppKit rather than SwiftUI's MenuBarExtra for the status item: the rotation needs to cross-fade,
which MenuBarExtra's label does not expose. The panel and settings are SwiftUI.
xcrun notarytool store-credentials todaystrip-notary \
--key AuthKey_XXXX.p8 --key-id <KEY_ID> --issuer <ISSUER_ID>
./scripts/build_release.shRuns the tests, archives, signs with Developer ID, notarizes and staples both the app and the
disk image, then verifies Gatekeeper acceptance. Credentials are checked before anything is built.
The result lands in build/TodayStrip-<version>.dmg.
Nothing leaves your Mac except a weather request to Open-Meteo, containing coordinates rounded to four decimal places and no identifier. Calendar data, notes and Focus state are read locally and never transmitted.
MIT — see LICENSE. Weather data by Open-Meteo.com (CC BY 4.0).
If TodayStrip made your day a little easier to read, consider giving it a ⭐.