Wallet-to-wallet messages secured by ECDH P-256 key exchange and AES-256-GCM encryption. Your keys never leave your browser. Proofs live on Bitcoin.
satoshi.btc
π E2E encrypted
Messages relay instantly via Redis and Server-Sent Events. Proofs are anchored permanently to Bitcoin via OPNet smart contracts.
7-day message TTL in Redis Β· Messages delivered in real-time via EventSource
Immutable receipt on-chain Β· verifyReceipt(hash) β bool β independently auditable
ECDH P-256 key agreement + AES-256-GCM authenticated encryption. The relay server never receives or stores plaintext β not even the operators can read your messages.
Alice and Bob each generate a P-256 keypair locally in the browser using Web Crypto API. Private keys are stored as JWK in localStorage. Public keys are uploaded to the ProfileRegistry smart contract on Bitcoin L2.
Alice fetches Bob's public key from the on-chain ProfileRegistry. Using ECDH, she derives a shared secret from her private key and Bob's public key β the shared secret is never transmitted.
The shared secret seeds an AES-256-GCM cipher. Each message gets a cryptographically random 12-byte nonce. The relay stores only {ciphertextHex, nonceHex} β it never sees plaintext.
Encrypted payloads are POSTed to /api/messages/send and stored in Redis (inbox:{address}). Bob subscribes to /api/messages/stream via Server-Sent Events and receives new messages in real-time.
Bob derives the same shared secret using his private key + Alice's public key (ECDH is symmetric). He decrypts each ciphertext with the stored nonce. The relay never saw plaintext β zero knowledge relay.
Key Exchange Diagram
Two AssemblyScript smart contracts deployed to OPNet (Bitcoin L2) handle identity registration and immutable message receipt proofs.
AssemblyScript / OPNet
Registers wallet identities with usernames and ECDH P-256 public keys (65 bytes). Enables wallet-to-wallet contact discovery and key lookup without a centralised server.
AssemblyScript / OPNet
Anchors message hashes to Bitcoin permanently. Any party can call verifyReceipt(hash) to confirm a specific message existed at a given block β immutable, censorship-resistant proof.
When a message receipt is anchored via anchorReceipt(), the chat view shows this badge beneath the message with a link to the on-chain transaction. Anyone can independently verify the message hash existed at that block height β no trust required.
Five themes, four background textures, and six notification sounds β all configurable instantly from the settings panel.
Pure silence. Very mysterious. Very encrypted.
Pavlov spent years conditioning you for this exact moment.
defaultThe satisfying swoosh of a blue double-tick.
Hello, is it 2005? Your crush just sent you a Nudgeβ’
Tom says hi π β he was always your first friend.
Crisp, efficient, vaguely European.
Browser autoplay policy requires one user interaction before sound previews work.