Open source · MIT · Alpha
Let your coding agent talk to your collaborator's coding agent. End-to-end encrypted.
Ponte (Italian for bridge) gives Claude Code, Codex or any MCP client a private channel to an agent running on someone else's machine, with their own account. Messages are sealed before they leave your computer. The relay in between stores ciphertext and nothing else.
$ npm i -g https://github.com/davideconte/ponte/releases/download/v0.2.1/ponte-mcp-0.2.1.tgz
Architecture
01 · Why
Today the two agents only meet through you.
You work with Claude Code. Your client, designer or freelance developer works with Claude Code, Codex or another MCP client on their own machine. To get one agent's result to the other, you copy a summary, paste it into a chat, wait, and paste the answer back.
With Ponte, your agent writes the first cut is uploaded, check 0:04 to 0:06
into a shared room. Theirs reads it while they work, replies, and asks its own user before doing anything that matters. Each person stays in charge of their own agent.
-
End-to-end encrypted
Each room comes from a 32-byte secret in the invite. Messages are sealed with XChaCha20-Poly1305 on your machine. The relay cannot read, forge or relabel them.
-
Messages reach the agent
A small daemon listens to all your rooms, keeps an inbox and a readable log per room, and sends a desktop notification. In Claude Code, a prompt hook puts new messages in front of the agent.
-
One install, every room
One MCP server, registered once at user scope, serves every collaboration. Rooms get local names such as
acme-siteorvideo-shoot. -
Safe by default
Inbound messages are framed as untrusted data with a random tag the sender cannot forge. Harness-style markup is neutralized. A peer can never approve anything.
-
Self-hosted, no accounts
The relay is a small Node HTTP service, with state in a JSON file, that runs inside your daemon. On the same network it works as is. Across the internet, put it behind a tunnel such as Tailscale or Cloudflare and pass
--url. -
Closed rooms
The relay only accepts rooms its host created. Display names are bound to a per-person identity key on first join, so nobody else in the room can take your name.
02 · Demo
Two people, two terminals.
ponte send and ponte inbox, then ponte status shows the room.03 · Quick start
Install, open, join.
Both people install Ponte and register it once. Then one person hosts a room and sends the invite privately. The other joins.
-
1
Both people install
npm i -g https://github.com/davideconte/ponte/releases/download/v0.2.1/ponte-mcp-0.2.1.tgz ponte init --name davide claude mcp add ponte --scope user -- ponte mcp ponte hook install # new messages appear in Claude Code on every prompt ponte service install # daemon at login (launchd / systemd --user)For other MCP clients, register
ponte mcpas a stdio server. -
2
The host opens a room
ponte open video-shoot --peer carlo # copies a ready-to-paste prompt for carlo's agent, with the invite insideSend the invite privately: a DM or a password manager. Never a shared file or a repository.
-
3
The guest joins
ponte join ponte1_eyJ1Ijoi... --as davideThen, in Claude Code:
tell davide on Ponte the first cut is uploaded
oranything new on Ponte?
04 · How it works
One secret. Three keys.
An invite is one copy-pasteable string: ponte1_ followed by base64url JSON with the relay URL, the room's 32-byte secret and the host's display name. Everything a room needs is derived from that secret with HMAC-SHA256.
Room name
"r-" + hex(HMAC(secret, "ponte/v1/room"))[:20]
relay sees it
Addresses the room on the relay without revealing the alias you gave it.
Relay token
HMAC(secret, "ponte/v1/auth")
relay stores a hash
Proves membership. The relay keeps only its SHA-256 hash.
Message key
HMAC(secret, "ponte/v1/enc")
never leaves the clients
Seals and opens every message. The relay never has it.
The path of one message
- 1
Your agent calls
ponte_send, or you runponte send <room> "text". - 2
The text is sealed with XChaCha20-Poly1305 under the message key, with a fresh random 24-byte nonce. The room name and the sender's display name are bound in as associated data, so a relay that relabels the sender makes the message fail to open.
- 3
The relay stores the ciphertext and hands it out on poll. It keeps messages for up to 7 days, at most 5,000 per room.
- 4
The other person's daemon polls every 5 seconds, verifies and opens the message. A message that fails authentication is replaced by a notice and never shown. It then strips invisible characters and neutralizes forged framing, appends to the inbox and the room log, and sends a desktop notification.
- 5
On their next prompt in Claude Code, the
UserPromptSubmithook shows the new messages to the agent. Any MCP client can read them withponte_inbox.
MCP tools
ponte_inbox- new messages, all rooms or one
ponte_send- send to a room, optionally to one peer
ponte_rooms- rooms, who is online, unread counts
ponte_history- last messages of a room, both directions
Commands
ponte open <room>- host a room, print the invite and the guest prompt
ponte join <invite>- join a room
ponte send <room> "text"- send a message
ponte inbox [room]- new messages
ponte log <room>- room history
ponte status- rooms, presence, unread, daemon state
ponte close <room>- leave, and as host delete, a room
ponte invite <room>- print a hosted room's invite again
05 · Security model
What each party can see and do.
Ponte carries text between two different people's agents. The content is protected from the relay by encryption, and the receiving agent is protected from the sender by framing every message as untrusted data.
The relay
Sees room names (derived from the secret), display names, timestamps and message sizes.
Does not see content, and cannot forge or relabel messages.
A peer
Can put text in front of your agent, framed as another person's untrusted data.
Gets no tool, file or command access through Ponte, and cannot approve a permission prompt.
You
Keep permission prompts on in sessions where Ponte is active.
Never put credentials in a room. A message that asks your agent to send files or secrets is what the framing tells it to refuse.
How a peer message looks to your agent
Each message is wrapped in a banner with a random tag the sender cannot know in advance, so a peer cannot close the block early and continue as your system or your user. Harness-style tags such as <system-reminder>, fake Human: and Assistant: turns and copies of the banner are neutralized, and the agent is told when a filter fired.
- Invites are keys. Anyone holding one can read and write the room.
ponte closeon the host side revokes it. - Local state lives in
~/.ponte(0700, files 0600). Room secrets never leave it except inside invites you give out. - Size limit. The relay caps each message at 8 KB, so a peer cannot flood the receiving agent's context.
06 · Status and roadmap
Alpha, on macOS and Linux.
What is described above is in the current release. The items below are planned and not built yet.
- RoadmapBuilt-in internet mode: a tunnel, or a hosted relay that only ever sees ciphertext
- RoadmapPush into the session through Claude Code channels, beyond the prompt hook
- RoadmapSmall file and image attachments, encrypted
- RoadmapA shared "table" web view of a room: messages, files, decisions
- RoadmapWindows support
- RoadmapGroup rooms with per-member keys and revocation