A native macOS menu-bar app to plan your day, focus with a Pomodoro, and actually finish what you planned — with unfinished tasks carried into tomorrow under a gentle, escalating nudge instead of silently disappearing.
Lives in your menu bar — no Dock icon. Plan in the morning, work through the day, and run a quick end-of-day review before you sleep.
- Daily habits — recurring rituals (e.g. after morning coffee) on a schedule (every day, weekdays, weekends, or custom days); one-tap check-off, streak tracking with a gentle grace day, optional anchor reminders, and optional sync to Apple Reminders as recurring reminders.
- Daily todos — capture today's plan; check off, delay, reschedule, or drop. Quick-add for today or tomorrow with a segmented picker.
- Gentle carry-over — unfinished tasks roll to the next day and age (grey → amber pill + a quiet menu-bar count). Calm by default, never a wall of red.
- Pomodoro — customizable focus/break durations, cycles, auto-start; a live mm:ss countdown right in the menu bar; accurate across sleep/wake (wall-clock based). Optionally skip a break if you've stepped away long enough (assumes you already rested).
- Dayscape & focus streak — a quiet 7-day ink strip of completed Pomodoros in the panel, plus a focus streak with one gentle grace day per week (milestones at 7 / 30 / 100).
- Lofi Radio — built-in SomaFM ambient/lofi stations in the panel footer; tap ▶ to start (random station) or pick from a simple list; skip stations, now-playing label, offline channel cache; menu-bar waveform while playing; auto-pauses when a focus session ends.
- Task history — browse completed tasks grouped by day (last 30 days).
- Analytics (Swift Charts) — tasks and habits tabs; daily / weekly / monthly trends, habit consistency heatmap (28 days), streak leaderboard, focus minutes, and Pomodoro sessions.
- Notifications — morning planning + evening review reminders, a phase-end alert (shows even when the panel is closed), and a once-daily nudge when tasks pile up.
- End-of-day review — "Did you finish what you planned?" — triage what's left and jot a one-line reflection; optional mood tagging with analytics.
- On-device AI mood suggestions — when Apple Intelligence is available (macOS 26+), DayBar
uses Apple's Foundation Models
(
SystemLanguageModel) to suggest a mood tag from your reflection. Classification runs entirely on-device — no cloud LLM, no account, no data leaves the Mac. Falls back to a manual picker when the model is unavailable or you turn the feature off. - Quick-add hotkey — a global shortcut (default ⌥⌘D) opens the panel focused on the field.
- Apple Reminders sync — optional two-way sync with selected Reminder lists (complete, delay, and reschedule flow back to Reminders). Habits can sync as recurring reminders on their schedule.
- Backup & restore — export/import a local JSON snapshot of tasks (including notes & checklists), habits, and focus sessions from Settings.
- Calm controls — undo for drop/archive/stop, Away mode, quiet hours, optional weekly digest, and nudge intensity (Gentle / Standard).
- Local & private — stored on-device with SwiftData; no account, no cloud. Radio metadata and artwork are cached locally; streams come from SomaFM. AI mood uses on-device Foundation Models only when enabled.
Product page: underworld14.github.io/daybar.
Pre-built releases for macOS 14+ are on GitHub Releases.
- Download the latest
DayBar-vX.Y.Z-macOS.zipfrom Releases. - Double-click the zip to extract
DayBar.app. - Drag DayBar.app into Applications.
- Open DayBar from Applications. The icon appears in the menu bar (there is no Dock icon).
Release builds are ad-hoc signed. macOS may block the first open with "DayBar can't be opened because Apple cannot check it for malicious software." Use either method:
Option A — Right-click (easiest)
- In Finder, right-click (or Control-click)
DayBar.appin Applications. - Choose Open.
- Click Open in the dialog. You only need to do this once.
Option B — Terminal (xattr)
Removes the quarantine flag macOS adds to downloaded files:
xattr -cr /Applications/DayBar.app
open /Applications/DayBar.appNotifications & launch at login: For reliable permission prompts, build from source once in Xcode with your Apple ID team, or wait for a future Developer ID–signed release.
DayBar checks GitHub Releases daily via Sparkle. When a newer version is available, you'll see a standard Install & Relaunch prompt — nothing installs without your approval.
- Manual check: Settings → Check for Updates…
- Feed:
https://underworld14.github.io/daybar/appcast.xml
Ad-hoc signed builds still require the one-time Gatekeeper approval above on first install. Sparkle clears quarantine on downloaded updates where macOS allows it, but cannot fully bypass Gatekeeper for unsigned apps.
- macOS 14+ (developed on macOS 26 Tahoe)
- Xcode 26+
- XcodeGen:
brew install xcodegen - Optional — AI mood suggestions: macOS 26+ with Apple Intelligence enabled (uses the on-device Foundation Models framework). The rest of DayBar works without it.
The Xcode project is generated from project.yml (it isn't committed):
xcodegen generate
open DayBar.xcodeproj # Run the "DayBar" scheme
# or, from the CLI:
xcodebuild -project DayBar.xcodeproj -scheme DayBar -destination 'platform=macOS' buildDayBar is an accessory app — look for its icon in the menu bar, not the Dock.
For notifications and launch-at-login, run once from Xcode with automatic signing (a free Apple ID) so macOS grants permission — the default ad-hoc signing is unreliable for those.
xcodebuild -project DayBar.xcodeproj -scheme DayBar -destination 'platform=macOS' testThe landing page lives in site/ and deploys via .github/workflows/pages.yml
to the gh-pages branch on every push to main that touches site/**.
One-time repo setting: GitHub → Settings → Pages → Build and deployment → Source:
Deploy from a branch → branch gh-pages / / (root).
After deploy, verify:
Maintainers only. Releases are published to
GitHub Releases as DayBar-vX.Y.Z-macOS.zip.
The Release workflow signs update archives with an EdDSA key. Generate keys once (Sparkle 2.6.4):
curl -fsSL -o /tmp/Sparkle.tar.xz \
"https://github.com/sparkle-project/Sparkle/releases/download/2.6.4/Sparkle-2.6.4.tar.xz"
tar -xf /tmp/Sparkle.tar.xz -C /tmp
/tmp/bin/generate_keys # stores private key in Keychain; prints SUPublicEDKey for Info.plist
/tmp/bin/generate_keys -x sparkle-private-key.txt # add file contents to GitHub secret SPARKLE_EDDSA_PRIVATE_KEYThe public key in DayBar/Info.plist must match the private key in the secret.
After each tagged release, CI updates site/appcast.xml and deploys it to GitHub Pages.
You need the GitHub CLI (brew install gh) logged in (gh auth login).
Edit project.yml:
MARKETING_VERSION: "0.3.0" # user-facing semver → tag v0.3.0
CURRENT_PROJECT_VERSION: "2" # optional build number bumpCommit and push to main:
git add project.yml
git commit -m "chore: bump version to 0.3.0"
git push origin mainPush a version tag. The Release workflow builds a Release
.app, zips it, and attaches it to the GitHub Release:
git tag v0.3.0
git push origin v0.3.0Watch progress: Actions tab on GitHub, or locally:
gh run list --workflow=Release
gh run watch # optional: follow the latest runWhen it finishes, the release appears at https://github.com/underworld14/daybar/releases/tag/v0.3.0.
To edit release notes after CI creates the draft assets:
gh release edit v0.3.0 --notes "What's new in 0.3.0 …"Useful if Actions is down or you want to ship from your Mac directly:
xcodegen generate
xcodebuild -project DayBar.xcodeproj -scheme DayBar \
-configuration Release \
-destination 'platform=macOS' \
-derivedDataPath build/DerivedData \
build
cd build/DerivedData/Build/Products/Release
ditto -c -k --sequesterRsrc --keepParent DayBar.app DayBar-v0.3.0-macOS.zip
gh release create v0.3.0 DayBar-v0.3.0-macOS.zip \
--title "DayBar 0.3.0" \
--notes "What's new in 0.3.0 …"gh release create creates the tag on GitHub if it doesn't exist yet (no need for a separate
git tag + push unless you want the tag locally too).
- Tests pass (
xcodebuild … test) -
MARKETING_VERSIONinproject.ymlmatches the tag (v0.3.0→0.3.0) - Release notes mention breaking changes / Gatekeeper (
xattr) if needed - Download the zip from Releases and smoke-test on a clean Mac (install → menu bar icon → play radio)
| Target | What |
|---|---|
DayBarCore |
Models (@Model), DataStore (SwiftData), RolloverEngine, EscalationModel, PomodoroEngine, SomaFMService / RadioPlayerManager, Analytics, NotificationScheduler, on-device mood AI (FoundationModels / MoodClassifier), AppState. UI-free, unit-tested. |
DayBar |
SwiftUI + AppKit menu-bar UI: NSStatusItem + borderless NSPanel hosting TodayView, plus Settings / Analytics / Review / History sheets and the inline LofiRadioStrip. |
DayBarTests |
XCTest. |
A single @Observable @MainActor AppState is the source of truth (read via @Environment).
Carry-over age is computed from each task's immutable original planned date; new-day rollover
is idempotent and survives the Mac sleeping; the Pomodoro's truth is a wall-clock endDate.
- P3b — Apple Calendar read-mostly integration behind the same adapter protocol.
See CONTRIBUTING.md. Issues and PRs welcome.
MIT © 2026 Yusril Izza