> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getdax.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Agent Watch

> See what every live Claude Code session is doing — working, waiting on you, or finished — without leaving what you're in.

**Agent Watch** keeps an eye on your Claude Code sessions so you don't have
to. It tells you the moment one finishes or needs your attention, and lets you
jump straight to it — or answer from the toast without switching apps.

Everything stays on your Mac.

## Open it

Press <kbd>⌃</kbd> <kbd>⌥</kbd> <kbd>M</kbd> from any app.

## How it works

<Steps>
  <Step title="Run your agents">
    Start one or more Claude Code sessions in any terminal — Terminal, iTerm,
    or Ghostty. Agent Watch picks them up automatically.
  </Step>

  <Step title="Keep working">
    A toast appears when a session finishes or is waiting on you (a permission
    prompt, a question). Click the toast to jump to that terminal, or type an
    answer right there.
  </Step>

  <Step title="Open the palette">
    Press <kbd>⌃</kbd> <kbd>⌥</kbd> <kbd>M</kbd> to see every live session
    at a glance. Each row shows the project name, what the agent last said, a
    status light, and how long it has been in that state. Press <kbd>↩</kbd>
    to go to the selected session.
  </Step>
</Steps>

## Session states

Every session is in one of three states:

| State         | Light     | Creature       | Meaning                                                                  |
| ------------- | --------- | -------------- | ------------------------------------------------------------------------ |
| **Working**   | 🟢 Green  | Walking        | The agent is producing output or a tool is running.                      |
| **Needs you** | 🟡 Yellow | Shuffling      | A tool call has been quiet long enough to look like a permission prompt. |
| **Finished**  | ⚫ Grey    | Standing still | The agent handed control back — it's your move.                          |

The status light and the creature animation both say the same thing, so you
can read the palette at a glance without stopping to parse text.

## Characters

Each project gets its own pixel creature, chosen from its folder path — same
repo, same character, every time. When two sessions want the same one, the
second takes the next free character along, so no two on screen are ever
alike.

They walk while a session is working, shuffle about when one wants you, and
stand still once it's done.

<Accordion title="Meet all 21 characters">
  <div style={{display: "flex", flexDirection: "column", gap: "2px"}}>
    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/fin@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=0d89bf76ad52e62685401d593d9481cf" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/fin@4x.png" /> <strong>Fin</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Fish</span> <span style={{fontSize: "13px"}}>— Never stops moving, not even asleep.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/pip@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=b95b540b4859bb110278f7d680b11810" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/pip@4x.png" /> <strong>Pip</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Bird</span> <span style={{fontSize: "13px"}}>— Small, loud, and first to notice anything.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/bo@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=58d951dd82b1f83ed170d0c5eae59ac9" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/bo@4x.png" /> <strong>Bo</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Puffer</span> <span style={{fontSize: "13px"}}>— Puffs up at the slightest provocation and deflates just as quickly.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/moss@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=65c55c6c31a4431bd58ee96768d7779a" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/moss@4x.png" /> <strong>Moss</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Sprout</span> <span style={{fontSize: "13px"}}>— Grows a little every day and refuses to be hurried.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/nub@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=29f6034ac18d2b98dc11a8a0fe293c43" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/nub@4x.png" /> <strong>Nub</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Crawler</span> <span style={{fontSize: "13px"}}>— Many legs, one direction. Does not turn around.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/slate@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=12b7ff797d0624b3ffd4c905982c62f1" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/slate@4x.png" /> <strong>Slate</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Rock</span> <span style={{fontSize: "13px"}}>— Moves about once a season, and only if asked twice.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/dust@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=3a31aca2f2d2f449cd626f52e35fa587" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/dust@4x.png" /> <strong>Dust</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Moth</span> <span style={{fontSize: "13px"}}>— Drawn to whatever is brightest, which is reliably the wrong thing.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/blip@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=aef2bd7d4552500c3defd217e5eaa951" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/blip@4x.png" /> <strong>Blip</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Tadpole</span> <span style={{fontSize: "13px"}}>— Still becoming something. Fine with this.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/twig@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=87571707e1b549a6a0806040ae512812" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/twig@4x.png" /> <strong>Twig</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Stick insect</span> <span style={{fontSize: "13px"}}>— Holds perfectly still and assumes that makes it invisible.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/coral@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=f3722afe347e34d33c1bd4cb4d3e24a1" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/coral@4x.png" /> <strong>Coral</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Jellyfish</span> <span style={{fontSize: "13px"}}>— Drifts wherever the current goes and calls it a plan.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/scale@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=1760f1cce34bd083f0df50d4269fc91a" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/scale@4x.png" /> <strong>Scale</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Lizard</span> <span style={{fontSize: "13px"}}>— Basks, then bolts. There is no middle setting.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/nipper@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=e23d4201916322130d327c3c7b33b56d" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/nipper@4x.png" /> <strong>Nipper</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Crab</span> <span style={{fontSize: "13px"}}>— Sideways is a perfectly good direction.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/coil@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=7a9d21bf9390c2e193693adc1e352b83" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/coil@4x.png" /> <strong>Coil</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Snail</span> <span style={{fontSize: "13px"}}>— Carries everything it owns and still arrives.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/hoot@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=671e314d9212830e176dacf419855407" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/hoot@4x.png" /> <strong>Hoot</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Owl</span> <span style={{fontSize: "13px"}}>— Sees everything and mentions none of it.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/echo@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=ec4f9b6a9f16f3506f70d8408aa297b0" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/echo@4x.png" /> <strong>Echo</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Bat</span> <span style={{fontSize: "13px"}}>— Navigates by shouting into the dark and listening.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/husk@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=cb4d1556b28fa1b27fb6cf0be24c8c1c" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/husk@4x.png" /> <strong>Husk</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Beetle</span> <span style={{fontSize: "13px"}}>— Armoured, deliberate, and quietly certain it is right.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/croak@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=25105144427a27a241f0ab12f7a28710" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/croak@4x.png" /> <strong>Croak</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Frog</span> <span style={{fontSize: "13px"}}>— Sits very still, then isn't there.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/ink@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=1da9d88fab018783e4df188d05e1cdba" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/ink@4x.png" /> <strong>Ink</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Squid</span> <span style={{fontSize: "13px"}}>— Solves most problems by leaving a cloud behind.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/cap@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=b3550f60865bd912e4c8c54a2a2d39ef" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/cap@4x.png" /> <strong>Cap</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Mushroom</span> <span style={{fontSize: "13px"}}>— Turned up overnight and behaves as though it always lived here.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/star@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=c5bbf80bbc77f61645d93e6168f9bb22" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/star@4x.png" /> <strong>Star</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Starfish</span> <span style={{fontSize: "13px"}}>— Five arms, no front, no particular plan.</span>
    </div>

    <div style={{display: "flex", alignItems: "center", gap: "10px", padding: "4px 0"}}>
      <img src="https://mintcdn.com/dax-ce38d61c/_UsDat5t5mrJopjU/images/characters/mite@4x.png?fit=max&auto=format&n=_UsDat5t5mrJopjU&q=85&s=45b2a6fb6c1df0ed5becef0f38f65dcd" width="24" style={{imageRendering: "pixelated"}} data-path="images/characters/mite@4x.png" /> <strong>Mite</strong> <span style={{color: "var(--text-tertiary)", fontSize: "13px"}}>Ant</span> <span style={{fontSize: "13px"}}>— Small, tireless, and carrying something four times its size.</span>
    </div>
  </div>

  Every character is a 12 × 12 pixel grid with its own colour, so it reads by
  shape *and* by colour — "the orange crab" always means Nipper.
</Accordion>

## Replying from the toast

When a session is waiting on you, the toast includes a text field. Type your
answer and press Return — Dax finds the terminal running that session, brings
it forward, and pastes your reply in. Works with Terminal, iTerm, and Ghostty.

If the terminal can't be identified, your answer goes to the clipboard
instead and Dax tells you to paste it yourself.

## Hooks (optional, recommended)

Without hooks, Dax reads the agent's trace files every few seconds and
*infers* whether it's waiting. With hooks installed, Claude Code tells Dax
directly — faster and certain.

Install them from **Settings → Tools → Agent Watch → Install Hooks**. This
adds two entries to `~/.claude/settings.json` (backed up first):

* **Notification** — fires the moment a session hits a permission prompt or
  finishes.
* **Stop** — delivers the finished reply as it lands.

Remove Hooks takes out only Dax's entries and leaves everything else
untouched.

## Plain-language summaries

What agents write is paragraphs. A toast has room for a line. When **Say it
in plain language** is on, Dax rewrites the agent's message into one sentence
using Apple's on-device model — no network, no cost, works offline. Requires
macOS 26 and Apple Intelligence.

## Options

Settings → Tools → Agent Watch:

* **A session finishes** — toast when a turn is done.
* **One is waiting on me** — toast on a permission prompt or question.
* **Play a sound** — chime alongside the toast.
* **Pause watching** — stop notifications without disabling the tool.
* **Say it in plain language** — on-device AI summary of the agent's message.
* **Let me answer from the toast** — reply field on "needs you" toasts.

## Privacy

Entirely on your Mac. Agent Watch reads the trace files Claude Code already
writes to disk and never touches the network. The optional summary uses
Apple's on-device model — your code stays local.

## Supported agents

Claude Code only for now. Codex writes trace files Dax can read, but has no
hook to report state directly, so its sessions aren't watched rather than
half-supported.
