Private messages.
Native bitcoin.

End-to-end encrypted group chat with self-custodial Bitcoin and Lightning built in. Content-blind, graph-blind, and identity-optional by construction, not by policy.

See what our server can read Run your own

METADATA, STATED PLAINLY

What every observer can and cannot learn

Most apps tell you they are private. This is the exact boundary, published the same way it lives inside the code as a build-time invariant. If any row stopped being true, the build would fail.

Verified against live traffic; the same table ships inside the app's Privacy screen.

ObserverLearnsNever learns
Our delivery server Envelope timing and bucket sizes; mailbox and per-epoch channel existence; the APNs push token to mailbox link; transient IP (24h rate-limit counters only) Content, names, identity keys, the sender of any message, the contact graph, cross-epoch group linkage, anything about payments
Blob store Ciphertext sizes, access timing Content, ownership
Apple / APNs Push timing, device token Content, sender, counterpart
Lightning provider Payment amounts, timing, node identity, swap metadata Who the counterparty is socially, message context
Removed group member Nothing after the removal epoch Everything after removal
Current group member Everything in-group (the social boundary) Nothing hidden from members by design

HOW IT WORKS

Standards where they exist, no invented crypto

Three ideas do the work. Each is a reviewed standard or a self-custodial wallet, wired together so neither the server nor the payment rail sees the social side.

Messaging Layer Security

Group chat runs on MLS (RFC 9420) via OpenMLS. Forward secrecy and post-compromise security, group-native, so adding and removing people rekeys the conversation.

Rotating pseudonymous channels

Every group commit rotates the channel identifier the server sees. It cannot cheaply link this epoch to the last, so it never builds a persistent picture of who is in which group.

One phrase, two planes

A single recovery phrase restores your wallet and your messaging identity through separate derivations that share no key material. Lose the phone, keep everything.

PAYMENTS

Send money the way you send a message

Self-custodial Bitcoin over Lightning and USDt on Liquid, with no payment code on any server we run. Reusable payment codes are exchanged inside the encrypted conversation, so a friend can be paid even while offline.

PER TRANSACTION

21,000 sats

Amounts render in sats and USDt. Fees over two percent trigger a warning before you confirm.

SPLIT A BILL

Even splits, settled in-thread

Shared tabs reconcile on every device with a conflict-free merge. No server keeps the ledger.

VERIFY A CONTACT

418 22 · 90 631

Compare a safety number in person or by QR to confirm you are talking to the right person.

SELF-HOST

Do not trust us. Run the server yourself.

The delivery service is a single container that is dumb by design: it stores sealed envelopes and forwards them. A stranger can stand one up in under half an hour.

# clone, set secrets, bring up the stack
git clone <repo> && cd signet
cp .env.example .env
docker compose up -d
curl http://localhost:8080/healthz   # => ok