Daemons overlay
ainb runs a few background daemons on your behalf — the shared MCP server pool, the Headroom compression proxy, and the notifyd notification daemon that also serves the permission approve socket. Rather than make you hunt for them with ps, every ainb-managed daemon and socket shows up in one place: press d from anywhere in the TUI to open the Daemons overlay.

The overlay lists each daemon with a live status dot, and for the Headroom proxy: its port (:8787), the tokens it has saved so far (the same figure as the Savings tab and ainb usage savings), and which sessions are routed through it. r refreshes; R restarts notifyd; Esc closes.
What’s on it
- MCP pool — the shared
ainb mcp daemonthat spawns each MCP server once behind a unix socket. See Shared MCP pool. - Headroom proxy — the ainb-managed compression proxy. Its row carries the live saved-token count and a
watchedmarker when the in-loop watchdog is keeping it alive for a routed session. - notifyd processes — every running
ainb-notifydprocess, one line each, with its pid and health class. Orphaned or wedged strays are counted with a· N to clean up (run \ainb notifyd reap`)hint. notifyd owns the [Inbox](inbox-notifications.md) socket **and** the **approve socket** (~/.agents-in-a-box/approve.sock`) that the synchronous permission round-trip blocks on.
The restart lever (R)
The overlay is mostly for observing, but notifyd gets one deliberate control: R restarts notifyd — stop the owner, reap strays, respawn, and wait for the approve socket to bind. This is the single resume/repair command for a dead or wedged approve socket, and it is safe to run while permission prompts are mid-wait: a blocked PermissionRequest hook re-dials the socket every 500 ms until its deadline, so every still-waiting prompt re-registers itself the moment the fresh daemon binds. One restart repairs the socket and resumes the pending prompts — no hook is lost.
The outcome (stopped · reaped · spawned pid · socket bound) is shown as a transient status line under the notifyd header, and the daemon list re-scans automatically so the new pid appears.
The same command exists on the CLI:
ainb notifyd restart # stop + reap + respawn + wait for approve.sockainb notifyd restart --format json # machine-readable outcomeThe full health view
The overlay is the quick glance; ainb fleet daemons is the full table — every daemon with state, pid, uptime, last activity, and a health reason. The approve broker appears as its own row there: it rides notifyd’s process (no pid of its own), so its liveness is the socket accepting a connection, and its health reason carries the live pending-waiter count (serving — 2 pending requests) so you can see blocked hooks at a glance.
ainb fleet daemons # unified daemon health tableainb fleet daemons --format json # typed rows for scriptingStopping things deliberately
The overlay never stops anything from under a running session. Stop a daemon deliberately from the CLI instead:
ainb mcp stop # stop the shared MCP pool daemonainb headroom stop # stop the ainb-managed Headroom proxyainb notifyd stop # stop the notification daemon (SIGTERM via pid file)ainb notifyd reap # kill orphan/wedged notifyd strays, sparing the live ownerSee also
- Inbox & notifications — the daemon behind the notifyd rows, and the permission approve/deny round-trip.
- Token optimisation — Headroom & RTK — the proxy this overlay watches.
- Shared MCP pool — the other daemon on this screen.
- Keyboard shortcuts.