Skip to content

Repository files navigation

PrivaMesh logo

PrivaMesh

A serverless, end-to-end encrypted messenger.

Trust math, not companies.

Download on the App Store Platform Swift E2E

Get it on the App Store · privamesh.org · Support


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.

Screenshots

Privacy by default — Double Ratchet key per message and one-time addresses No servers, seriously — nothing central to hack or coerce On-device security — keys behind Face ID, disappearing messages, signed contacts End-to-end encrypted chat Your chats — names and nicknames, no phone numbers A private social graph — your connections, visualised privately

Private by design

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.

Encryption

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 with AES-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.

Metadata privacy

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.

Anti-MITM discovery

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.

Security model

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.

Membership

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.

Tech

  • 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/simulator

Never commit private keys or API secrets.

Install

PrivaMesh is available on the App Store for iPhone and iPad:

apps.apple.com/app/privamesh-messenger

Support

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.


Describes the system as implemented.