Your agents are already everywhere.

You don't have to be.

You delegated the work.
Not the watching.

One bridge.

Every coding agent.

Any interface on top.

Agent Deck

Let the work keep moving.
Take your attention back.

Less checking. More living.

The work can keep moving.
So can you.

One live stream for every agent. A clear view from whatever screen is nearest. And a way back in when the next move is yours.

Take the deck for a spin
  • UserPromptSubmitUserPromptSubmitBeforeAgentchat.messagebefore_agent_startturn.started
  • PreToolUsePreToolUseBeforeTooltool.execute.beforetool_execution_startitem.started
  • PostToolUsePostToolUseAfterTooltool.execute.aftertool_execution_enditem.completed
  • PreToolUse · policyPreToolUse · policyBeforeTool · policypermission.asktool_call · policyrequest.opened
  • StopStopAfterAgentsession.idleagent_settledturn.completed

Five runtimes. Five protocols.
Five different ideas of “working.”

Different runtimes.
One language.

Illustrative session · real bridge vocabulary
  • messages
  • reasoning
  • terminal activity
  • file changes
  • approvals
  • questions
  • usage
BridgeSnapshot · agents[0]
project
orbital-api
runtime
claude
model
Claude Code
state
waiting
task
Approve? rm -rf .cache/build
tokens
184,320
costUsd
3.42
pendingApproval
Bash · demo-approval-1
pendingQuestion
events
newest first · history on demand
orbital-apiReview required
Seeded conversation
The build cache is stale again — can you clear it and rerun?
Reasoning

The cache directory is generated, so removing it is safe. It sits inside the repo, though, so I should ask before deleting recursively rather than assume.

I can clear it. That's a recursive delete inside the repo, so I'd rather you approve it.

Approval required29m left · seeded

Bash

rm -rf .cache/build
The same session, rendered

Everything becomes state.

State every surface
can trust.

CH 04 · The deck · simulated

Attention,
not activity.

Sorted by who needs a person, not by recency. A question or approval rises above the work that can carry on without you.

Six agents working. Nothing needs a decision.

0 / 2

Error → blocked → done, unseen → running → idle, seen → offline

Agent Deck

Demo bridge · 6 running

  • πlantern · c018Workinglive
  • vine-cli · a55bWorkinglive
  • hex-renderer · 2ee8Workinglive
  • atlas-docs · 7d30Workinglive
  • checkout-flow · b91cWorkinglive
  • orbital-api · 4f2aWorkinglive
iPhone · rendered product UI

Quiet work stays quiet.

Attention, not activity.

Your agents can work without
becoming your notification feed.

CH 05 · Understand the work

Pick up the thread.
Not the pieces.

You stepped away. Now see what changed, why it changed, and what comes next. The conversation, the reasoning, the diff. All in one session.

  • 01Read the answer, as it was written.
  • 02Unfold the thought behind it.
  • 03Inspect the actual change.

Recreated from the native clients. Seeded demo activity.

Simulated turn · 1 / 5Instruction
orbital-apiInstruction
Seeded conversation
The build cache is stale again — can you clear it and rerun?
Reply or steer…
Session · orbital-api
orbital-api · Claude Code · simulation
$ claude
› Clear the stale build cache and rerun.

Bash(rm -rf .cache/build)
  Waiting for approval. Command not run.

Blocked until the decision returns

Request travelling
  1. Runtime
  2. Adapter
  3. Bridge
  4. Phone
  5. Watch
orbital-apiReview required

Generated build cache inside orbital-api. The recursive delete needs a decision.

Approval required29m left · seeded

Bash

rm -rf .cache/build
Android phone
orbital-api
Approval requiredBashrm -rf .cache/build
Pixel Watch · phone relay

Runtime · Bash is waiting for permission.

1 / 11
Illustrative ask-capable runtime. Wear OS can also connect directly; this scene follows the phone relay.

Most of the time,
your agents don’t need you.

Until they do.

An approval on your wrist.

A terminal unblocked
seconds later.

CH 08 · Stay in control

Not remote desktop.
Remote control.

Change your mind without going back to your desk. Answer a question. Redirect the work. Stop a turn. You're controlling the agent, not squinting at its terminal.

Send your first instruction
approverejectpromptsteerfollow_uppauseresumestopset_model

Available controls depend on the runtime's reported capabilities.

  • A receipt, not a guess.Every command has a delivery status. Queued is not the same as delivered.
  • The right next action.A blocked agent asks you to resolve its approval or question before sending more work. Deliberate queueing remains your choice.
CH 09 · Shared attention · simulated

2 need you · one bridge projection

Agent Deck2 need you
orbital-apiApprove? rm -rf .cache/build
checkout-flowWhich payment provider should the retry path use?
vine-cliReady for an instruction
AgentsUsage
iPhone
Agent Deck2 need you
orbital-apiApprove? rm -rf .cache/build
checkout-flowWhich payment provider should the retry path use?
vine-cliReady for an instruction
AgentsUsage
Android
Agent Deck2 need you
orbital-apiApprove? rm -rf .cache/build
checkout-flowWhich payment provider should the retry path use?
Wear OS app
2 need you
orbital-apiApprove? rm -rf .cache/build
checkout-flowWhich payment provider should the retry path use?
4 more
Wear OS tile
Android widget
agent-deck

$ 2 need you

orbital-apiApprove? rm -rf .cache/build
checkout-flowWhich payment provider should the retry path use?
vine-cliReady for an instruction
3 more
macOS · service controller
BridgeServinglaunchd

Installs, starts, stops and inspects the host service. Not a deck; no agent list or attention count.

atlas-docs is working. The two blocked sessions lead every surface.

Phones read the bridge. The watch can read directly or via its phone. The widget and tile render the latest saved summary; offline views may be stale.

One source of truth.

Every surface agrees.

CH 10 · The live connection

Live means live.
Not “refresh to check.”

A runtime speaks. The adapter translates. The bridge updates the session. Every subscribed surface gets the change—not another copy of everything.

Protocol simulation · no live connectionGET /bridge/v1/events
  1. 01Runtimetool permission
  2. 02Adapterrequest.opened
  3. 03Bridgeprojection
  4. 04SSEsnapshot / patch
  5. 05Surfacesapply by id

Start with the whole deck.

Two new connections omit Last-Event-ID. Each receives its own full snapshot.

1 / 10
Connections A · Bevent: snapshotFrame excerpt · bridge, summary and agent fields abbreviated
agents: [ orbital-api, checkout-flow, atlas-docs ]
sequence: current bridge revision
A · iPhoneConnected

snapshot · entire deck

orbital-apirunning
checkout-flowrunning
atlas-docsrunning
B · AndroidConnected

snapshot · entire deck

orbital-apirunning
checkout-flowrunning
atlas-docsrunning
C · new clientNot joined
No local deck.
No resume cursor.

Initial snapshot. Changed-agent patches. A cursor for each connection. Clients never apply a lower sequence over a higher one.

Read the stream contract
What travels over the wire?

A fresh connection receives a snapshot. Then patch frames carry changed agents and removed IDs. Keepalive ping frames arrive every 15 seconds. Each connection has its own diff; a late subscriber never depends on another client's place in the stream.

Read the stream contract

CH 11 · Keep your tools

Your harness.
Your habits.
One shared language.

One bridge doesn't mean one adapter. Agent Deck meets each runtime where it is. Keep the tools you chose. Lose the constant switching between them.

01 / HOOKS

A process per event.

Stdin hooks publish lifecycle changes. A session daemon reads the conversation the hooks cannot see.

Claude Code · Codex · Gemini CLI
02 / PLUGINS

Right inside the runtime.

In-process extensions stream activity and can hold a tool call open while you decide.

Pi · OpenCode
03 / MANAGED

The bridge runs the loop.

A bridge-hosted session. No terminal required. The host owns the lifecycle and resolves requests directly.

Managed Claude
04 / TERMINAL

Where hooks can't reach.

Herdr observes terminal state and delivers instructions into panes without another route in.

Herdr
Agent Deck · /bridge/v1
  • Android app
  • Wear OS app
  • iOS app
  • Widget & tile
  • CLI
  • Web dashboard
  • Slack
  • IDE
  • Custom hardware
  • Ambient display

Build your own surfaceConceptual clients, not shipping integrations. Build from the same wire contract.

The apps are clients.

The bridge is the product.

CH 13 · Build beyond the apps

A protocol.
Not a product silo.

The best interface might be one we haven't imagined. Build a client from the wire contract alone. Same sessions. Same requests. Your way in.

Read the Bridge API

Published JSON Schema. Generated from the schemas the routes actually decode.

/bridge/v1THE WIRE CONTRACT
Representative routes, all prefixed by /bridge/v1
MethodRoutePurpose
GET/eventssnapshot, then per-connection patches
GET/snapshotthe same shape, one-shot
GET/agents/:id/historythe retained event log
GET/agents/:id/changesevery file change, with diffs
POST/agents/:id/controlapprove · reject · prompt · steer · stop
GET/commands/:id/receiptdelivery, observable

CH 14 · Your network. Your bridge.

No hosted middle.
One less thing to trust.

Your bridge listens on localhost. Reach it over your tailnet, with paired devices and explicit access scopes. The control plane stays on infrastructure you own.

YOUR MACHINElocalhostYOUR NETWORKtailnetYOUR SURFACEpaired device
The trust boundaries, explicitly.

Device tokens are stored as SHA-256 hashes and compared in constant time. Reading and control are separate scopes. Authentication is enforced when BRIDGE_REQUIRE_AUTH=true; the bridge warns when enforcement is off. Pairing codes are short-lived and single-use.

This describes the Agent Deck bridge. Your coding runtime's connections to model providers are separate.

CH 15 · Know what the work costs

One place to see
what it all costs.

Across runtimes. Across projects. See the spend, the trend, and the limits before you decide what to run next.

Seeded analytics / one recorded day
Frozen example, not live account usage.

Priced cost

$6.99

Processed tokens

16.2M

Sessions
6
Runtimes
4
Projects
6

By project

Priced cost
  • orbital-api$3.42
  • checkout-flow$1.87
  • atlas-docs$0.94
  • hex-renderer$0.41
  • vine-cli$0.22
  • lantern$0.13

By runtime

Processed
  • Claude Code13.9M
  • OpenCode1.4M
  • Codex541.0K
  • Pi311.2K

Token history

Daily / seeded week

16.2M tokens in one seeded day. No invented activity fills the earlier days.

Rate limits

Provider-window examples
5-hour
Weekly

Illustrative runtime reports, not a quota shared across these projects. A connected bridge shows only windows its providers report, including reset times when supplied.

Historical usage is separate from a live card’s context pressure. These fixture totals come from the demo seed’s explicit processed-token values; they are not a conversion rule for real sessions. Cost is priced usage, not a provider invoice.

CH 16 · Start with what is possible

The deck doesn't guess.
It asks.

Start another agent in a known project. Models come from what the runtime reports—not a marketing list. No learned catalog? Let the runtime choose its default.

New session / offline demonstration
Seeded host capabilities. No runtime or model account is connected.

Directory on the seeded host/workspaces/orbital-apiExample paths, not folders on this device.
Model / runtime default

No catalog has been learned yet.

The request omits model. The runtime chooses its own default. A hosted session can teach the bridge its supported models.
The bridge answers

One host. Its actual capabilities.

The production route currently hosts Claude. Other runtimes can appear on the deck without being startable here.

interrupt
Supported in fixture
approvals
Supported in fixture
userInput
Supported in fixture
modelSwitch
Supported in fixture
Inspect seeded discovery responsesGET /managed/runtimes
{
  "runtimes": [
    {
      "runtime": "claude",
      "managed": true,
      "capabilities": {
        "interrupt": true,
        "approvals": true,
        "userInput": true,
        "modelSwitch": true
      }
    }
  ]
}
GET /models
{
  "catalog": []
}
Waiting for your instruction

Choose a known project and start. The result and exact request will appear here.

Your turn

A little less watching.
Try how that feels.

Six sessions. Two need you. Open one, inspect the work, then make the decision. Watch the deck get quieter. This is a local simulation; no commands leave your browser.

Interactive / offline
Six seeded sessions. Your decisions stay in this browser.

Agent Deck

Demo bridge · 2 need you · 2 running

orbital-apiReview required
Seeded conversation
The build cache is stale again — can you clear it and rerun?
Reasoning

The cache directory is generated, so removing it is safe. It sits inside the repo, though, so I should ask before deleting recursively rather than assume.

I can clear it. That's a recursive delete inside the repo, so I'd rather you approve it.

Approval required29m left · seeded

Bash

rm -rf .cache/build

Choose a session. Review its activity, then decide what happens next.

Inspect the simulated bridge traffic
  1. Seeded snapshot · 6 sessions · no bridge connected
  • Claude Code
  • Codex
  • Gemini CLI
  • OpenCode
  • Pi
  • Phone
  • Watch
  • Desktop controller
  • Your client
Agent Deck

Every coding agent.
One bridge.

Run them anywhere. See them anywhere. Step in only when they need you.

The interface can change. The control plane stays.