Security, in plain terms

We designed Frnd around one rule: even we should not be able to see your sensitive information (e.g. credentials).

Your passphrase is the key

When you connect a service — e.g. your mail — you set an encryption passphrase. It is separate from how you log in, and we only ask for it when you are adding or changing something sensitive. That passphrase is what unlocks your data. We do not store your passphrase, and we cannot recover it for you if you lose it — because if we could, so could anyone who broke in.

In other words: Neither we (nor a hacker who might steal our database) can access your sensitive data.

Your AI Assistant also holds a key

Your connected AI Assistant holds a key of its own, separate from your passphrase. This is required so we can act on your AI Assistant's instructions without asking for your passphrase on every call.

Like your passphrase, we do not store these keys, and we cannot recover them. If you (or your AI Assistant) lose one of these keys, you will need to create a new one — that is, connect your AI Assistant to Frnd again.

You control what your AI Assistant can touch

Beyond encryption, you decide what your connected AI Assistant is allowed to do — read-only or read-write, specific folders, actions that need your approval first. And everything it does is logged, so you can check.

For the technically curious

Each user has a randomly generated 256-bit Data Encryption Key (DEK), which encrypts service credentials and sensitive policy configuration. The DEK itself never touches disk unencrypted — it is wrapped by one or more Key Encryption Keys (KEKs), each coming from a different source:

Key holders(your side) Your passphrase Held by your AI Assistant OAuth refresh token Manual API key Frnd application Passphrase KEK (via Argon2id) OAuth KEK (via OAuth flow) API-key KEK (user-generated) Database Your DEK (Data Encryption Key) Your credentials (the secret we protect) encrypts encrypts encrypts encrypts

Scroll sideways to see the full diagram →

  • Your encryption passphrase (run through Argon2id) derives a passphrase KEK that wraps the DEK. Argon2id is a memory-hard key derivation function designed to resist brute-force attacks.
  • If your AI Assistant connects via OAuth, the refresh token issued during that flow carries a second KEK which wraps the same DEK as a separate copy.
  • If instead you generate an API key yourself and hand it to your AI Assistant, that key carries its own KEK the same way.

Either path lets your AI Assistant operate without your passphrase on every call — it never sees the passphrase, and revoking a key only revokes that copy, independently of the others.

All key wrapping uses post-quantum-safe algorithms. Decrypted keys are held in memory only for the duration of a single operation, then dropped.