Privacy Architecture

Last updated: 2026-09-12 · as of app version 1.0 (build 34)

"Your email body never leaves your device" is not a promise — it is a structure. This page lists exactly what MailMail sends where, and what the code makes impossible. The legal notice is the Privacy Policy.

At a glance

Mail providerNaver · Gmail · Outlook · IMAP(where your mail already lives) Your iPhoneBodies, summaries, passwords stay hereOn-device AI summary & translationKeychain (device-only)No server Apple WatchSummary cards only(no body) Wake-up signal (Worker)Receives: push token only iCloud (Pro, optional)Encrypted learning weights only direct TLS cards only token E2E encrypted body → serverno such path exists

MailMail has no server that stores or relays email. Your iPhone connects directly to your mail provider (Gmail, Outlook, Naver…), summaries and translations are produced by Apple's on-device models on the iPhone, and only summary cards cross to the watch. The one server we run is a wake-up beacon that tells the app "there may be new mail" — and all it knows is a push token.

1. What never leaves the device

DataWhere it livesProtection
Email bodiesLocal database on iPhone/iPad (SwiftData)Encrypted until first unlock (iOS file protection). Never sent to the watch, a server, or logs
AI summaries (headline, key points, labels)Local DB → watch cardGenerated on-device by Apple Foundation Models. No external AI API calls
TranslationsMemory onlyApple Translation (on-device) → discarded right after summarizing. Never stored
App passwords · OAuth tokensiPhone KeychainDevice-only (iCloud Keychain sync blocked). Never sent to the watch or a server
Sender · subjectLocal DB → watch cardThe watch card carries summary-card fields only (sender, subject, headline, received time, category, reply suggestions). It has no body field
Profile avatar photoApp-private folder on iPhone256px thumbnail only, original discarded. No backup, no sync
Personalization learning dataiPhone localSenders stored as hashed tokens only (no plaintext email). Pro sync ships weights and hashes, end-to-end encrypted
Look back retrospective (Pro)iPhone localThe input is not the body but the summaries already made (headline, category). The retrospective boundary type has no body field, and the summary itself is written by the on-device model

2. What leaves the device — the complete list

This is the entire set of outbound data. If it is not in this table, it is not sent.

ToWhatWhy
Your mail provider (Gmail, Naver, Daum, work IMAP)IMAP login, mail fetch, read/archive flags, and quick replies you choose to send (SMTP)Direct TLS connection to your own mailbox. We are not in the path
Microsoft (Outlook)OAuth sign-in, Graph API mail reads and reply sendsSame — direct. Tokens stay in Keychain
MailMail wake-up beacon (Cloudflare Worker){ token, env } — the APNs push token and environment, exactly two fieldsSends a content-free push about every 10 minutes so the app can sync in the background. Any extra key is rejected with 400
Same beacon (Outlook users)subscription ID, push token, environment, verification hashWhere Microsoft posts "new mail" notifications. No mail content included
Apple (App Store)Purchases and receiptsStoreKit. Verified on-device
Apple (iCloud, Pro, optional)Encrypted personalization profile blobKeeps your learning when you switch devices. Contents = weights, sender hashes, category affinity. Key lives in iCloud Keychain — we cannot decrypt it
Your own Reminders appExtracted to-do title + mail subjectPro feature, only when you tap. Never the body
Apple (iCloud Keychain)Personalization salt and encryption key (32 random bytes each)So your learning survives a device change. Apple end-to-end encrypted, so we cannot read it
Apple (Siri / Shortcuts)Headline, sender, counts, the search term you speakResults reach the system only when you ask for a briefing. For voice search, the words you speak pass through Siri into the app — the search itself runs on device. No body
Cloudflare (website)Launch sign-up email, language, timeOnly if you signed up on the web. Unrelated to the app; deleted after the launch notice

Verify it yourself: put the app behind Proxyman or Charles. The only requests to mailmail.app would be /v1/register and /v1/unregister (in the current build the beacon is off, so even those do not go out) (plus /v1/graph/* for Outlook), and their bodies contain nothing but a token string.

3. What we don't do

4. How the code enforces it

Enforced by types and link structure, not by policy — so it is hard to break by accident later.

5. Honest limits

Changelog

← MailMail home · Privacy Policy