How data moves
Last updated August 4, 2026. This is a technical disclosure of the current app, written to be readable rather than clever. Subtext is available for Mac and as a paired iPhone app.
Local analysis
Subtext reads a protected temporary copy of your local Messages database. It maintains a permission-restricted private message index in Subtext's Application Support folder so later updates can append new messages instead of rebuilding your history from scratch. It computes counts, reply timing, initiation, writing style, people, groups, and cards locally. Temporary database copies are removed after each read, the original database is never modified, and the local index is never uploaded as plaintext. Attachments and images are not copied into the index or uploaded.
AI features
Coach and Deep Dive run only when you deliberately choose them. A person-scoped Coach starts with the relevant recent messages for that person; older or broader excerpts travel only when a local tool returns them for that question. An optional archetype remix sends derived numbers only—no names, handles, or message bodies.
Native Mac and iPhone product requests pass through the Subtext Cloudflare Worker to the selected AI provider. The relay does not store or log prompt or response bodies. Salted rate-limit counters are cleared after 72 hours. A native build without the relay credential keeps non-AI features available and does not fall back to a general-purpose local agent. The separate developer command-line tool uses a signed-in Claude CLI only when a user explicitly invokes that tool; it is not a native-app fallback.
Paired iPhone experience
The Mac remains the only component that reads Messages. If you enable the companion, it builds a derived relationship model and, for Coach, a bounded message corpus. Phone numbers, email handles, contact IDs, and group GUIDs are replaced with keyed opaque identifiers. Attachments and excluded conversations are not included.
The model and message corpus are encrypted with AES-GCM before upload to your private CloudKit database. CloudKit routing metadata is authenticated so altered or moved records cannot decrypt, and the pairing key is stored separately in Keychain. Apple handles the private iCloud account, ciphertext, opaque/random record identifiers, schema/revision, and timestamps.
Coach searches the authenticated corpus locally on iPhone using bounded tools. Your question, the derived model, and only the evidence those tools select are sent through Subtext's private relay to the AI provider; the relay does not store prompts or answers. Text you deliberately paste or extract with on-device screenshot OCR remains optional and editable. The answer stays in memory for that app session. Private CloudKit request/response records are reserved for Mac refresh and the authenticated delete-everywhere handshake, not direct Coach. Phone deletion removes the CloudKit zone, pairing key, and local encrypted cache after the paired Mac reaches a durable disabled state.
Account and product activity
First run asks for a name, email, age range, and the communication areas where you want help. Cloudflare KV stores that account profile under a salted product-install hash so Subtext can provide product and service updates. Cloudflare Analytics Engine receives fixed-choice onboarding categories, allowlisted product events, and per-feature AI operational totals.
Analytics does not receive prompts, AI answers, message text, contact names, attachments, name, email, a raw device ID, or a raw IP address. Name and email are stored only in the separate account profile. AI operational records include feature, model, app/OS version, provider-reported input/output/cache tokens, request size, latency, and status. Coach feedback is a category such as “helpful” or “wrong context.” Separate salted abuse-limit counters expire within 72 hours.
Stored on your Mac
Coach conversations, Coach memory, and Deep Dives are encrypted with a device-only key in your login Keychain. The private message index, recomputable statistics, and resolved display names remain in Subtext's local Application Support folder with account-only file permissions. Settings can clear AI history or delete all Subtext data, including the private index and encryption key.
Other network activity
The Mac app checks the signed Sparkle feed at updates/appcast.xml for updates; the site also retains a legacy version.json manifest for older builds. Previously submitted waitlist records retain the email address and original signup time for up to 12 months by default, or until you ask support to delete them. The connecting IP is processed transiently into a salted abuse-limit key; the raw IP is not stored and the counter is emptied within 72 hours. There is no third-party analytics SDK, advertising tracker, or crash reporter in the app.
Your controls
- Use AI only when you choose an AI action.
- Clear Coach AI access in Settings.
- Exclude a conversation and any group containing that person from analysis, AI tools, and companion sync.
- Enable the paired iPhone experience in one flow. Coach includes its encrypted message corpus, and newer Messages are analyzed while the Mac is available.
- Disable or reset the companion and its encrypted CloudKit zone.
- Inspect and delete individual Coach memories.
- Clear AI history or delete all stored Subtext data.
Cloudflare retains Analytics Engine metric rows for three months. Those aggregate rows cannot be selectively deleted; after the account is deleted and its product ID rotates, they no longer map to the deleted profile. The relay's independent abuse-limit ID is not reset by this control.