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

📡 NULL FREE

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

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)

📡 NULL in your browser LIVE

NULL.
Sealed, unlinkable, post-quantum messaging. Keys are made and kept in this browser — the server never sees who you are, who you talk to, or what you say.
🔒 Everything runs in this tab with WebCrypto. Your keys never leave this browser; the server only ever sees padded ciphertext over the private lane.
NULL.
private messenger
Watching for sealed mail…↑ older
NULL.
Suite · one unlock
Account & Keys
your NULL identity
your NULL address

NULL Plus

FREE
Passes on hand: — spent automatically when you send a photo or file.
Buy in bulk →
How passes work & who can get them
Free for everyone. Every NULL account can claim 20 passes a day — they're anti-spam, not a paywall.
Unlinkable. A pass is a blind-signed token: the server checks it's valid but can never tell which account it came from. That's how NULL limits abuse and charges without knowing who you are.
Spent automatically. You never redeem them by hand — sending an attachment uses one per chunk. Plain text messages are free and use none.
Buy in bulk mints a big batch of the same tokens at once, for heavy use.

Reach & sharing

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.

NULL Drop — your anonymous tip line

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.

Legacy — dead-man’s switch

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.

Devices

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.

Backup & recovery

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.

Contacts

Saved people you can start a chat with in one tap. A contact stores only a name + their handle/address, in this browser.

Privacy — live posture

Not a policy. This is what the machinery is doing right now — verify it yourself.

checking…

Settings

Auto-refresh
Check for new messages automatically.
Desktop notifications
Alert me when a message arrives while this window is open but unfocused. A closed tab can't receive — NULL's server can't push to you without learning who you are.
Identify me by default
Pre-check "identify me to recipient" so chats thread.
Screen privacy
Blur messages when the app is hidden (app-switcher, other tabs).
Forward secrecy on by default
Every message is ratcheted under a fresh key, so a future key compromise can't unseal your past chats. Falls back to the standard sealed path (still post-quantum) whenever it can't safely engage — multi-device identities, an unacknowledged key change, or a contact without published keys.
Appearance
Dark by default. Your choice follows you across the whole NULL suite — messenger, Vault, Drop, Legacy.
Auto-lock
Require your passphrase again after inactivity.
Handedness
Put the thumb-zone nav and compose button on your dominant side (mobile).
NULL messenger · live · sealed · post-quantum

Security

Rotate to fresh keys (old mail stays readable in this browser for 7 days), or sign out on this device.

📡 NULL — 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).