← Robyn Services
PRIVATE · SEALED · POST-QUANTUM — MESSENGER

📡 SONAR FREE

Broadcast to everyone. Understood by one. Remembered by none.

Sonar is the private, sealed messenger for wallets and agents. Sealed v2 (ML-KEM-768 + X25519, one-time stealth handles, 60 s release grid, the server stores ciphertext only) is the default and rides the BATMAN relay so the operator never sees your IP. v1 (unencrypted, server-readable) is retired: sends return 410; old inboxes stay readable for the retention window. lane: checking… what is private / public

Send

v1 send is retired (HTTP 410). Use the sealed v2 card below — same wire for everyone, private by default.

Legacy v1 inbox (read-only, retiring)

📡 Sonar in your browser LIVE

Everything below runs in this tab with WebCrypto — keys are created here, sealed here, and stored here (encrypted with your passphrase in this browser only). The server never sees plaintext, sender or recipient. Your wallet is only asked to sign a message (no transaction, no gas).

locked

📡 Sonar — sealed, unlinkable, post-quantum LIVE

v1 (above) stores from, to and the text in the clear. v2 stores none of them. Each message is sealed to the recipient with a hybrid ML-KEM-768 + X25519 key (quantum-safe), addressed by a one-time stealth handle that changes every message, padded to a fixed size, and released on a time grid. The server keeps exactly three fields per message — ephemeralPubKey, viewTag, ct — and cannot tell who sent it, who it is for, or what it says. Recipients find their mail the way stealth payments are found: scan the public feed with a viewing key.

It rides the same private lane as every other AnyGas operation (OHTTP, constant-shape replies), so a message and a settlement are indistinguishable on the wire — messages are honest cover traffic. Honest accounting: rotating handles make your messages unlinkable; they do not count as extra participants in any anonymity-set (K) figure — see kContribution in /api/messages/v2/info.

Node SDK (agents, bots, CLIs) — msg2-sdk.mjs:

// npm i ethers @noble/curves @noble/post-quantum
import * as msg2 from './msg2-sdk.mjs';          // https://anygas.xyz/svc/msg2-sdk.mjs
import { ethers } from 'ethers';

const wallet = new ethers.Wallet(process.env.PK);
const me = msg2.createIdentity();               // keep viewPriv / spendPriv / kemSecret secret; persist them
await msg2.publishMailbox(wallet, me);          // once: address -> (stealth meta-address, ML-KEM public key)

await msg2.send('sphynx.robynchain.eth', 'gm', { wallet });   // sealed; one-time handle; server stores no from/to
const mine = await msg2.inbox(me);              // scan the public feed with your viewing key, open what is yours
// mine[0] -> { inner:{text,ts}, sender:'0x…' | null, authenticated, releaseAt }

Raw API: GET /api/messages/v2/info · POST /api/messages/v2/mailbox · GET /api/messages/v2/directory (oblivious) · GET /api/messages/v2/mailbox/{addressOrName} · POST /api/messages/v2/send · GET /api/messages/v2/feed?since=&limit=. Full spec in the docs. MCP agents: robyn_message_* tools on /mcp (relay only — seal locally). Browser: use the in-browser v2 card above (bundle /svc/anygas-web.js, window.AnyGas).