If you're a security researcher, journalist, or engineer, this is the rest of the story. If not, the four cards above are the whole story.
- Cipher
- Journal entries and chat transcripts are encrypted with AES-256-GCM. Each payload has a unique 96-bit IV. GCM's authentication tag guards against tampering.
- Key derivation
- Your content is encrypted with a random 256-bit key generated in your browser, never derived from anything guessable. Your passphrase is run through PBKDF2 (310,000 iterations, SHA-256, 16-byte salt) to derive a separate key that wraps the content key. A second wrap comes from your 24-word recovery phrase, using an independent salt. Changing your passphrase re-wraps the content key without re-encrypting your data. The passphrase and recovery phrase never leave your device.
- What the server can read
- Vitne never sees your passphrase, your keys, or the words you write in the chat or the journal. Those are stored only as ciphertext with a per-item IV. Readable on our side: your email and the display name you enter (held by the login provider, Clerk), the settings you choose, timestamps, and how your sessions and entries are organised. What you write is not among them.
- Reflection requests
- Messages sent to the AI travel over TLS. To reply, the AI provider (Anthropic) has to read them in plaintext. Under Anthropic's commercial terms they do not train on API content, and they delete it under a standard retention window (up to 30 days) rather than keeping it indefinitely. Vitne does not have a zero-retention agreement in place today; if that changes, this line changes with it. The request is sent from Vitne's server, not your device, so your IP address, name, and email are never attached, and no stable per-user identifier is sent either.
- Retention
- Journal entries live, encrypted, until you delete them. Chat transcripts are stored encrypted too, so a past conversation is still there when you come back, not kept only on your device. Deleting your account removes your encrypted rows right away. Backups roll off on their own cycle.
- Crypto package
- The cryptographic primitives and the client-side encryption layer live in a separate @vitne/crypto package, kept narrow on purpose so it's small enough to reason about. The package isn't public yet; the full architecture is published at /privacy/deep-overview.
- Threat model
- The model assumes a compromised server, a subpoena, and a curious operator. It does not, and cannot, protect against a compromised client (keylogger, malicious extension) or a weak password. Pick a strong one.
- Subpoena posture
- If a government asks, the most I can hand over is what I can actually read: the ciphertext (useless without your keys), your email and display name, the settings you chose, timestamps, and the shape of your account. Not the words you wrote. A transparency report goes up the first time I receive a request.