One agent → one URL. The whole map, today & tomorrow.
The goal:
anyone can expose their own AI agent to the network with a single link, self-contained,
end-to-end encrypted. Most of it already exists — but it grew as several overlapping stacks. This page
re-draws the system as one clean graph, marks what is built vs. what is next, and names
the seam that collapses the clutter.
The unifying idea →
one agent, one local fabric, one API handler, many transports, one URL.
Every reach surface (browser, CLI, desktop, peer) speaks the
same API; every transport (HTTP, WebRTC, libp2p) is just a pipe
into the same in-process apiFetch(); trust & discovery (signaling, E2E keys, tokens) is a
separable plane, not baked into any one path.
01The interactive graph
Tap any node for what it is, where it lives in the tree, and its status. Toggle
Future to overlay where the system is heading.
BuiltPartialExperimentalFuture
02The five planes (read top-down)
The same boxes from the graph, grouped into the layers that make the model legible. Data
flows up from the agent; control flows down from a surface.
① Agent core
Auto-yes wrapper spawns any AI CLI in a PTY and answers ready / enter / fatal
prompts so it runs unattended.
Rust is the primary single binary; TypeScript is the reference.
Remote CLI — ay remote add then drive another box.
Desktop (Electron) — offline, same UI, no signaling needed.
Swarm peers — other agents, P2P (experimental).
The seam
apiFetch is already called by both Bun.serve and the WebRTC bridge
in-process.
So a new transport (libp2p, a tunnel, a relay) is just another caller — no new
control plane.
That seam is what turns "three stacks" back into "one system."
03How a share link actually resolves
The "simple URL" path end-to-end. The secret S never leaves the two endpoints.
# 1. the host mints/persists a room and prints a link
$ ay serve --share https://agent-yes.com/w/#r3f9c2:e1.<secret S># room + E2E secret in the #fragment
# 2. browser opens the link — the #fragment never reaches any server
S = location.hash → authToken = HKDF(S, room)# only this is shown to signaling
# 3. rendezvous over s.agent-yes.com (relays SDP/ICE; learns nothing)
browser ⇄ signaling DO ⇄ ay serve
host
# 4. P2P DataChannel opens; keys = HKDF(S, transcript). Server is now cut out.
browser ⇄ AES-256-GCM ⇄ host
apiFetch() → ls · tail · send · spawn
# offline / LAN / desktop: skip 2–4 entirely
$ ay serve --http # browser → http://host:7432/#k=<token>
04Honest status — built · cluttered · next
✓ Built & working
Auto-yes wrapper across 8 CLIs, TS + Rust parity.
Local fabric: pidStore + FIFO + logs, driven by cy.