Skip to content
Security · The model, auditable

How Kyra stores, syncs, and locks your data

This page is for the trader who wants the implementation detail behind the privacy commitment. The architectural reasoning lives on Why on-device; the policy document lives on Privacy policy. This page describes the technical security model — the parts a reviewer would verify rather than the parts a marketer would describe.

Data flow at a glance

Your deviceTrade entry and SwiftData databaseStored inside Kyra's local app container.iCloud sync off: data stays here.
Apple iCloudPrivate CloudKit databaseBound to your Apple ID, not a Kyra account.
Your next deviceAnother iPhone running KyraRestored through the same iCloud account.
No Kyra-operated server is in this path. iCloud sync is optional; when it is off, trade history remains on the device where it was logged.

Protected locally

SwiftData persists entries inside the iOS app container. Privacy Lock can require device authentication before trade content is shown.

Optional off-device copy

When iCloud sync is enabled, CloudKit stores a private database under the user's Apple ID. Kyra does not operate a trade-history server.

Verify the boundary

Network

Use App Privacy Report or a proxy to inspect destinations while logging, syncing, and viewing patterns.

Disclosure

Compare Kyra's App Privacy label with the data path and analytics description on this page.

Threats

Local protection does not replace Apple ID security or device security; those boundaries are listed below.

Storage layer

Kyra uses SwiftData for local persistence. The database file lives in the app's container on the device. Standard iOS protections apply:

The model classes are Trade, UserSettings, and ChecklistSession. Schema migrations happen on app version updates. SwiftData handles the migration; no data is sent off-device during the migration.

Sync layer

When iCloud sync is on, SwiftData replicates the database through CloudKit's .automatic mode. CloudKit is Apple's user-data storage layer; in .automatic mode, the data lives in the user's private database in their iCloud account.

What this means concretely:

If iCloud sync is off (toggle in Settings), trades remain on the single device they were logged on. No sync, no network traffic, no off-device copy.

Privacy Lock

Privacy Lock is the in-app authentication layer that gates trade visibility. When enabled:

The implementation uses Apple's LocalAuthentication framework. Kyra never sees the biometric data; the authentication result is a boolean response from iOS, not a credential the app stores.

Privacy Lock is a per-device setting — not synced through iCloud — so a trader can enable it on the iPhone and leave it off on the iPad if their threat model differs by device.

For the setup walkthrough, see FAQ ("How do I lock the app?").

Crash reporting

Kyra uses TelemetryDeck for anonymous analytics and Apple's MetricKit for crash diagnostics. The combination forwards three data classes:

  1. Device ID (anonymous, generated by TelemetryDeck — not the IDFA, not the IDFV, not anything Apple's ad system uses)
  2. Product Interaction (anonymous — what features get tapped, e.g., "trade entered via Quick P&L mode")
  3. Crash Data (anonymous — the technical crash report, function names and call stack, no user content)

What is not forwarded:

Trade fields — ticker, direction, prices, P/L, emotion, execution rating, setup tag, reflections — are excluded from analytics payloads, log statements, and error messages by design. A quarterly egress audit verifies the exclusion across the codebase.

Analytics can be turned off in Settings → Privacy & Security → Analytics. With analytics off, zero outbound data is sent from Kyra except CloudKit sync traffic (if iCloud is on).

Network behavior

Kyra is built to function fully offline. The only outbound network activity is:

There is no third-party API call. There is no analytics SDK with its own outbound traffic. There is no ad-network beacon. There is no crash reporter that ships full device fingerprints. The list above is exhaustive.

A trader who wants to verify this can use Apple's built-in App Privacy Report (Settings → Privacy & Security → App Privacy Report on iOS 15.2+) to see Kyra's actual network destinations. The report will show Apple's CloudKit domains (gateway.icloud.com, etc.) and TelemetryDeck's ingestion endpoint if analytics is on. Nothing else.

Threat model

What Kyra defends against:

What Kyra does not defend against (because the threat is outside Kyra's control):

The threat model is honest about its boundaries. Kyra does not claim to defend against threats outside its layer.

What you can verify independently

Five things any technically curious user can check without taking Kyra's word:

  1. The App Privacy nutrition label. Visible on Kyra's App Store listing. Compare to any competitor's label.
  2. The App Privacy Report. Settings → Privacy & Security → App Privacy Report on iOS 15.2+. Shows Kyra's actual network destinations over the last 7 days.
  3. Network traffic with a proxy. Use Charles Proxy or Little Snitch on a Mac to intercept Kyra's outbound traffic. Confirm: no third-party domains, no analytics beacons beyond TelemetryDeck.
  4. The CloudKit storage class. Apple's documentation explains that .automatic mode places data in the user's private database. Kyra's mode is verifiable from the schema definitions (publicly described in /why-on-device.html).
  5. The TelemetryDeck mode. TelemetryDeck publishes an official guide for its default privacy configuration. Kyra uses the default mode with no custom user identifier.

If any of the architecture stopped matching the description above, the App Privacy label would have to change, the App Privacy Report would expose the discrepancy, the network traffic would tell on Kyra, and CloudKit would refuse the storage class. The story is auditable through five independent checks.

Updates to this page

When the security model changes — Privacy Lock gets a new authentication path, TelemetryDeck adds a new signal class, the threat model gains or loses a defense — this page gets updated. The version history is captured in the public changelog at Changelog.

If a vulnerability is reported, the disclosure timeline and the fix description land here. Email security disclosures to privacy@neontigerlabs.com.


The security model is small because the architecture is small. There is no backend, no account system, no ad SDK, no analytics SDK with its own outbound traffic. Each absence is a defense; together they form the privacy model explained in Why on-device. The implementation details on this page make that model auditable, not just claimed.

Try the journal these defenses produce.

Kyra is a privacy-first trading journal for iOS. Pattern detection runs on your device. Free includes unlimited trade logging and your single strongest pattern. Premium adds every pattern Kyra finds and the adaptive pre-trade checklist.

Download on the App StoreDownload on the App Store