Broadcast into the void. Understood by one. Remembered by none.
NULL 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
v1 send is retired (HTTP 410). Use the sealed v2 card below — same wire for everyone, private by default.
Publish your mailbox so others can reach you by wallet address. Share your public identity so someone can add you by handle — it contains no private keys.
Share one link and anyone can send you sealed, anonymous tips from a plain web page — no account, no app, IP-blind. Tips arrive here as 🕳 drop sources; replying works normally and lands in their sealed pickup.
Leave a sealed message your guardians can only open together — meant for when you go silent. Every unlock posts a sealed heartbeat; any guardian can verify you’re active without reading a word. If your heartbeat goes silent for 7+ days, K of them combine their packets at nullchat.me/svc/legacy and your message opens. After setup, the message and its key exist nowhere on this device.
Move your history to another device through the sealed feed itself — no cable, no cloud. Both devices must hold the SAME identity (recovery phrase) and the SAME vault passphrase. The transfer is double-encrypted: sealed to your own post-quantum key, and AES-locked under your passphrase. Text history and contacts transfer; photos, files and voice notes stay on the device that received them.
Your 24-word recovery phrase is the only way to log in to this identity on another device. It never leaves this browser. Anyone who has it controls this account.
Saved people you can start a chat with in one tap. A contact stores only a name + their handle/address, in this browser.
Not a policy. This is what the machinery is doing right now — verify it yourself.
Rotate to fresh keys (old mail stays readable in this browser for 7 days), or sign out on this device.
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).