Tesseract
Private messaging you can actually audit.
What it is
Tesseract is an iOS messenger built for people who don't want to trust marketing copy. Messages are end-to-end encrypted between friends. The relay server holds ciphertext just long enough to deliver it, then forgets. No accounts, no phone numbers, no directories, no analytics.
The whole thing — the iOS app, the notification service extension, the Go relay, the crypto — is open source on GitHub. If a claim below sounds wrong to you, the file is right there, one click away.
How the crypto actually works
- Identities — each install generates an Ed25519 signing keypair and an X25519 encryption keypair. Private keys live in the iOS Keychain with device-lock protection and never leave the device.
- Messages — every message between two friends is sealed with AES-256-GCM. The AEAD key is derived per-pair via X25519 ECDH → HKDF-SHA256 with a domain-separator tag. Includes a monotonic
sentAtnonce so replays are rejected. - Media — photos, videos, and GIFs are encrypted with a fresh AES-256-GCM key per blob. That blob key is wrapped to the recipient's pair channel (same X25519 ECDH). The relay stores only the sealed ciphertext, deletes it after the first successful download, and enforces a 24-hour safety TTL.
- Uploads — every blob upload is signed with the sender's Ed25519 key over the tag
tesseract-blob-upload-v1plus a timestamp and content-length. Sixty-second replay window. - Push — the relay knows only a device token and a public identifier. Push payloads carry no message content. On-device, the Notification Service Extension rewrites the alert using a template you picked; the relay never sees the visible text.
- At rest — persisted message history is written with iOS
completeFileProtection(unreadable while the device is locked) and excluded from iCloud/iTunes backup.
Full details, including the exact function names and file paths, live in SECURITY.md.
Please audit this
The point of publishing the source is that you don't have to take our word for anything. A few ways to check:
- Read the crypto module. Start with
ios/SecretR00M/V2/Network/V2MessageCrypto.swift(per-message sealing) andV2MediaCrypto.swift(media). Both files are under 200 lines and use Apple'sCryptoKit— no rolled-your-own primitives. - Ask an AI to review it. Point Claude, GPT, Gemini, or any code-reading model at the repo and ask "Are the crypto and transport layers safe? What could go wrong?" That's a legitimate use, and the codebase is small enough to fit in a single review context.
- Rebuild the relay. The Go relay is a single binary;
cd relay-v2 && go build ./...reproduces it exactly. Compare against the deployed server's behavior. - Report anything. Security issues, questionable design, worrying dependencies — open an issue or reach out via Contact. Serious findings will be publicly credited unless you ask otherwise.
What the server actually stores
- Your Ed25519 + X25519 public keys (needed to route mail to you).
- Your APNs device token (needed to wake your phone when mail arrives).
- Queued ciphertext for offline recipients — deleted the moment their phone receives it, plus a 7–30 day safety TTL if it never does.
- Encrypted media blobs — deleted on the first successful download, hard 24-hour ceiling.
- Short-lived, single-use invite codes.
Not stored: message plaintext, media plaintext, contact lists, delivery history, IP logs beyond what any web server ephemerally emits, analytics, telemetry, crash reports tied to identity.
Details: Privacy Policy.
How to reach the team
For security issues: use the GitHub security advisories flow so it's tracked and can be embargoed if needed. For everything else, contact us here.