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.
METADATA, STATED PLAINLY
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.
| Observer | Learns | Never 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
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.
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.
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.
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
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
Amounts render in sats and USDt. Fees over two percent trigger a warning before you confirm.
SPLIT A BILL
Shared tabs reconcile on every device with a conflict-free merge. No server keeps the ledger.
VERIFY A CONTACT
Compare a safety number in person or by QR to confirm you are talking to the right person.
SELF-HOST
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