Security
This page is for your security reviewer, your IT person, or you on a Saturday morning when you want to know exactly what the app is doing. The short version is in the architectural attestation; this is the longer technical version.
Threat model
We design against four adversaries:
- Lost or stolen device. An attacker physically possesses your unlocked-but-recently-locked iPhone.
- Malicious app on the same device. Another app you installed tries to read Bryl's data.
- Network attacker (passive). An adversary on your local network or upstream — coffee shop, airport, ISP — observes traffic.
- Subpoena or breach of Roushan, Inc. A legal demand or hostile actor compromises our infrastructure.
We do not currently design against a fully-jailbroken device or a sophisticated nation-state attacker with physical access plus the iPhone's passcode. Those threat models require a different product.
At-rest encryption
| Layer | Mechanism | Key location |
|---|---|---|
| Filesystem | iOS Data Protection (NSFileProtectionComplete) | Secure Enclave; tied to passcode |
| Database | AES-256-GCM via Apple CryptoKit | iOS Keychain; tied to FaceID + passcode |
| App-level secrets | iOS Keychain entries with kSecAttrAccessibleWhenUnlockedThisDeviceOnly | iOS Keychain; never synced to iCloud |
While the iPhone is locked, the database is unreadable to any process, including iOS itself. The encryption key cannot be extracted from the Secure Enclave by software.
In-transit posture
Clinical content (audio, transcript, note) is never in transit because it never leaves the device. The only outbound network calls Bryl makes are:
- StoreKit 2 — Apple-controlled, TLS to Apple servers. No Bryl content.
- One-time Parakeet TDT v3 download — TLS to a public Hugging Face bucket on first run; can be skipped in favor of Apple's built-in Speech framework. No identifying information beyond standard HTTP headers.
The current Bryl iOS build ships with no analytics SDK, no crash reporter, and no usage counters. If we ever add an opt-in (defaults-off) telemetry surface, this page is updated before the App Store release lands.
We pin TLS connections to known-good roots and reject downgraded TLS. We do not ship a proxy override switch in the production build.
Key management
The database master key is generated on first launch using SecRandomCopyBytes, stored in the iOS Keychain, and never leaves the device. iCloud Keychain sync is disabled for Bryl's entries — keys stay on the originating device. If you lose the device, the keys are unrecoverable; restoring from an encrypted iCloud backup recovers the encrypted database, but the keys must be re-derived (you authenticate, the backup unlocks).
App sandbox
Bryl runs inside the standard iOS app sandbox. It cannot read other apps' data. It cannot read iOS system data. The microphone, camera, files, and notification permissions are requested individually, with usage strings documenting the purpose, and degraded gracefully if denied.
Bug reports and responsible disclosure
Email security@bryl.app. We acknowledge within 24 hours. We do not run a public bug bounty during the closed beta; we're happy to compensate impactful reports out of band — write first, we'll figure out scope.
Please give us 90 days to ship a fix before public disclosure for any vulnerability that could compromise client data on a clinician's device. We will name researchers in the changelog with their consent.
What we publish
- This page, kept current as the architecture changes.
- The architectural attestation — the compliance-file version of the same content.
- The complete list of network calls, in the privacy policy.
We do not publish a SOC2 report because we do not run a server for clinical content. The compliance frameworks built around vendors that hold patient data don't map cleanly onto a vendor that doesn't.