Skip to main content
AI AUTOMATION

See what every CLI agent is doing, while it runs

A hook script, a local event hub, and a dashboard that nests runs by repository, session and subagent.

THE PROBLEM

What was in the way

An agent run is a terminal scroll. Two runs in two repositories are two terminal scrolls, and neither tells you which one is stuck or which one has quietly spawned three subagents.

The agent is not your program either. You cannot add logging inside a CLI that someone else ships, so any visibility has to come from outside it.

THE APPROACH

How it was built

The CLI already fires hooks on its own lifecycle, so the observer registers a small script against them rather than wrapping or proxying anything. Each event posts to a local server that holds the repository, session and agent tree in memory and pushes updates to the dashboard over a WebSocket.

That send is deliberately fire and forget. If the server is down the hook errors are swallowed and the run carries on, so the monitor can never take out the tool it monitors. Claude Code and Gemini CLI name their events and tools differently, and both are mapped to one vocabulary before anything is stored.

Hook event to live dashboard
Hook event to live dashboard
HIGHLIGHTS

How it works

Nothing wraps the agent

Nothing wraps the agent

The installer adds a command hook to the CLI's own settings file, and the script reads the payload the CLI hands it. It never sits between the agent and its model, and uninstalling strips the hook back out of that file.

Subagent tree rebuilt from tool calls

Subagent tree rebuilt from tool calls

There is no subagent start event to listen for. The hook spots a Task call, synthesizes a start event carrying a parent id, and the dashboard renders that child as a nested lane.

A dead server cannot stall a run

Every event is posted fire and forget with a five second timeout, and hook errors are swallowed. Start the dashboard halfway through a run and it picks up from the next event.

RESULTS

What it does now

no wrapper on the agentreads hooks the CLI already fires
runs with the server offhook errors are swallowed, the agent continues
two CLIs, one timelineevent and tool names normalized on the way in
STACK

What it is built on

TypeScriptserver and dashboard
Reactlive swimlane UI
Node.jshook scripts and installer
Expressevent intake API
WebSocketpush to the browser
Vitedev server and build

Got something in your workflow that looks like this?