Catalog PyPI
PACKAGE EXPLORERView in registry

agent-wormhole

PyPI

Secure ephemeral channels for AI agent communication

agentaiclaudecommunicationencryptedephemeralwormhole
Versions collected1
Direct dependencies5From release 0.2.1
Last observed21 Oct, 08:58 UTC

README

Version 0.2.1 documentation

agent-wormhole

A Claude Code session on your laptop can hand a file, a message, or a secret to a Claude Code session on another machine, sealed end to end so only the two of them can read it. Built on persistent secp256k1 identities, Nostr NIP-17 gift-wrapped DMs, and magic-wormhole for one-time pairing and bulk file transfer.

demo

agent-wormhole is for agent collaboration that outlives a single terminal. Pair once, give each peer a name, and then agents can send context to each other as they work: the branch they are on, what they changed, logs, test output, screenshots, config snippets, or a file that needs review.

What you'd use it for

  • Two people working on the same project, each with their own agent, sharing implementation notes, test fixtures, local repro steps, and review feedback without pasting everything through chat.
  • One person coordinating agents on two machines: for example a local laptop agent driving the UI while a cloud or Linux box agent runs backend jobs, GPU tasks, browser tests, or long-running experiments.
  • Parallel worktree sessions coordinating who edits what, and handing off context so the next session picks up where the last one left off.
  • Getting a second opinion from another Claude running with a different model or prompt, and pulling the review back into the current session.
  • Moving an API key, config file, or one-off artifact between machines, sealed end to end, addressable by peer name after first contact.

Quickstart

Install:

uv tool install agent-wormhole
# or
pip install agent-wormhole

A persistent keypair is created on first use at ~/.agent-wormhole/identity.key (mode 0600). See it:

$ agent-wormhole whoami
pubkey: 7f3a…
relays: wss://relay.damus.io, wss://nos.lol, wss://relay.primal.net

First contact (pairing)

The /agent-wormhole skill drives this; the two sides exchange identity envelopes over two short magic-wormhole codes (one each direction) and each writes the other into its trust file:

# Machine A → reads code aloud
agent-wormhole identity-envelope | wormhole send --text -

# Machine B → with A's code
wormhole receive <code-A>   # prints A's envelope JSON
agent-wormhole trust <A-pubkey> alice --relays <relays>

# Then reverse so A trusts B too.

Steady state

Keep a listener running; it emits one JSON line per inbound message:

$ agent-wormhole listen
{"type":"text","from":"alice","content":"hi","received_at":1700000000}
{"type":"file","from":"alice","name":"report.pdf","saved_to":"/tmp/agent-wormhole/alice/files/report.pdf","size":4096,…}

Send by peer name:

agent-wormhole send alice "hello from laptop"
agent-wormhole send-file alice ./config.json

Manage trust:

agent-wormhole peers
agent-wormhole untrust alice

Using it from Claude Code

agent-wormhole ships with a Claude Code skill. Install it:

agent-wormhole setup | claude

That symlinks ~/.claude/skills/agent-wormhole/SKILL.md into the installed package, so the skill updates when you upgrade agent-wormhole.

Then either session can run:

  • /agent-wormhole pair <peer-name> to add a new peer (the skill walks both sides through it).
  • /agent-wormhole to start the listener for an already-paired peer.

Outbound messages and files use agent-wormhole send / agent-wormhole send-file directly via Bash.

How it works

  1. Identity: each machine holds a long-lived secp256k1 keypair (~/.agent-wormhole/identity.key, 0600). The x-only BIP-340 pubkey is the addressable name on the Nostr network.
  2. Pairing: the skill runs wormhole send/receive to swap identity envelopes between two trusted hosts (one short code per direction). Each side calls agent-wormhole trust to record the peer.
  3. Text messages: NIP-44 v2 encryption + NIP-17 three-layer gift-wrap (rumor → seal signed by sender → gift wrap signed by an ephemeral key). Relays see only kind=1059 events tagged for the recipient. Sender identity is hidden from the relay.
  4. File transfer: send-file spawns a wormhole send subprocess, posts the negotiated code in an encrypted file-offer DM, and the recipient's listener auto-invokes wormhole receive (transfer authenticated by magic-wormhole's PAKE).
  5. Relay pool: the listener and sender connect to N relays concurrently, dedupe events by id, and reconnect with backoff on disconnect.

Configuration

Relay list resolution order: AGENT_WORMHOLE_RELAYS env var (comma-separated) → ~/.agent-wormhole/config.json ({"relays":[…]}) → bundled defaults (damus, nos.lol, primal).

The wormhole CLI must be on PATH; it ships with the magic-wormhole Python dep.

Security

  • Identity keys never leave their machine. Losing the keyfile means re-pairing with every peer.
  • Messages are NIP-44 v2 (ChaCha20 + HMAC-SHA256, HKDF over ECDH x-coord). All known canonical test vectors pass.
  • NIP-17 gift-wrap hides the sender from the relay. The recipient's pubkey is necessarily visible to the relay (it's used as the #p subscription filter); run your own relay or trust the chosen relay set's anonymity properties if you need stronger anonymity.
  • File transfer uses magic-wormhole's PAKE handshake; only the negotiated short code (delivered over the encrypted DM) can complete the transfer.

License

MIT

Downloads & popularity

2downloads
1-day window · source-reported counts20 Oct 2026
157.50
2026-07-23: 5 · observed 2026-10-21T11:16:36.7461375Z · period 2026-07-23–2026-07-232026-07-24: 8 · observed 2026-10-21T11:16:36.7461375Z · period 2026-07-24–2026-07-242026-07-27: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-07-27–2026-07-272026-08-02: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-02–2026-08-022026-08-03: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-03–2026-08-032026-08-04: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-04–2026-08-042026-08-05: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-05–2026-08-052026-08-06: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-06–2026-08-062026-08-09: 8 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-09–2026-08-092026-08-12: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-12–2026-08-122026-08-14: 4 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-14–2026-08-142026-08-15: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-15–2026-08-152026-08-17: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-17–2026-08-172026-08-21: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-21–2026-08-212026-08-23: 5 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-23–2026-08-232026-08-24: 5 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-24–2026-08-242026-08-25: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-25–2026-08-252026-08-28: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-28–2026-08-282026-08-31: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-08-31–2026-08-312026-09-01: 3 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-01–2026-09-012026-09-05: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-05–2026-09-052026-09-07: 4 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-07–2026-09-072026-09-08: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-08–2026-09-082026-09-09: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-09–2026-09-092026-09-13: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-13–2026-09-132026-09-14: 6 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-14–2026-09-142026-09-16: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-16–2026-09-162026-09-19: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-19–2026-09-192026-09-21: 14 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-21–2026-09-212026-09-22: 4 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-22–2026-09-222026-09-23: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-23–2026-09-232026-09-26: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-26–2026-09-262026-09-27: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-27–2026-09-272026-09-28: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-28–2026-09-282026-09-29: 6 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-29–2026-09-292026-09-30: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-09-30–2026-09-302026-10-01: 15 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-01–2026-10-012026-10-02: 3 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-02–2026-10-022026-10-03: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-03–2026-10-032026-10-06: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-06–2026-10-062026-10-07: 6 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-07–2026-10-072026-10-09: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-09–2026-10-092026-10-10: 12 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-10–2026-10-102026-10-12: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-12–2026-10-122026-10-13: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-13–2026-10-132026-10-14: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-14–2026-10-142026-10-15: 6 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-15–2026-10-152026-10-16: 1 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-16–2026-10-162026-10-17: 6 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-17–2026-10-172026-10-18: 4 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-18–2026-10-182026-10-20: 2 · observed 2026-10-21T11:16:36.7461375Z · period 2026-10-20–2026-10-20
23 Jul20 Oct

pypistats · 51 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-20 – 2026-10-2022026-10-21T11:16:36.7461375Z
2026-10-18 – 2026-10-1842026-10-21T11:16:36.7461375Z
2026-10-17 – 2026-10-1762026-10-21T11:16:36.7461375Z
2026-10-16 – 2026-10-1612026-10-21T11:16:36.7461375Z
2026-10-15 – 2026-10-1562026-10-21T11:16:36.7461375Z
2026-10-14 – 2026-10-1412026-10-21T11:16:36.7461375Z
2026-10-13 – 2026-10-1322026-10-21T11:16:36.7461375Z
2026-10-12 – 2026-10-1222026-10-21T11:16:36.7461375Z
2026-10-10 – 2026-10-10122026-10-21T11:16:36.7461375Z
2026-10-09 – 2026-10-0922026-10-21T11:16:36.7461375Z
2026-10-07 – 2026-10-0762026-10-21T11:16:36.7461375Z
2026-10-06 – 2026-10-0612026-10-21T11:16:36.7461375Z
2026-10-03 – 2026-10-0312026-10-21T11:16:36.7461375Z
2026-10-02 – 2026-10-0232026-10-21T11:16:36.7461375Z
2026-10-01 – 2026-10-01152026-10-21T11:16:36.7461375Z
2026-09-30 – 2026-09-3022026-10-21T11:16:36.7461375Z
2026-09-29 – 2026-09-2962026-10-21T11:16:36.7461375Z
2026-09-28 – 2026-09-2822026-10-21T11:16:36.7461375Z
2026-09-27 – 2026-09-2712026-10-21T11:16:36.7461375Z
2026-09-26 – 2026-09-2612026-10-21T11:16:36.7461375Z
2026-09-23 – 2026-09-2312026-10-21T11:16:36.7461375Z
2026-09-22 – 2026-09-2242026-10-21T11:16:36.7461375Z
2026-09-21 – 2026-09-21142026-10-21T11:16:36.7461375Z
2026-09-19 – 2026-09-1922026-10-21T11:16:36.7461375Z
2026-09-16 – 2026-09-1612026-10-21T11:16:36.7461375Z
2026-09-14 – 2026-09-1462026-10-21T11:16:36.7461375Z
2026-09-13 – 2026-09-1322026-10-21T11:16:36.7461375Z
2026-09-09 – 2026-09-0912026-10-21T11:16:36.7461375Z
2026-09-08 – 2026-09-0812026-10-21T11:16:36.7461375Z
2026-09-07 – 2026-09-0742026-10-21T11:16:36.7461375Z
2026-09-05 – 2026-09-0522026-10-21T11:16:36.7461375Z
2026-09-01 – 2026-09-0132026-10-21T11:16:36.7461375Z
2026-08-31 – 2026-08-3112026-10-21T11:16:36.7461375Z
2026-08-28 – 2026-08-2812026-10-21T11:16:36.7461375Z
2026-08-25 – 2026-08-2512026-10-21T11:16:36.7461375Z
2026-08-24 – 2026-08-2452026-10-21T11:16:36.7461375Z
2026-08-23 – 2026-08-2352026-10-21T11:16:36.7461375Z
2026-08-21 – 2026-08-2112026-10-21T11:16:36.7461375Z
2026-08-17 – 2026-08-1722026-10-21T11:16:36.7461375Z
2026-08-15 – 2026-08-1522026-10-21T11:16:36.7461375Z
2026-08-14 – 2026-08-1442026-10-21T11:16:36.7461375Z
2026-08-12 – 2026-08-1212026-10-21T11:16:36.7461375Z
2026-08-09 – 2026-08-0982026-10-21T11:16:36.7461375Z
2026-08-06 – 2026-08-0612026-10-21T11:16:36.7461375Z
2026-08-05 – 2026-08-0522026-10-21T11:16:36.7461375Z
2026-08-04 – 2026-08-0422026-10-21T11:16:36.7461375Z
2026-08-03 – 2026-08-0312026-10-21T11:16:36.7461375Z
2026-08-02 – 2026-08-0212026-10-21T11:16:36.7461375Z
2026-07-27 – 2026-07-2722026-10-21T11:16:36.7461375Z
2026-07-24 – 2026-07-2482026-10-21T11:16:36.7461375Z
2026-07-23 – 2026-07-2352026-10-21T11:16:36.7461375Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.2.131 May 20265

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

PENDING
noncuro/agent-wormhole

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 21 Oct, 08:58 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:28ae18ff6089b7231f84d3798d9512d9f26cfce14e9151bbcec38c64dce28d08