Your codes never leave your device unencrypted
Your codes are generated on your device, offline, and you don't need an account or a phone number to start. Nothing about an account you add leaves your device until you turn on Cloud Sync or connect the browser extension. Below is what happens at each step, and what we can't do for you if you lose access.
What happens when you add a code
-
You scan a QR code or type a setup key
Entirely on your device. Nothing is sent to us to add an account.
-
Your device encrypts the secret and stores it locally
The secret is encrypted with AES-256. The key that unlocks it is kept by the iOS Keychain or the Android Keystore, the storage your phone provides for exactly this, not a database we run.
-
Every 30 seconds, your device computes a new code
It follows RFC 6238, the standard every authenticator app uses. No network request is involved.
-
Only if you turn on Cloud Sync: an encrypted backup goes to your own cloud
iCloud on iOS, Google Drive on Android. It lands in your account, not on our servers.
-
Only if you connect the browser extension: one code is relayed to it
The six-digit code you push passes once through our infrastructure to reach your browser add-on. The secret that generates it never does.
What we store
If you turn on Cloud Sync: an encrypted backup of your accounts, in your own iCloud or Google Drive. If you connect the browser extension: the six-digit codes you push to it (encrypted) and a device identifier used to route the push. Until you turn on one of those two, nothing about your accounts leaves your device. The app works fully offline.
What we never store
Your account secrets, on any server we control. The secret that generates your codes is never uploaded anywhere unencrypted. For the browser extension, it never passes through our infrastructure at all, encrypted or not. Only the short-lived code your phone has already computed does.
How the encryption works
- The codes: computed on your device with RFC 6238, the standard time-based algorithm, on a 30-second cycle.
- Accounts stored on your phone: encrypted with AES-256. Each record has its own salt, and every read checks a tag that fails if the stored data was altered.
- The keys: kept in the iOS Keychain or the Android Keystore, the secure storage built into the phone, not in a database we operate.
- Backups and Cloud Sync payloads are also encrypted before they leave your device.
Recovery
If you lose your device, your accounts come back from one of three things you control: an offline backup file you exported yourself, Cloud Sync (iCloud or Google Drive) if it was turned on, or your old device itself, by showing each account's QR code there and scanning it on the new phone. We cannot restore your codes without one of these.
Where the architecture is heading
We're working toward a stronger sync design: a vault that only your own devices can open, with a recovery key your device generates and approval from a device you already use, in place of today's backups held in your cloud account. Passkeys would prove it's you; on their own they wouldn't open the vault. None of this has shipped. Until it does, the mechanisms above (backup file, Cloud Sync, old device) are what actually exists. We're also planning an issuer-icon set that ships with the app, so looking up a logo never has to reach a server.
Reporting a vulnerability
Found a problem? Our disclosure policy and contact details are at /.well-known/security.txt (RFC 9116).