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.
| Observer | Learns | Never 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.