The short version. Your contacts are encrypted on your device with a key made from a passphrase only you know. We store only ciphertext, so we can't read your contacts, and we never receive your passphrase. The rest of this page explains what that means and, just as important, what it doesn't.
How the encryption works
In plain English, in five steps:
- Your passphrase becomes a key. When you unlock Privilio, your passphrase is run through a deliberately slow function called
scrypt(cost parameter 215, with a random per-account salt). This makes each guess expensive for anyone trying to crack a stolen copy of your data. The result is a 256-bit key that exists only on your device. - That key protects a second, random key. Privilio generates a random data key (a "DEK") for your account. Your passphrase key wraps (encrypts) the data key. Because of this, changing your passphrase means re-wrapping one small key instead of re-encrypting every contact.
- Each contact is sealed individually. Every contact is encrypted with
XChaCha20-Poly1305under the data key, using a fresh random 192-bit nonce each time. This cipher also authenticates the data, so tampering is detected rather than silently accepted. - Only ciphertext leaves your device. What we receive and store is the encrypted contact, its nonce, and a few bookkeeping fields. All traffic also travels over TLS.
- A recovery code is a second way in. When you set up, the app gives you a one-time recovery code. It is used to wrap a second copy of your data key, and we store only that wrapped copy. Whoever holds the recovery code can unlock your data, so treat it like a spare key and keep it somewhere safe and private.
- A verifier tells you if your passphrase is right. We store a small encrypted check value so the app can tell you "wrong passphrase" without us ever seeing the passphrase. It is encrypted under your key, so it doesn't reveal the passphrase or the data.
The code runs in the web app and the iOS app, using the audited open-source @noble cryptography libraries.
What our servers can and cannot see
Sign-in is handled by Clerk, our authentication provider. Your passphrase and encryption keys are never sent to Clerk or to us.
| We cannot see | We can see |
|---|---|
| Names, phone numbers, emails, companies, notes and tags Your passphrase Your encryption keys (the data key is stored only in wrapped form) Which contacts are in your Vault |
Your sign-in identity (email or account identifier) How many encrypted records you have, and their approximate size When records were created, changed or deleted (timestamps) When and from what IP address you connect (IP addresses are kept briefly for security and abuse prevention) Whether you have a Pro subscription (handled through Apple or Google) |
Zero-knowledge describes the content of your contacts. It does not make you invisible: like any sync service, we necessarily know that an account exists and when it syncs.
What the Vault is, and what it is not
The Vault is a Pro feature that lets you mark certain contacts as sensitive and hide them behind a PIN.
Be clear on this: the Vault is a flag stored inside your encrypted contact data, protected in the app by a PIN. It is not a separate layer of cryptography. Vault contacts are encrypted with the same data key as everything else, so your passphrase protects them, and the PIN is an extra lock on the app's interface. If someone has your passphrase, the PIN does not stop them from reading Vault contacts with other software. We are considering giving the Vault its own separate key; we have not done that.
If you forget your passphrase
Because only you hold the key, we cannot reset your passphrase or decrypt your data for you. When you set up, the app gives you a one-time recovery code that can unlock your data if you forget your passphrase. If you lose both your passphrase and your recovery code, your data cannot be recovered by anyone, including us. Keep both somewhere safe. You can also export your contacts (JSON, CSV or vCard) at any time as a backup.
Connected AI assistants (coming soon)
We are working on a connector that would let AI assistants such as Claude, ChatGPT or Grok Bot look up your contacts for you. It is coming soon, optional, and off by default. It is not available yet. We are describing the trade-off now so nobody is surprised later:
- When an AI assistant retrieves contacts for you, the AI provider sees whatever the assistant retrieves, in readable form, and handles it under its own privacy policy.
- Privilio's zero-knowledge design covers Privilio's servers. It cannot cover what you choose to show an AI assistant.
- You will create a read-only access token in Settings. We store tokens only as a hash, and a token on its own gives access only to encrypted data that is unreadable without your passphrase.
- The connector excludes your Vault. You can revoke a token at any time, and tokens are revoked automatically when you change your passphrase or recover your account.
- We keep an audit log of when a token was used (access times only, no contact content) for 90 days.
- The connector will be optional and off by default, and we will publish how it works before it ships.
What we have not done yet
- No independent security audit yet. We use well-established algorithms and libraries, but the Privilio application itself has not been reviewed by an outside firm.
- The apps are not open source today.
- If a device or browser is compromised (malware, a malicious extension), an attacker may read data while the app is unlocked. End-to-end encryption can't protect against that.
- A weak passphrase is the weakest link. Use a long, unique one.
Where your data is stored
Our database is hosted on Supabase in AWS ca-central-1 (Canada). Data is stored only as ciphertext. Sign-in is handled by Clerk, which may process sign-in data outside Canada. See our Privacy Policy for how we handle account data and legal requests.
Report a vulnerability
If you think you've found a security issue, please email smartin@adapting-services.ca with the details and steps to reproduce. Please give us reasonable time to fix the problem before disclosing it publicly, and don't access or modify other people's data while testing. We aim to respond to security reports within 3 business days.
Privacy · Terms · Contact us · Back to home