Most memo apps mutate the screen first and hope the write lands. Vol. 4 of Solo iOS Growth Diary argues the opposite: an append-only Outbox beats optimistic UI every time. Persist the user's intent to a durable, local, append-only log before you touch the network or the view — then drain it.
Inside: the Write Durability Score (WDS), the Outbox state machine (pending → sending → sent with a jittered backoff loop), an offline-first architecture in SQLite WAL via GRDB, a drain loop driven by NWPathMonitor + BGTaskScheduler, and UUID idempotency keys that turn at-least-once delivery into an exactly-once effect. From production: 9 ms median enqueue-to-durable, 840 ms median drain-to-sent, 3,112 rows replayed after forced-quits with 0 duplicates, 14 memos lost pre-Outbox vs 0 after — in ~214 lines of Swift.
Anti-thesis for every claim: "Just use CRDTs" (a conflict a single-writer memo app never has), "Optimistic UI is good enough" (an OOM kill erases an in-memory write), and "SQLite is overkill, use a JSON file" (no atomic append, no crash-safe journal). One drain can also fan out to multiple sinks: a successful send reaches the AES-GCM email path and, for Advanced-Mode users, an append to the user's Obsidian daily note on iCloud Drive (iPhone-only; iCloud reflection can lag a few seconds).
Part of the 12-week Solo iOS Growth Diary — new deck every Tuesday 22:00 JST. Keywords: offline first ios, outbox pattern swift, append-only persistence, sqlite wal ios, idempotency key, NWPathMonitor, BGTaskScheduler, GRDB, Captio, dual-sink delivery, Obsidian append.
Follow: speakerdeck.com/simplememo · x.com/simplememofast
References: simplememofast.com/obsidian/ · apps.apple.com/us/app/captio-style-simple-memo/id6758438948?ct=obsidian-en&mt=8