Skip to content

Add daemon-level Do Not Disturb / Focus mode #4

Description

@0xferrous

wispd should support a daemon-level Do Not Disturb / Focus mode that suppresses popup notifications without dropping notification delivery/state.

Why

This fits the current direction of the project:

Desired behavior

When DND/focus mode is enabled, wispd should:

  • suppress normal popup notifications
  • still accept notifications over org.freedesktop.Notifications
  • still retain them in history
  • still make them available to the future notification center
  • preserve replaces_id behavior for updated notifications

Bypass policy should be defined, for example:

  • allow critical urgency through
  • optionally allow configured exceptions based on notification metadata such as app_name, desktop-entry, and category

When DND is disabled, suppressed notifications should not be replayed as a burst of old popups by default; they should remain available via history/center.

Possible config shape

[dnd]
enabled = true
allow_critical = true

[[dnd.allow]]
desktop_entry = "org.signal.Signal"

[[dnd.allow]]
app_name = "Calendar"

[[dnd.allow]]
category = "alarm"

Config naming is flexible, but the idea is:

  • app_name matches the Notify call field
  • desktop_entry maps to the desktop-entry notification hint
  • category maps to the category notification hint

Control surface

This should support runtime:

  • enable
  • disable
  • toggle
  • status query

This likely belongs in the control path planned in #3, e.g. wispctl dnd on|off|toggle|status.

State model

DND should be a presentation policy, not a delivery failure:

  • notifications are still received
  • popup suppression is separate from dismissal/removal
  • history/center state remains intact

Acceptance criteria

  • users can enable/disable DND/focus mode
  • normal notifications are suppressed from the live popup stack while active
  • suppressed notifications are still received and retained
  • replaces_id continues to work correctly during DND
  • bypass behavior is clearly defined
  • runtime control/query is available, ideally via the future control CLI/API

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions