1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
# notifications
The balloon renderer for the notification daemon (`notifyd`, a separate repo).
It reads the daemon's published files through the `Notify` singleton and draws
one balloon per live notification, bottom-right of `DP-1`.
## Suppression lives here
The daemon does not know about DND, snooze or mute. This component withholds
balloons: `status.dnd` suppresses low and normal (and critical too when
`dndPassCritical` is off), a muted app is always withheld, and
`notifyd/snooze` suppresses everything. The drawer's reserved space lists
every live notification anyway.
Placement, mute and the DND rule come from `~/.config/notifyd/config.json`,
edited from the settings window (Desktop → Notifications).
## Sounds
Played with `pw-play`, once per new or replaced notification, and only when
its balloon would show: the drawer, snooze, mute and DND that withhold the
balloon silence it too. Precedence: `silent` (the app's suppress-sound), then
the app's own `sound`, then `sounds[urgency]` from the config. A restart
records the queue without playing it. There is one player, so a new sound cuts
the last.
The status registry's quiet mode (`status.quiet`) silences every sound and
leaves the balloons, as it does for the Claude and opencode hooks.
## The files are the interface
$XDG_RUNTIME_DIR/notifyd/queue.json the live queue
$XDG_RUNTIME_DIR/notifyd/history.json the ring of 20
$XDG_RUNTIME_DIR/notifyd/drawer "1" while the drawer holds the space
$XDG_RUNTIME_DIR/notifyd/snooze an epoch second while snoozing
~/.config/notifyd/config.json settings, shared with the daemon
`notifyctl` and `notify-snooze.sh` are in `~/bin`; without them the balloons
draw but close and actions do nothing.
## Blur
Hyprland blurs a layer surface only when a rule names its namespace. This
component sets `keystone-notifications`; the rule is in
`~/.config/hypr/sections/decorations.lua`.
## History rows
The spec calls history rows closable individually. `notifyctl` has no per-id
history delete, only `clear-history`, so the history page ships a clear all
and inert rows. The daemon verb and the renderer row it needs are tracked in
the `notifyd` repo's `TODO.md`; when that ships, the row's X is wired to
`notifyctl history-remove`.
|