Goal
Replace the system-rendered notification path with an Omacase-owned notification experience: complete control of look, feel, and interaction, fully integrated with the theme system — themed colors and typography, per-theme notification sounds, actionable banners, and a replayable history — while keeping the current system backend as a fallback and a user choice.
Why the current system can't get there
omacase notify (lib/notify.sh) renders through macOS's notification center via terminal-notifier (osascript fallback). That ceiling is hard:
- Look/feel: banner appearance is Apple's — no theme colors, no fonts, no shape; the app icon is pinned to the sender. Omacase themes stop at the notification.
- Sounds: limited to
/System/Library/Sounds names; per-theme sound identity is impossible.
- Interaction: no custom actions, no hover behavior, no history/replay we control.
- Reliability: banners are suppressed by Focus and gated by per-app Notification permission; the osascript path is documented in our own source as "FLAKY on modern macOS".
Alternatives evaluated
- Stay on UNUserNotificationCenter (status quo) — zero customization headroom. Rejected as the primary path; retained as fallback.
- Hammerspoon (hs.canvas) — could draw anything, but imports a Lua runtime + large third-party app for one feature; against the trim-third-party direction (Ice/Zed/yabai precedent). Rejected.
- SketchyBar popups — SketchyBar was deliberately removed from the stack; re-adding it for notifications regresses that decision. Rejected.
- OmacaseNotify: a small native daemon we build — ✅ chosen. Precedent already in-repo: OmacaseLauncher.app is built at install time; Xcode CLT (hence
swiftc) is a boot.sh prerequisite, and the compile-at-install + ad-hoc codesign pattern is proven. Omarchy Quattro just validated the direction upstream by making its notification daemon a first-class shell plugin (replayable 10-notification history, DND, dedup) — this is the macOS analog.
Product shape (what the user gets)
- Banners rendered by Omacase: theme background/foreground/accent, Omacase typography, rounded panel matching OmniWM's aesthetic, stacked top-right, notch- and multi-display-aware, never steal focus.
- Theme integration: switching themes restyles notifications instantly (same generated-fragment pipeline as ghostty/btop/nvim), and each theme can define its own sound identity — logical events (
info/success/warn/error) mapped per theme, with themes able to ship sound files.
- Interaction: click-to-run action, hover pauses the timeout, close affordance; later: multiple action buttons,
omacase notify --history replay, a quiet toggle.
omacase notify stays the single API — every existing call site (theme switch, keybinds, scripts) upgrades for free; system backend remains as fallback and as a style=system opt-out. No Notification permission prompts at all on the Omacase path.
Implementation plan follows in a comment.
Goal
Replace the system-rendered notification path with an Omacase-owned notification experience: complete control of look, feel, and interaction, fully integrated with the theme system — themed colors and typography, per-theme notification sounds, actionable banners, and a replayable history — while keeping the current system backend as a fallback and a user choice.
Why the current system can't get there
omacase notify(lib/notify.sh) renders through macOS's notification center via terminal-notifier (osascript fallback). That ceiling is hard:/System/Library/Soundsnames; per-theme sound identity is impossible.Alternatives evaluated
swiftc) is a boot.sh prerequisite, and the compile-at-install + ad-hoc codesign pattern is proven. Omarchy Quattro just validated the direction upstream by making its notification daemon a first-class shell plugin (replayable 10-notification history, DND, dedup) — this is the macOS analog.Product shape (what the user gets)
info/success/warn/error) mapped per theme, with themes able to ship sound files.omacase notify --historyreplay, a quiet toggle.omacase notifystays the single API — every existing call site (theme switch, keybinds, scripts) upgrades for free; system backend remains as fallback and as astyle=systemopt-out. No Notification permission prompts at all on the Omacase path.Implementation plan follows in a comment.