Skip to main content

Notifications & Sound

In-app toasts, the notification center inbox, Do Not Disturb and Quiet Hours, OS alerts, review-inbox routing, and the event sound system for tracking attention across concurrent agents.

Updated
Reviewed

Overview

With several agents running at once, the hard part is knowing what needs you. Daintree's notification system has three delivery layers: in-app toasts for immediate visual feedback, a notification center for scrollable history, and OS-native alerts that reach you when Daintree is in the background. A separate sound system plays audio cues for agent events, git operations, and worktree actions.

On top of those layers sit the attention controls. Do Not Disturb pauses delivery for a session, Quiet Hours does the same on a schedule, and per-source muting and silencing turn down specific projects or event types. Each has its own section below.

Most notification features are off by default. The system ships with a minimal soundscape, so you turn on the events you care about rather than starting from a full set.

In-App Toasts

Toasts appear in the top-right corner of the app window, just below the toolbar. Each one is glass-styled with a colored left border for its type: success (green), error (red), info (blue), or warning (amber).

Auto-dismiss timing depends on type. Error and warning toasts stay up for 12 seconds, info for 8, and success for 5. A toast carrying an action button is sticky and waits until you act on it or dismiss it by hand. No toast lingers past a 15-second hard cap. Hovering pauses the dismiss timer, which gives you time to read longer messages or reach for an action. Error toasts use assertive screen reader announcements; the other types use polite ones.

When several events for the same source arrive within a 2-second window, they coalesce into one toast with a ×N count chip (capped at 99+) instead of stacking up separately. Screen readers announce it as "N events." Only a few toasts show at once. When more arrive than fit, the overflow surfaces as a +N more pill that opens the notification center, and every evicted toast is waiting for you there.

The update-available toast deduplicates itself. Once you dismiss it, Daintree won't surface the same version again for 24 hours, and repeat events for that version within a single session are suppressed. A newer version always breaks through the cooldown, and running Check for Updates by hand always shows the result. The update-ready toast that appears once a download completes is a separate toast and isn't affected.

Silencing from a toast

When a toast comes from a specific project or event type, a kebab menu (the ··· overflow button) appears on hover. It has two actions. Silence {event kind} from this project turns off that one event type for that project. Mute project notifications silences the project's completion and waiting alerts together. The same menu sits on each entry in the notification center. See Muting & Silencing for what each action changes and where the muted state shows up.

Notification Center

Click the bell icon in the toolbar to open the notification center. It's the inbox for everything that has fired, listed newest first, and it keeps recording even while delivery is paused. The history buffer holds up to 200 entries; when it fills, the oldest entry is pruned to make room.

Tabs and views

Three filter tabs sit at the top once there's anything to show: All (everything except archived), Unread, and Archived. The tabs appear only when the inbox isn't empty.

Header controls

  • Group by context (the Layers icon) splits the list by project and worktree. Each context section gets its own header and a Mark read button for that group alone.
  • Mark all read (the double-check icon) shows up only when you have unread entries. It fires a 5-second toast with an Undo in case you cleared the badge too soon.
  • Pause notifications (the Moon icon) opens the Do Not Disturb menu, covered below.
  • The ··· overflow menu holds Clear all, which removes every entry and closes the panel. It moved here in the redesign and is no longer a standalone button in the header.

The toolbar bell

The bell carries the inbox state at a glance. An unread dot sits in the top-right corner whenever you have unread entries. The icon swaps from a bell to a struck-through bell while Do Not Disturb or Quiet Hours is active. When something new lands in the inbox and delivery isn't paused, the bell gives a quick blip; repeated blips are throttled so a burst of events doesn't turn into a flicker. Right-clicking the bell offers Unpin from Toolbar, and the whole control disappears when the master toggle is off.

Needs attention

Unread groups whose worst entry is an error or warning are pinned to a Needs attention section at the top, sorted by severity and then recency, up to five at a time. There's no manual pinning. The section stays put as you switch between All and Unread, and it's hidden on the Archived tab.

New since you last looked

When you reopen the inbox, a New since you last looked divider sits above the first entry that arrived after you last closed it, with an inline Mark these N read button. If the divider scrolls out of view, a floating Jump to new pill brings you back to it. The divider is hidden on the Archived tab.

Threads

Related notifications from the same run share a thread and collapse into one expandable entry with a count chip. When a thread's worst-severity icon disagrees with its most recent entry (say, an error thread whose latest event is a successful recovery), the preview is prefixed with Latest: so the icon and the message read as deliberate rather than mismatched.

Per-entry actions and timestamps

Unread entries show a small colored dot at the left edge and a bolded title. Each entry has its own kebab menu (when it carries a project or event type) with the same Silence {event kind} and Mute project notifications actions as the toast menu.

Timestamps stay relative while they're recent and grow more specific with age: just now under a minute, Nm ago and Nh ago through the rest of the day, Yesterday HH:MM, then Mon D earlier this year and Mon D, YYYY for prior years. The full date and time is always on the entry's tooltip.

The empty state matches the view you're in: No archived notifications on Archived, You're all caught up on Unread, Notifications paused with a resume time while Do Not Disturb or Quiet Hours is active, and No notifications yet with a link into notification settings on a fresh install.

Tip
When the master toggle is off, the bell icon is hidden and toasts are suppressed. History still records events in the background, so turning the toggle back on shows any events that fired while it was off.

Notification Center Keyboard Navigation

The notification center is fully keyboard-driven while it has focus. Navigation is suppressed while an entry's kebab menu is open, so the keys don't fight the menu.

KeyAction
j / Move to the next notification
k / Move to the previous notification
HomeJump to the first notification
EndJump to the last notification
EnterTrigger the entry's primary action
eArchive the focused entry (in the Archived tab, e deletes it permanently)

Do Not Disturb

Do Not Disturb pauses delivery for the current session. Open the notification center and click Pause notifications (the Moon icon) in the header. The menu has two fixed durations, a custom path, and a direct link into settings:

  • For 1 hour
  • Until {next morning}, labeled with the actual time (it defaults to the next 8:00 AM)
  • Custom…, which opens notification settings rather than setting a timer directly
  • A Notification settings… link below the separator

While DND is active, the toolbar bell switches to the struck-through icon and the inbox shows a Muted until {time} pill with a Resume button to end the pause early. The session mute isn't persisted, so quitting and reopening Daintree clears it.

Note
DND pauses delivery, nothing else. Toasts, OS alerts, and sounds are suppressed, but the notification center keeps recording everything, and items flagged urgent (like the mark-all-read Undo) still break through.

Quiet Hours

Quiet Hours is the scheduled version of Do Not Disturb. Configure it under Settings > Notifications: turn on quietHoursEnabled, set a start and end time, and pick the weekdays it applies to. The default window runs 22:00 to 08:00 every day; an empty weekday selection means every day. The window can cross midnight with no special handling.

During Quiet Hours, the toolbar bell shows the struck-through icon and the inbox shows a Quiet hours pill. Like DND, it suppresses toasts, OS alerts, and sounds while the inbox records as normal.

Note
Quiet Hours suppresses delivery on the same terms as Do Not Disturb. The inbox still records everything, and urgent items still break through.

OS Notifications

OS-native alerts go through Electron's notification API. They appear as system notification popups and reach you when Daintree is minimized or behind other windows. Clicking one brings Daintree to the foreground and jumps straight to the relevant agent or terminal.

Note
OS notification popups fire only for watched terminals. A terminal is "watched" when its Watch toggle is on in the panel header. An agent running without this toggle generates no OS alerts, even when the relevant notification type is on. The completion popup is also suppressed while you're viewing the worktree that finished.

Dock badges and window title indicators are separate from OS notification popups. These indicators are always on and show the count of waiting agents across all terminals, regardless of watch state:

The dock icon shows a badge count with the number of agents currently waiting for input. The badge clears when you bring the Daintree window into focus. Standard macOS notification popups appear in the top-right corner of the screen.

Agent Notification Events

Five distinct agent events can trigger notifications. Each one is configured separately in Settings > Notifications.

Completion

Fires when a watched agent finishes its task. This event is off by default (completedEnabled: false), since completion is less urgent than an agent needing your input.

Completion uses a 2-second debounce window. If several agents finish within that window, they coalesce into one OS notification ("N agents finished their tasks") and one sound event. This keeps several agents wrapping up at once from turning into a notification storm.

Waiting

Fires when a watched agent pauses and needs your input. This is on by default (waitingEnabled: true), since a waiting agent usually means something needs you.

Waiting notifications fire immediately, with no debounce, and a 200ms burst window catches simultaneous events. Two grace periods prevent false alerts:

  • Spawn grace period (5 seconds) suppresses sounds from agents that start directly in a waiting state
  • Boot grace period (8 seconds) suppresses sounds when the app first launches, so agents that were already waiting don't replay their alerts

Waiting Escalation

Re-notifies you when a docked agent has been waiting longer than a configurable delay. It's there for agents running in the background dock that you aren't actively watching.

Escalation is off by default (waitingEscalationEnabled: false). When on, the delay can be set to 1, 3 (default), 5, or 10 minutes. If several docked agents are still waiting when the escalation fires, they're grouped into one notification.

Note
Escalation applies only to docked agents, not agents visible in the panel grid. It fires even when the Daintree window is in focus, since the point is to catch background agents you've lost track of.

Working Pulse

A periodic audio cue that plays while a watched agent (or a docked agent with escalation enabled) is actively working. It gives you an ambient sense of progress without checking the UI.

Working pulse is off by default (workingPulseEnabled: false). When on, it waits 10 seconds before the first pulse, then plays at random 8 to 10-second intervals. The pulse uses a separate audio channel that bypasses sound dampening. It stops when the agent leaves its working state or when you focus the terminal.

Each pulse plays at a slightly randomized pitch (±15 cents) to slow auditory habituation. That's enough to exceed the roughly 5 to 10 cent just-noticeable difference, so consecutive pulses sound subtly different and stay audible through long sessions without losing their recognizable character.

All-Clear

A sound that plays when every concurrently active agent has finished. It's automatic, with no setting to toggle. It fires only when two or more agents were running at the same time, so a single agent completing plays its standard completion sound instead.

All-clear uses a 500ms debounce to confirm every agent has truly finished, since a new one might start in that window. The sound always plays at full volume, regardless of the current dampening state.

Review-Inbox Routing

When an agent finishes and has touched more files than the session started with, Daintree drops a quiet entry into the notification center: Agent finished with changes, with an Open review hub action that jumps straight to the diff. It's a low-priority, inbox-only nudge with no toast and no OS alert, and it fires only when the working tree actually changed. Repeated finishes on the same worktree are deduped within a 5-second window.

This entry doesn't replace the standard completion notification. The OS alert and completion sound run on their own path, gated on completedEnabled and a watched terminal, so a single completion can produce both: the OS notification telling you the agent is done, and the inbox entry pointing you at what changed. For the full review workflow, see the Review Hub.

Note
The review-inbox entry fires independently of the completion OS notification, and only when the agent left changes behind. An agent that finished without modifying any tracked files won't add one.

Idle Terminal Notifications

Daintree checks background projects every 5 minutes and raises a toast when every terminal in a project has been idle past the configured threshold. It sits alongside auto-hibernation as the softer option: a forgotten project gets flagged rather than closed automatically, and you decide what to do with it.

"Idle" here means no terminal input and no terminal output for longer than the threshold. An active agent keeps a project alive, so a terminal with an agent in the working, running, waiting, or directing state isn't counted as idle even when it's otherwise silent.

A project fires a notification only when all of these hold:

  • It's not the currently focused project
  • At least one of its terminals has a running PTY
  • No terminal has an active agent
  • Every terminal has been idle past the threshold
  • The project isn't within its dismiss cooldown window

There's a 2-minute quiet window after app launch, so reopening Daintree doesn't immediately fire a notification for a project you just closed. After that window, the check runs on a 5-minute cycle.

The toast is persistent, with no auto-dismiss, and uses the info style. A single-project toast reads Idle terminals in '{project}' with a subtitle like 3 terminals inactive for 65m. When several projects qualify in the same cycle, they coalesce into one N projects have idle terminals toast instead.

The toast offers up to three actions, depending on context:

  • Close Them (single-project toasts only) runs the project through the same hibernation path Daintree uses for manual hibernation. Every terminal in the project is closed and any running processes are terminated. See Session Management for what hibernation clears and what it keeps.
  • View (multi-project toasts only) opens the notification center so you can see which projects are flagged before acting on them.
  • Dismiss snoozes the project for max(threshold, 60 minutes). With the default 60-minute threshold that's a 60-minute snooze; raising the threshold to 4 hours stretches the snooze to 4 hours too.
Note
Agents in the waiting or directing state count as active. A project with a paused Claude Code session waiting for your input won't be flagged as idle, even after sitting for an hour.

Idle terminal notifications are on by default with a 60-minute threshold. Configure them under Settings > General > Hibernation, not under Settings > Notifications. Threshold presets are 30m, 1h, 2h, and 4h, and the valid range is 15 minutes to 24 hours.

Sound System

Daintree ships 14 built-in sounds that play in response to agent events and UI actions. Sounds route through the Web Audio API when a window is available, and fall back to OS-level audio playback when no renderer is active.

Available Sounds

SoundUsed for
chimeGeneral notification chime
completeAgent completed its task
waitingAgent waiting for input
errorError events
pingWaiting escalation (default)
pulseWorking pulse
all-clearAll agents finished
git-commitGit commit executed
git-pushGit push succeeded
git-push-errorGit push failed
worktree-createWorktree created
worktree-deleteWorktree deleted
agent-spawnedNew agent process started
context-injectedContext injection completed

Some sounds ship with multiple variants (.v1, .v2, and so on), picked in round-robin order with no immediate repeats. The git and worktree sounds, for example, have three-variant sets.

Sound Dampening

When several events fire in quick succession, the sound system applies exponential volume decay so the result doesn't overload. Each consecutive sound plays at 70% of the previous volume, down to a floor of 10%. Dampening resets after 2 seconds of silence.

At most 3 audio voices play at once. When the pool is full, lower-priority sounds are dropped. The priority order, highest to lowest, is: error, waiting, chime/complete, ping, pulse.

Chord detection handles the specific case of several agents completing within 2 seconds. Rather than play overlapping completion sounds at decaying volumes, the system plays one unified chord sound at full volume.

The Preview button in notification settings always plays sounds at full volume, bypassing dampening.

UI Feedback Sounds

A separate category of sounds for non-agent events. They have their own toggle (uiFeedbackSoundEnabled, off by default) and cover git operations, worktree lifecycle, agent spawning, and context injection.

UI feedback sounds are independent of agent notification sounds. You can run agent sounds on and UI sounds off, or the other way around.

Muting & Silencing

Where Do Not Disturb and Quiet Hours pause everything for a while, muting and silencing are narrow and persistent. Both actions sit on a toast's kebab menu and on an entry's kebab in the notification center:

  • Silence {event kind} from this project turns off one event type for one project and leaves its other notifications alone.
  • Mute project notifications silences the project's completion and waiting alerts together. It sets both completedEnabled and waitingEnabled to off for that project.

Once a project's completion and waiting alerts are both off, a struck-through bell appears next to that project in the sidebar worktree header and in the project switcher, so a muted project is obvious without opening its settings. These choices live in the project's settings, so they survive a restart and stay in effect after a DND or Quiet Hours window ends. They're the quick-action equivalent of toggling the same fields in Per-Project Overrides.

Note
Project muting and Do Not Disturb are independent. Muting a project is persisted config that keeps that project quiet regardless of DND; DND is a temporary, global pause. Ending DND won't un-mute a project, and muting a project won't pause anything else.

Settings Reference

Most global notification and sound settings live in Settings > Notifications. The two idleTerminalNotify rows are the exception; they sit under Settings > General > Hibernation. Per-project overrides are configured separately in Project Settings (see below).

SettingDefaultScopeDescription
enabledOnGlobal onlyMaster toggle. Hides the bell icon and suppresses all toasts and OS alerts when off. History still records.
completedEnabledOffPer-projectOS notification when a watched agent finishes
waitingEnabledOnPer-projectOS notification when a watched agent needs input
waitingEscalationEnabledOffPer-projectRe-notify when a docked agent is still waiting
waitingEscalationDelayMs3 minPer-projectDelay before escalation fires (1, 3, 5, or 10 minutes)
workingPulseEnabledOffGlobal onlyPeriodic audio cue while a watched/docked agent is working
quietHoursEnabledOffGlobal onlyEnable scheduled Quiet Hours
quietHoursStartMin1320 (22:00)Global onlyQuiet Hours start, in minutes past midnight
quietHoursEndMin480 (08:00)Global onlyQuiet Hours end, in minutes past midnight
quietHoursWeekdays[] (all days)Global onlyDays the schedule applies (empty means every day)
groupByContextOffGlobal onlyGroup the notification center by project and worktree
soundEnabledOnPer-projectMaster sound toggle for all notification events
completedSoundFilecomplete.wavPer-projectSound for agent completion
waitingSoundFilewaiting.wavPer-projectSound for agent waiting
escalationSoundFileping.wavPer-projectSound for waiting escalation
workingPulseSoundFilepulse.wavGlobal onlySound for working pulse
uiFeedbackSoundEnabledOffGlobal onlyUI feedback sounds for git, worktree, and agent lifecycle events
idleTerminalNotify.enabledOnGlobal onlyNotify when every terminal in a background project is idle past the threshold
idleTerminalNotify.thresholdMinutes60 minGlobal onlyInactivity threshold in minutes. Presets: 30m, 1h, 2h, 4h. Range: 15 to 1440 minutes.

Sound file fields accept any of the built-in sound names. Preview each option in the settings panel before you commit to one.

Per-Project Overrides

Projects can carry different notification preferences. Open Project Settings (from the project context menu or settings icon) and switch to the Notifications tab to configure overrides. The Mute project notifications action covered in Muting & Silencing is the one-click shortcut for turning the completed and waiting toggles here off together.

Each setting in the Notifications tab has a checkbox header. When the checkbox is unchecked, the field shows "(using global default)" and the project inherits your global value. Checking the box activates a per-project control, so you can set a different value for that project.

These settings can be overridden per-project:

  • Completed, waiting, and escalation toggles
  • Escalation delay
  • Sound toggle and per-event sound file selectors (completed, waiting, escalation)

Some override fields are linked. Clearing the waiting override also resets escalation and escalation delay to their global defaults. Clearing the sound toggle override resets all three sound file selectors the same way.

Six settings are global-only and can't be overridden per-project: the master toggle (enabled), working pulse (workingPulseEnabled), working pulse sound (workingPulseSoundFile), UI feedback sounds (uiFeedbackSoundEnabled), and both idle terminal settings (idleTerminalNotify.enabled and idleTerminalNotify.thresholdMinutes). These apply uniformly across every project.

Note
Per-project notification overrides are stored locally on your machine and aren't committed to the repository. Each team member configures their own preferences without affecting anyone else. For the full picture of what Daintree stores per-project versus per-machine, see Projects.