Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Solo iOS Growth Diary — Vol. 3: Email-as-Sync (...

Solo iOS Growth Diary — Vol. 3: Email-as-Sync (Why SMTP Outlives iCloud)

SMTP turned 44 this year. iCloud Drive turned 15. So why are we still picking the youngest sync layer for our iOS memo apps? Vol. 3 of Solo iOS Growth Diary makes the case for Email-as-Sync — the way Captio quietly did from 2010 to 2020.

You'll get the Sync Layer Liability (SLL) score, three mail-first architecture patterns (Drop-Box, Mirror, Brain), OAuth gotchas across Gmail / iCloud Mail / Outlook / Yahoo, IMAP IDLE latency benchmarks from SimpleMemo's 2026-Q1 telemetry (312 ms median push vs. APNs at 1.8 s), the cost math at 1,000 paying users ($0 infra vs. $54 Firebase), and a 7-step playbook to ship mail-as-sync inside one week.

Anti-thesis for every claim: "Email is dead in 2026" (4.4 B users, 376 B emails/day disagrees); "Users want real-time" (Nielsen 1993 disagrees); "OAuth is too hard" (amortized cost math disagrees). Plus the honest scoreboard from 11 months in production: 0 lines of server code, 0 "I lost my memos" complaints across 4,318 users, 0 bytes lost during the App Store outage on 2026-02-08.

Part of the 12-week Solo iOS Growth Diary series — new deck every Tuesday 22:00 JST. Tech keywords: email memo app, mail-based notes, smtp sync ios, captio alternative, imap idle ios, MFMailComposeViewController, swift-smtp, SQLite FTS5, OAuth Gmail iOS, GIDSignIn, MailCore2, X-GM-RAW.

Follow: speakerdeck.com/simplememo · x.com/simplememofast

Avatar for SimpleMemo

SimpleMemo

May 26, 2026

More Decks by SimpleMemo

Other Decks in Programming

Transcript

  1. S O L O i O S G R O

    W T H D I A R Y VOL. 03 Email-as-Sync Why SMTP Outlives iCloud A mail-based notes playbook for solo iOS founders. SMTP since 1982 IMAP IDLE Mail-first iOS speakerdeck.com/simplememo · x.com/simplememofast · 2026-05-19
  2. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 02

    / 35 The 12-week promise 01 Battle-tested patterns From a solo iOS founder shipping in public. 02 Real numbers, no mythology Cost, latency, churn — measured and printed. 03 Anti-thesis every volume Three counter-arguments per topic. Survival > fashion. 04 Reproducible code Copy-paste over inspirational quotes.
  3. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 03

    / 35 Today's roadmap 1 The Sync Layer Problem Slide 04–06 2 SMTP — 44 years of uptime Slide 07–10 3 SLL: The math of "can't break" Slide 11 4 Three Mail-First Patterns Slide 12–15 5 Architecture & code Slide 16–19 6 Anti-thesis — three counter-punches Slide 20–22 7 Cost, privacy, weaknesses Slide 23–25 8 7-Step Playbook Slide 26–30 9 Honest Scoreboard Slide 31–32
  4. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 04

    / 35 If your sync layer dies, your app dies. So why are we always picking the youngest one?
  5. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 05

    / 35 A short history of sync 1971 First @-email (Tomlinson) 1982 SMTP RFC 821 1996 IMAP4 RFC 2060 2011 iCloud launch 2017 CloudKit Web Services 2024 iCloud Drive major outages 2026 Mail still works Amber = mail-protocol milestones. Mail is older than every iOS sync layer combined.
  6. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 06

    / 35 Captio's lesson: outlive your platform Captio (2010–2020) Email-yourself memo app for iPhone. One textbox, one Send button. Sync layer: SMTP. No backend, no database, no auth server. 10y lifespan 0 data loss events 0 backend servers 1 developer When the App Store pulled the binary in 2020, every memo was still safe — in Gmail, Yahoo, Outlook. Users didn't lose a single byte. Insight → if the data lives in mail, the app failing is not the same as the user failing.
  7. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 07

    / 35 Sync layer mortality (2020–2025) Layer Born Major outages 2024 Reported data-loss events Vendor lock iCloud Drive 2011 17 3 (sync corruption) Hard Firebase Realtime DB 2012 11 1 Hard Notion API 2018 9 2 Hard Dropbox 2008 4 0 Medium Self-host Postgres — your fault your fault Soft SMTP + IMAP (federated) 1982 / 1996 0 (protocol) 0 None Sources: status.apple.com (2024), status.firebase.google.com, status.notion.so, internal incident reviews. Protocol-level outage = no IETF-spec failure recorded.
  8. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 08

    / 35 Why SMTP doesn't break 44-year stable wire protocol RFC 821 (1982) → RFC 5321 (2008). Backwards compatible. Your 1985 mail server can still talk to your 2026 client. Federated by design No single vendor can take it down. Apple, Google, Microsoft, Yahoo, Fastmail, your VPS — all the same protocol. Asynchronous from day 1 Queue-and-retry is built into the spec. Network failure is the normal case, not an edge case. Universal client coverage Every OS, every device, every language has at least three mail libraries. You're never alone. No roadmap, no PM, no breaking change Nobody can ship a v2 that breaks your v1. The committee that could do it doesn't exist.
  9. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 09

    / 35 “ Pick the sync layer that can't break. — Solo iOS Growth Diary · Vol. 3
  10. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 10

    / 35 Reframe: what are you actually building? You're not building a notes app. You're building a thin iOS client over an existing, federated, decentralized data store with 4.4 B daily users and a 44-year track record. 4.4 B mail users worldwide (Litmus 2025) 376 B emails sent per day (Statista 2025) 99.3 % iOS users with ≥1 mail account (StatCounter) 44 y since SMTP RFC 821
  11. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 11

    / 35 Sync Layer Liability (SLL) — the math SLL = (vendor_lock × 3) + (years_young) + (proprietary_format × 2) − (provider_count) Lower is better. Negative = net-negative liability (the layer reduces your risk over time). iCloud Drive 18 Firebase RTDB 16 Notion API 15 Dropbox API 11 Self-host Postgres 8 SMTP + IMAP -2 0
  12. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 12

    / 35 Three mail-first patterns Drop-Box Write-only. MFMailComposeViewController → SMTP → memo@private W H Y Ship in 1 day. No auth. No server. Zero infra cost. Mirror Bidirectional. IMAP IDLE keeps an open connection to the user's mailbox. W H Y Real-time push. OAuth required. ~200ms median. Brain Append-only. 1 memo = 1 email. Provider handles full-text search. W H Y Gmail FTS in 87ms. 15 GB free. Storage scales infinitely.
  13. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 13

    / 35 Pattern 1 · Drop-Box (write-only) iOS App MFMailCompose ViewController Outbox (iOS) iOS Mail.app Outgoing queue SMTP relay User's provider Gmail / iCloud / … Mailbox memo@private. address P R O S • Zero backend, zero hosting cost • Zero auth — uses the device's mail account • Ships in one afternoon • Works on day-1 iOS, day-N iOS, every iOS • User can read memos in any mail client C O N S • Write-only — can't read back in-app • Each send shows the system compose sheet (one extra tap, but adds intent confirmation) • Provider rate limits on bulk send (~30/min) • No conflict resolution (none needed)
  14. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 14

    / 35 Pattern 2 · Mirror (bidirectional IMAP IDLE) iOS App URLSession + MailCore2 Mail server IMAP IDLE + APNs bridge Other clients Mail.app, Gmail web, etc. ⇄ ⇄ 312 ms Median push latency (IMAP IDLE) 7 d Refresh-token refresh cadence 1 conn Per device, kept alive Implementation: MailCore2 (open-source) for IMAP. Use UIBackgroundTaskIdentifier to keep IDLE alive briefly; provider-side push (Gmail API push, MS Graph subscriptions) for true background. Trade-off: bidirectional + real-time, but you now own OAuth refresh and connection state.
  15. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 15

    / 35 Pattern 3 · Brain — turn the mailbox into the database 1 memo = 1 email. The provider's mailbox is your indexed, replicated, free-tier database. ~120 KB Average size of a memo email (text + headers + base64 attach) 10,000 Memos in 1.2 GB 15 GB Gmail free tier per account 87 ms Gmail full-text search median (internal SimpleMemo telemetry) $0 Storage cost paid by the developer X-GM-RAW Gmail IMAP extension that exposes Gmail's full search syntax
  16. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 16

    / 35 Pattern matrix Property Drop-Box Mirror Brain Direction One-way Two-way Append-only Auth None OAuth OAuth Median latency 2–8 s (user tap) 312 ms 200 ms Search Provider only Provider + local Full-text (Gmail FTS) Conflict resolution N/A Last-write-wins on UID Append-only, no conflicts Backend infra $0 OAuth-refresh webhook OAuth-refresh webhook Ship-time (1 dev) 1 day 2 weeks 1 week When to choose MVP, v1 Pro tier Long-term default
  17. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 17

    / 35 Code · Drop-Box in 30 lines of Swift import MessageUI final class MemoSender: NSObject, MFMailComposeViewControllerDelegate { static let toAddress = "[email protected]" func send(body: String, presenter: UIViewController) { guard MFMailComposeViewController.canSendMail() else { return } let mvc = MFMailComposeViewController() mvc.mailComposeDelegate = self mvc.setToRecipients([Self.toAddress]) mvc.setSubject(String(body.prefix(60))) mvc.setMessageBody(body, isHTML: false) // X-Memo-* headers ride via the mail provider, not iOS. // For full header control, switch to swift-smtp + your own SMTP creds. presenter.present(mvc, animated: true) } func mailComposeController(_ c: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { c.dismiss(animated: true) } }
  18. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 18

    / 35 IMAP IDLE — push without APNs RFC 2177 (1997). One TCP connection, server emits EXISTS/EXPUNGE when state changes. No APNs token, no Firebase Cloud Messaging. IMAP IDLE (Gmail) 312 ms IMAP IDLE (iCloud) 470 ms IMAP IDLE (Outlook) 540 ms APNs silent-push 1.80 s Background fetch (15 min) 9.0 min Lower is better. Source: SimpleMemo IDLE telemetry, 2026-Q1 (12,400 sessions).
  19. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 19

    / 35 OAuth gotchas by provider Gmail GIDSignIn + scope https://mail.google.com/ Refresh tokens NEVER expire if you consent inside the Sign-In UI Setup: 1 day iCloud Mail App-specific password (no OAuth yet) User must enable 2FA, then generate the password in iCloud settings Setup: 30 min user-side Outlook / 365 MSAL + offline_access + IMAP.AccessAsUser.All Tenant admin consent required for workplace accounts (B2B blocker) Setup: 2 days Yahoo Mail OIDC + scope mail-r mail-w OAuth tokens expire every 60 min, refresh once per session Setup: 1 day
  20. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 20

    / 35 Anti-thesis 1 · "Email is dead in 2026." They say: “Everyone is on Slack / Discord / WhatsApp / iMessage now. Email is for receipts and grandparents. Your memo app should sync via the modern stack.” Reality: 4.4 B mail users (Litmus 2025) 376 B emails/day (Statista 2025) 99.3 % iOS users with ≥1 mail account +3 % year-on-year email volume growth 0 messaging app over 5 years old that hasn't broken protocol once
  21. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 21

    / 35 Anti-thesis 2 · "Users want real-time." “If I type a note on my Mac and it doesn't appear on my iPhone in 50 ms, the app is broken.” B u t t h e d a t a : IMAP IDLE 312 ms median push (sub-second) Most "real-time" apps 200–800 ms anyway (network jitter, not your code) Memo use-case User glances at the list once every 4.7 minutes (telemetry) Subjective "instant" Anything under 1 s feels instant in a list view (Nielsen 1993) The real metric Round-trip from tap to durable persistence, not P→P
  22. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 22

    / 35 Anti-thesis 3 · "OAuth is too hard." O N E - T I M E C O S T Building OAuth for 4 providers • Gmail: 1 day • iCloud Mail: 0.5 day (app password) • Outlook: 2 days (tenant consent) • Yahoo: 1 day Total: ~4.5 dev-days, set and forget. R E C U R R I N G C O S T Running your own auth + sync server • Server: $20–80/mo forever • Pager duty: forever • Password reset flow: forever • Account recovery: forever • GDPR/CCPA: forever • Security audits: every year Amortized cost wins for OAuth.
  23. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 23

    / 35 Privacy story (a side benefit) Your data lives in your mailbox. You can leave the app at any time. Take the entire history with you in a single IMAP-fetch. I m p l i c a t i o n s : • GDPR data-portability is automatic (it's already in their mailbox) • "Delete account" = stop reading the mailbox; the user's data stays with them • You never store user content on your servers • Marketing line writes itself: “Your notes belong to you.”
  24. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 24

    / 35 Cost story (the unfair advantage) Firebase Realtime DB $54 /mo @ 1,000 users scales linearly with DAU Self-host Postgres + S3 $80 /mo + ops time scales sub-linearly Mail-as-Sync $0 /mo — user pays Gmail / iCloud scales like a flat line At 1,000 paying users × $4.99/mo, the Mail-as-Sync stack returns ~$4,936 to the founder's bank account instead of an infra bill.
  25. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 25

    / 35 Where mail-as-sync is the wrong call Real-time multi-cursor editing Use CRDTs (Yjs, Automerge). Mail can't model character-level concurrent ops. Binary blobs > 25 MB Mail attachments cap out. Use S3/R2 and put the URL in the email. Highly relational queries JOIN across 4 tables = bad fit. Mail is a stream, not a graph. Sub-100ms global delivery IMAP IDLE is ~200–500ms. WebSockets win for trading dashboards. Strict per-message ACL Mail headers leak senders/recipients. Use signed-URLs + your own store. Memos aren't any of these. That's why this works.
  26. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 26

    / 35 Playbook · Step 1 of 7 Define your write atom 1 email = 1 memo. Pick one shape and never change it. H O W Subject → memo title (≤60 chars) Body → memo content Headers → metadata (X-Memo-*) W H Y Keeping the atom stable is what lets your mailbox stay queryable in five years.
  27. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 27

    / 35 Playbook · Step 2 of 7 Pick provider, fall back gracefully Detect domain → choose flow → fall back to Drop-Box if OAuth fails. H O W gmail.com → Google OAuth icloud.com → App password outlook.* → MSAL * → Drop-Box (write-only) W H Y Never block onboarding because OAuth was hard for one provider.
  28. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 28

    / 35 Playbook · Step 3 of 7 Encode metadata in headers Custom X- headers survive every mail client. The body stays human-readable. H O W X-Memo-ID: 0193e0f0-… X-Memo-Tags: idea, work, vol3 X-Memo-Created-At: 2026-05-19T22:00:00Z X-Memo-Source: ios-1.4.2 W H Y Apple Mail, Gmail, Thunderbird all preserve unknown X-headers. Decades-stable.
  29. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 29

    / 35 Playbook · Step 4 of 7 Build the Outbox first Local append-only queue. The Outbox is your source of truth on first write. H O W writeMemo() → 1. Append to local outbox.db (WAL mode) 2. Mark synced=false 3. Background: drain → SMTP → flip synced=true W H Y Vol.4 will go deep on Outbox. For now: write local first, sync second.
  30. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 30

    / 35 Playbook · Steps 5–7 (read, search, rebuild) 5 Use IMAP IDLE for read-back Mirror pattern: open one IDLE connection per provider, listen for EXISTS/EXPUNGE. Wrap connection lifetime around UIApplication active state; reopen on willEnterForeground. 6 Local FTS over cached headers SQLite FTS5 over what you've fetched. Fall through to server FTS for old archives. Local FTS = instant search. Provider FTS = bottomless archive. Two-tier search. 7 Mailbox is canonical, app is cache Any local DB is throwaway. Re-sync from IMAP rebuilds it. This is what makes the system anti-fragile. The app crashing never costs the user a memo.
  31. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 31

    / 35 Honest scoreboard · SimpleMemo, 11 months in 0 lines of server code 312 ms median sync latency (IMAP IDLE) $4.20 monthly infra cost (OAuth refresh webhook only) 0 "I lost my memos" complaints (11 months, 4,318 users) 0 B user data lost during App Store 14-hour outage on 2026-02-08 28 KLOC Swift in iOS app (no backend) Source: SimpleMemo internal telemetry, 2025-06-20 → 2026-05-19. Numbers will be re-printed in Vol.12.
  32. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 32

    / 35 Where it broke (so you don't have to find out) 2026-01-12 Yahoo Mail IMAP 38-min downtime Hit ~7% of users. Outbox retried; zero data loss. Users saw a yellow banner. 2026-02-08 App Store distribution 14-hour outage App couldn't update. Existing installs unaffected — data was in their mailbox. 2026-03-04 iCloud Mail rate limit Bulk fetch throttled Had to throttle bootstrap-sync to 30 req/min. Added pagination. 2026-04-19 Outlook OAuth refresh 0.3% fail rate Showed re-auth CTA. Median recovery: 2 taps. No support tickets. Pattern: every outage was someone else's outage. None were ours to fix at 3 AM.
  33. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 33

    / 35 What to copy, what to skip C O P Y • Drop-Box pattern as your v1 (ship in one afternoon) • X-Memo-* header conventions for metadata • Local FTS5 over cached headers • Mailbox-as-canonical mindset (your local DB is throwaway) S K I P • IMAP IDLE on day 1 (do it after product–market fit) • Your own SMTP server (use users' existing providers) • Encrypted bodies on v1 (Vol.5 covers AES-GCM in 200 lines) • Tenant-managed Outlook on day 1 (B2C first, B2B later)
  34. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 34

    / 35 Boring infrastructure outlives shiny startups. Pick the sync layer that doesn't have a roadmap. — @simplememofast
  35. Solo iOS Growth Diary · Vol. 3 · Email-as-Sync 35

    / 35 Next week · Vol. 4 V O L . 0 4 The Outbox — Offline-First Patterns for Memo Apps Thesis: an append-only Outbox beats optimistic UI every time. Implementation in SQLite WAL, 200 lines of Swift, recoverable in one launch. F O L L O W speakerdeck.com/simplememo x.com/simplememofast New deck every Tuesday 22:00 JST. P U B L I S H E D Vol. 1 · From EOL to Encore Vol. 2 · Speed Is The Feature Vol. 3 · Email-as-Sync ← you are here Vol. 4–12 · weekly through Aug 2026