SILNT

Metadata Honesty Table · Fantom Tech Labs

SILNT is designed so that content is unreadable to everyone but its intended recipients. But no system hides everything — a server still routes bytes, a network still carries them. Rather than claim perfection, we publish exactly what each observer can and cannot learn. This table is a build-time invariant: the iOS app's Privacy screen links to it verbatim, and it is published verbatim here.

ObserverLearnsNever learns
Our DS Envelope timing / bucket sizes (five buckets; the 64 KiB one appears only on post-quantum handshakes of larger groups); mailbox & per-epoch channel existence; APNs token ↔ mailbox link; transient IP (≤24 h counters); mailbox ↔ identity key for every mailbox that publishes KeyPackages — which every device does, so peers can add it to a group from the directory: a KeyPackage is a plaintext MLS structure whose credential carries the long-term identity key, the DS stores it as-is, and anyone who knows the mailbox id can fetch one — so that link is public, not merely known to the DS; which mailbox reserved (uploaded) each blob, and its size (the per-mailbox blob quota); opt-in payable-handle → mailbox + identity key + BOLT12 offer (only if the user claims a @handle, which is a public address by design), and that handle's public, append-only rebinding history (when its identity key or mailbox changed), served to anyone as the key-transparency log; opt-in group invite links: the invite id, redemption timing, and a bundle it cannot open — but a join request through such a link shows it the link id, the joiner's mailbox and KeyPackage (identity key) and the host mailbox that admits that link Content, message contents, sender of any message, display names, payment amounts; the contact graph as such — it sees that some client fetched a mailbox's KeyPackage or posted to a mailbox (transient IP and timing), never which identity did; which epochs' channels belong to one group (every channel frame is sealed under a per-epoch key — only timing correlation remains); which message, thread or group a blob belongs to, or who fetched it beyond transient IP
Blob store Ciphertext sizes (quantized to 256 KiB), access timing, the mailbox that reserved each blob (per-mailbox quota) Content, media keys (they travel only inside the encrypted group), which message or group a blob belongs to, who fetched it beyond transient IP
Apple / iCloud (backup) That backup files exist — one per identity, named by a salted hash of the identity key — their ciphertext sizes, sync timing Content, names, contacts, amounts — the SGBK01 container is sealed under the recovery-phrase key on-device (Argon2id → XChaCha20); iCloud holds ciphertext only
Apple / APNs Push timing, device token Content, sender, counterpart
Breez / LSP Payment amounts, timing, node identity, swap metadata (bitcoin and USDt alike) Who the counterparty is socially, message context
SideSwap The address paid, the amount, and the wallet's coins — only for a USDt send where the user turned on paying the network fee in USDt and held no bitcoin for it Anything at all otherwise: the default USDt path never contacts it
MoonPay (opt-in buy) Full KYC identity, card details, purchase amount, IP — a regulated fiat on-ramp opened in a Safari sheet only when the user chooses to buy Messaging identity, contacts or content; the wallet seed (funds settle by chain swap into the self-custodial wallet, so MoonPay never holds keys)
Removed group member Nothing after removal epoch
Current group member Everything in-group (social boundary)

“Never learns” items are guaranteed by construction — by the cryptography and the protocol, not by our policy or good intentions. Where an observer necessarily sees something (timing, sizes, an opt-in public handle), we list it plainly rather than omit it.