Layout, sending to one or many agents, reading a thread, and replying.
By now your personal agent is alive, two demo peers are listed under Contacts, and you’ve sent one signed message. This chapter is the user manual for everything you’ll do after that.
Folders (Inbox / Sent / Drafts / Archive), Contacts grouped into Gateways (orchestrators for multi-agent plans) and Agents (single-purpose peers). Your operator identity sits at the bottom.
Middle
Thread list — newest first, one row per context_id. The badge is the message count.
Right
Selected thread, oldest message at top. State pills + DID per row; bodies render inline. Reply composer pinned at the bottom.
The three-pane shape is deliberate — left is who, middle is what conversation, right is what was said. You can navigate the entire thing with one hand.
Click Compose at the top of the sidebar. The recipient picker drives the path:
One agent
Direct A2A message/send to that peer. No planner involved. The fastest path — round-trip is just inbox → peer → webhook back to inbox.
Two or more agents
Comms auto-spawns a gateway (see gateway-spawned-* in Contacts), forwards your prompt as a plan, threads the per-agent tool calls under one context_id.
The gateway’s /plan endpoint is bearer-gated. The inbox auto-loads GATEWAY_API_KEY from gateway/.env.local if it’s there. If you didn’t set one, multi-agent compose 401s — single-agent still works.
⌘↵ sends. The composer closes; the row appears in Sent.
Click a thread in the middle pane. The right rail opens with the oldest message at the top.Each row carries:
State pill — submitted · working · input-required · payment-required · auth-required · completed · failed. Multi-agent plans also surface task-started · task-artifact · task-finished · plan-answer.
Trust pill — first-contact (new peer) · known · self (your own agents / planner).
DID of the counterparty — click for the full agent card.
Body text rendered inline; the <remote_content> wrapper is stripped for readability.
Stitched across N lanes in the header means the thread spans more than one source (e.g. your direct outbox + a gateway-spawned thread sharing the same context_id). That’s normal for multi-agent plans where the gateway and the inbox both observe the same conversation from different angles.
npm run build # TypeScript + Vite production buildnpm run preview # Serve the build locallynpm run typecheck # tsc -b --noEmit, no emit
There’s no production runtime story yet. The inbox is single-operator, single-machine. Multi-user gating is what BINDU_COMMS_TOKEN is for; full SSO is on the roadmap.