Skip to content

[Improvement] OmacaseNotify — themed, fully-owned notification system #28

Description

@splaice

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

  1. Stay on UNUserNotificationCenter (status quo) — zero customization headroom. Rejected as the primary path; retained as fallback.
  2. 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.
  3. SketchyBar popups — SketchyBar was deliberately removed from the stack; re-adding it for notifications regresses that decision. Rejected.
  4. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    improvementSystemic improvement for a future release — not a defect

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions