Security

Civility supports end-to-end encryption, and each app chooses whether to use it. Some apps keep data readable by the server so they can offer features like search or AI; apps that enable encryption store nothing but opaque ciphertext on the server, and only clients that know your password can decrypt it. An app tells you which model it uses when you connect it. The rest of this page describes how the encrypted path works.

Key architecture

Civility uses a wrapped-key model with two layers. Your password is stretched with Argon2id into a Key Encryption Key (KEK). The KEK unwraps a random Master Encryption Key (MEK), which is stored on the server only in wrapped form — the server never sees the MEK in plaintext. Per-store and per-blob keys are derived from the MEK via HKDF. Content is encrypted with AES-256-GCM.

Because the MEK is wrapped rather than derived directly from your password, changing your password only re-wraps the MEK — no data is re-encrypted — and a new device just needs your password. A recovery passphrase provides a second way to unwrap the MEK if you forget your password.

What the server can see

For an end-to-end encrypted app, an operator can observe only the structural metadata needed to route and merge syncs:

  • When syncs occur, and timestamps
  • How many documents exist per collection, and the collection structure of apps
  • System-generated IDs (change IDs, document IDs) and merge-ordering data
  • Blob content-hash references (for deduplication) and blob sizes
  • Your account email address

What the server cannot see

  • Document content — the JSON Patch payload of every change is encrypted
  • Blob content — encrypted client-side before upload; the server stores opaque bytes
  • Your user-defined property values
  • Your Master Encryption Key, and therefore anything derived from it

For apps that don't enable encryption, document and blob content is stored readable by the server, like most web services.

Transport & storage

All traffic to the hosted service is served over TLS. Payment card details are handled entirely by Stripe's hosted checkout; Civility never sees or stores them.

Responsible disclosure

If you believe you've found a security vulnerability, please report it privately to security@civility.cloud before any public disclosure. We aim to acknowledge reports promptly and will keep you updated as we investigate. Please include enough detail to reproduce the issue.