PrivaMesh is a private messenger built for people who don't want their conversations logged, mined, or sold. No phone number. No email. No profile. You sign up with nothing — your identity is a key generated on your device. Everything personal — your identity, contacts, and chat history — stays local to your phone and is protected by the iOS Keychain. Your keys never leave your device.
Everything private is local to the device. There is no account database and nothing about you to leak.
| What | Where it lives |
|---|---|
| Identity, contacts, chat history | your device only — SwiftData + Keychain, never transmitted |
| Private keys & recovery phrase | your device only — iOS Keychain, device-only, biometric-lockable |
| Message delivery | a decentralized, serverless transport carrying only ciphertext |
Sign up with nothing at all — no phone number, no email, no personal data. Your identity is a key you own, stored in the iOS Keychain and lockable with Face ID / Touch ID.
The cryptographic core is a well-established design: X3DH for the asynchronous handshake, the Double Ratchet for ongoing messages — the same family of protocols trusted by the world's leading secure messengers.
- Key agreement — X3DH over Curve25519. The first message is self-contained (carries the sender's identity + ephemeral keys), so a recipient can decrypt a first message without any prior server-stored state.
- Per-message keys — Double Ratchet:
KDF_RK = HKDF-SHA256,KDF_CK = HMAC-SHA256, payload sealed withAES-256-GCM(the ratchet header is bound as Associated Data). A fresh key per message → forward secrecy and post-compromise security. - Padding — plaintext is padded to fixed buckets before encryption, so ciphertext length doesn't leak message length.
Code:
Core/PrekeyBundle.swift(X3DH),Core/DoubleRatchet.swift,Core/CryptoBox.swift.
End-to-end encryption hides content. PrivaMesh adds independent layers to also hide who, when, and how.
- Stealth addresses — each conversation derives a one-time delivery address per message from the X3DH shared secret, so an outside observer sees unrelated single-use addresses with no visible link to either participant.
- Cover traffic (opt-in) — the client can emit decoy messages at randomized intervals — full, valid encrypted messages that advance the ratchet and are silently dropped on receipt — breaking timing correlation.
- Unlinkable accounts — messaging keys are generated per account and stored device-only; multiple accounts on one device are cryptographically unlinkable.
Finding someone by nickname uses a self-authenticating registry instead of a trusted key server. A published prekey bundle is signed so its messaging keys are tied to the identity that posted them; a client verifies the signature before trusting any discovered bundle, so nobody can inject a forged identity for a nickname they don't control.
Code:
Core/OnChainDiscovery.swift,Core/PollingService.swift.
What an adversary cannot do. Without your device keys, no party can read message content or forge a discovered identity (signatures are verified). There is no central store to breach.
Forward secrecy. Messaging keys and ratchet sessions are random and device-local. This delivers forward secrecy and deniability — and means restoring an account from its recovery phrase recovers your identity and contacts, not past message plaintext (that stays undecryptable without the original ratchet state). A deliberate trade-off, matching comparable secure messengers.
Messaging is metered. A free account carries no sponsored allowance, because every message is a Solana transaction with a real network fee that the fee worker pays. PrivaMesh+ ($5.99/month, via Apple In-App Purchase) sponsors 1,200 messages a month and adds a verification badge; Pro ($9.99) sponsors 2,000. Consumable packs of 100, 500 and 1,500 messages are also available and do not expire. All delivery and infrastructure costs are covered by us, the developer — users never buy, hold, or spend any cryptocurrency, and there is no wallet in the app.
- SwiftUI + SwiftData, iOS 26.5+ (App Store minimum; the post-quantum handshake needs iOS 26)
- CryptoKit — Curve25519 X3DH, HKDF/HMAC-SHA256, AES-256-GCM; TweetNacl for ed25519 signatures
- iOS Keychain (device-only, biometric-lockable) for the recovery phrase + messaging keys
open privamesh.xcodeproj # scheme: privamesh → run on device/simulatorNever commit private keys or API secrets.
PrivaMesh is available on the App Store for iPhone and iPad:
apps.apple.com/app/privamesh-messenger
Questions, bug reports and account help: privamesh.org/support or email privamesh@proton.me.
We never ask for your recovery phrase. Anyone who does is trying to steal your account.






