When you’re running several agents, the hardest part isn’t the work, it’s knowing which one needs you. Termic reads real signals from each CLI to tell you when an agent has finished a turn or is stuck waiting, so you don’t have to watch them.
The two indicators
- Blue dot. Appears on a tab when its agent finishes a turn and you’re looking at something else. It’s sticky: it stays until you focus that tab or type into it, so a turn that finished while you were away doesn’t get missed.
- Orange bell. Appears when an agent is blocked on input, waiting for you to answer a question or approve something. This is the “come here now” signal, distinct from “done”.
Crucially, Termic never marks the tab you’re actively looking at. If you’re watching an agent work, you don’t get a dot for the thing right in front of you. The indicators are about the tasks you aren’t watching.
How detection works
This is the part most tools get wrong by guessing from idle time. Termic uses the signals the CLIs actually emit:
- Per-CLI title classifier. Each agent advertises its state in the terminal title. Claude has its spinner glyph, Gemini cycles through
◇/✦/✋, Codex showsWorking/Ready/Waiting. Termic reads those. - OSC 9;4 progress sequences, where the CLI emits them.
- Gating. A static “thinking” title shouldn’t read as “done”, so the classifier is gated by byte-quiet checks (has output actually stopped?), a content hash of the visible terminal, and scrollback state. The combination is what makes it reliable across Claude, Gemini and Codex rather than firing on every pause.
For a custom CLI that emits no status signals, finished and waiting-for-input are indistinguishable, so Termic shows the attention bell instead of a done dot. And because some custom CLIs produce output that trips a false positive, there’s a per-agent Work-done detection toggle in Settings → Agents to turn it off for that agent.
Desktop notifications
Beyond the in-app indicators, Termic can fire a macOS desktop notification when an agent finishes, so you can switch to another app and still get pulled back. They’re off by default; turn them on in Settings → General.
Two things make them pleasant rather than noisy:
- They fire only for agents in tasks you’re not currently viewing. The agent you’re watching never notifies you, and neither does any tab in the task you’re focused on.
- They’re focus-routed. Clicking a notification drops you on the exact task and tab that fired it, wired through the CLI’s OSC 9 / OSC 777 sequences. Clicking one only ever brings the window forward; it will not yank you to that task on an unrelated refocus a few seconds later.
The menu bar
The indicators only help while you are looking at Termic. The menu bar item is the same information when you are not.
It carries a numeral badge counting the tasks that want you, and its dropdown lists them: tasks blocked on input and tasks that just finished a turn, grouped by project. Click one and Termic comes forward on that exact task.
It is there whether or not a window is open, which matters because Termic can run windowless: the menu bar is then your way back in. Show Termic in the menu bar in Settings → General turns it off if you would rather not have it, and applies live with no restart. Choosing Keep in Menu Bar from the close prompt turns it back on if it was off, since that button is an explicit request for the tray as your way back.
A note on accuracy
Work-done detection is the kind of feature that’s easy to ship badly. Termic’s took a few iterations to get reliable, and the byte-quiet and content-hash gates exist specifically to kill the false “done” that idle-timer approaches produce. If you do hit a false positive on a custom agent, the per-agent toggle is the escape hatch.
Related
- Parallel agents: where these indicators earn their keep.
- Scheduled messages & Ralph-style loops: the queue advances on this same signal.
- Agents & the registry: the per-agent detection toggle.
- Settings reference: turning notifications on, and the menu bar toggle.
- Agent races: the race strip uses these same badges.