For a single-user iOS memo app, CryptoKit alone is enough to ship real end-to-end encryption — no libsodium, no key server, no rolling your own. Vol. 5 of Solo iOS Growth Diary builds AES-GCM E2E in ~187 lines of Swift.
Inside: what an AEAD actually gives you (confidentiality + integrity + authenticity in one call), the SealedBox envelope (96-bit nonce ‖ ciphertext ‖ 128-bit tag), a Secure-Enclave-wrapped 256-bit SymmetricKey held in the Keychain (this-device-only, non-syncable), and the seal()/open() paths where .open() verifies the 128-bit tag before returning a single plaintext byte. Plus the one rule that matters — never reuse a (key, nonce) pair — charted against the NIST SP 800-38D 2^32 random-nonce rekey bound and real usage (~2.4M memos, zero collisions).
Anti-thesis for every claim: "Roll-your-own crypto = bad" (calling a vetted AEAD is the opposite of implementing your own cipher), "You need a big crypto library" (CryptoKit covers key-gen, AES-GCM and ChaChaPoly, HKDF, and Secure Enclave wrapping; the one gap — a password KDF — is a single CommonCrypto PBKDF2 call), and "Real E2E needs key exchange" (a memo-to-self vault is single-party — symmetric, no PKI, no server). The deck also marks the encryption boundary precisely: the message key protects the email/sync path, while an optional local-only append to an Obsidian daily note on iCloud Drive stays on-device under iOS Data Protection (iPhone-only; the vault's security is the platform's, not the app's message key).
Part of the 12-week Solo iOS Growth Diary — new deck every Tuesday 22:00 JST. Keywords: cryptokit aes-gcm, e2e encryption ios, ios keychain, secure enclave, aead swift, symmetrickey, authenticated encryption, nonce reuse, chachapoly, Captio.
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