The agent bridge

Steer a running session. Start a new one.

Chirp is the standing, two-way channel between you and every Claude Code session you run. Sessions report into threads. Your replies go back in. And when you want a fresh session, a small program on your Mac starts it.

Illustration: a long cable-stayed bridge across dark still water at night, one small teal light at the midpoint of the span.
Steering

Four steps from a prompt to a reply the agent acts on.

  1. You prompt Claude Code

    The first prompt creates the thread and titles it. Chirp waits for the prompt on purpose: a thread made at session start would be called "untitled" forever.

  2. Hooks post progress

    Tool calls, sub-agent summaries, and each turn's summary post to the thread. A read of a file shows as a path and a line count, never the contents.

  3. You reply

    Reply in the thread from the web client or the iPhone app. Chirp writes the reply to that session's inbox.

  4. The session hears you

    The next hook poll hands the reply to the model as extra context beside the tool result. If the session had gone quiet, the check at the end of its turn picks the reply up and the turn continues.

A Chirp agent thread: a live Claude Code transcript with each tool call and its result, a human steering reply, and a RUNNING badge.A Chirp agent thread: a live Claude Code transcript with each tool call and its result, a human steering reply, and a RUNNING badge.
A live transcript, with a human steering reply in the middle. Enlarge to see the full screen.
A Claude Code session blocked on a permission request in a Chirp thread, with the Reply to agent action beside it.A Claude Code session blocked on a permission request in a Chirp thread, with the Reply to agent action beside it.
A session blocked on a permission, with the Reply to agent action. Enlarge to see the full screen.

The permission notice comes from Claude Code's Notification hook. The recorded headless test runs deny a disallowed tool instead of raising that notice, so that one path needed an interactive session to confirm, and the bridge guide in the Chirp repo says so.

The hooks

One command, eight events.

Claude Code hands each hook a JSON payload on standard input. Chirp installs one entry point, chirp hook, for every event below. A hook that cannot reach Chirp exits cleanly and logs the error, so Chirp being down never changes what your session does.

Claude Code hook events and what Chirp does with each
EventWhat Chirp does
SessionStartRemembers the session's context. No thread yet. On a resumed session, it delivers anything waiting in the inbox.
UserPromptSubmitThe first prompt creates and titles the thread. Later prompts post to it. It also checks the inbox.
PreToolUsePosts a preview, for high-signal tools only.
PostToolUsePosts the result and checks the inbox. This is the main steering path.
SubagentStopPosts the sub-agent's summary with the sub-agent's name on it.
StopPosts the turn's summary and checks the inbox without a delay. It never ends the session.
SessionEndCompletes the session, and the thread moves to completed.
NotificationPosts a message such as "Claude needs your permission," which is how you learn a session is blocked.
Secrets stay home
Before anything leaves your machine, Chirp strips cloud and API keys, Chirp's own tokens, JWTs, and password or token assignments from tool previews. Over-redacting is cheap, and under-redacting is not recoverable.
Install and remove cleanly
chirp hooks install merges into your existing Claude Code settings, backs the file up first, and can be run again safely. chirp hooks uninstall removes only the entries it added.
No credential, no calls
A machine with no Chirp credential makes no network calls at all, so installing the hooks on a shared box does nothing until someone authenticates.
Starting a session

Queue it from Chirp, and a Mac starts it.

A server cannot edit your code, run your tests, or use your credentials, so real work has to run on your Mac. The listener, chirp-agent-listener, runs under launchd, asks Chirp for work, and starts claude -p in the right project folder. From then on the session is indistinguishable from one you started by typing.

  1. You queue it

    Use the Start a task dialog, or an agent calls the queue_agent_task MCP tool. Chirp makes a thread with the status queued.

  2. A Mac claims it

    The listener polls over outbound HTTPS, every 5 seconds by default, and claims the task with one atomic update, so two Macs never start the same task.

  3. The session starts

    The listener starts claude -p in the project's folder with your files, credentials, and tools.

  4. The thread attaches

    The session's own first hook ties it to the thread, and the listener tells Chirp the task was started.

  5. You steer it

    From here it is an ordinary bridged session: watch, reply, and read the summary.

Chirp's Start a task on your Mac dialog, with a project field and a description field.Chirp's Start a task on your Mac dialog, with a project field and a description field.
The Start a task dialog. Enlarge to see the full screen.
Chirp's Agent Tasks page: running, failed, and completed sessions, a task waiting for a Mac, and a registered Mac with a Revoke button.Chirp's Agent Tasks page: running, failed, and completed sessions, a task waiting for a Mac, and a registered Mac with a Revoke button.
Agent Tasks: a task waiting for a Mac, the sessions, and the registered Macs. Enlarge to see the full screen.

Only the projects you list

The listener reads ~/.chirp/projects.json and will start work only in projects named there. The file is read again on every poll, so an edit takes effect without a restart. Installing the listener seeds the file by finding your git repositories, because an empty file declines every task, which looks like a broken listener instead of an unfinished setup.

A project marked requires_confirmation makes the Mac decline remote starts and say so in the thread. Use it for a repository that should only run from a terminal.

{
  "sentinel-firmware": {
    "cwd": "/path/to/sentinel-firmware"
  },
  "hestia-ota": {
    "cwd": "/path/to/hestia-ota"
  },
  "payments": {
    "cwd": "/path/to/payments",
    "requires_confirmation": true
  }
}

A task goes through queued, claimed, and spawned, or is canceled or expires. Tasks expire after an hour by default, so a Mac that was shut for a week does not wake up and start two weeks of stale work. A claim that is never confirmed becomes claimable again after 120 seconds, which covers a listener killed halfway. Every ending posts a notice into the thread, because a task that silently vanishes looks exactly like one still waiting.

Security model

A listener that can do very little.

Letting a chat message start a program on a laptop is the part to be careful about. The listener's design keeps its reach small.

Two powers
A listener's token can read its own user's queue and acknowledge it. It cannot post events, read messages, or mint session tokens.
Tied to one Mac
The token records the Mac's hardware ID when it is issued and is checked on every use. A mismatch fails closed and revokes the token, because a token seen on another machine was copied or stolen.
Your queue only
A listener sees only tasks queued by its own user. Nobody, an administrator included, can queue work onto someone else's Mac.
No inbound ports
The listener only calls out over HTTPS. There is no tunnel, no port forwarding, and nothing listening on the Mac.
Revocable
Revoke a Mac from the Agent Tasks page, through the API, or with chirp-agent-listener uninstall. Sessions already running keep going, because each holds its own scoped session token with a sliding expiry.
Allowlisted projects
The project file above decides where work can start. A project that is not in it is not startable.
Setup

Once per Mac.

  1. Put the chirp command on your path.
  2. Mint an API key on the API Keys page and hand it to the command line.
  3. Run chirp hooks install, then chirp hooks status to check it. Start a new Claude Code session, because a running one does not pick up new hooks.
  4. Optional, to start sessions from Chirp: install the listener with chirp-agent-listener install and check it with chirp-agent-listener status.
Chirp's API Keys page, where a key is minted for the command line, with the key list and a button to create another.Chirp's API Keys page, where a key is minted for the command line, with the key list and a button to create another.
The API Keys page. Enlarge to see the full screen.
For agents

The bridge, from an agent's side.

Chirp's MCP server has seven tools for the bridge, so one agent can follow, steer, or start another.

Bridge MCP tools
ToolWhat it does
list_agent_tasksLists every bridged session thread.
get_agent_taskReturns one thread's full state.
reply_to_agentSteers a running session by queuing a message in its inbox.
queue_agent_taskStarts a new session on the user's Mac.
list_queued_tasksLists pending tasks and says whether a Mac is online.
cancel_queued_taskCancels a task before a Mac picks it up.
list_agent_daemonsLists the registered Macs and when each last checked in.

A plain reply in a thread is visible to people but never reaches the session. Steering goes through the session's own inbox route, which the web client, the apps, and reply_to_agent all use.