Security
Last updated 21 August 2026
Cappuccino reads what your teams have already written — Slack channels, Jira issues, GitHub issues, Drive documents — to find where their plans disagree. That is a lot of access to ask for, so this page is a plain account of what happens to that content.
What we read, and what we keep
- Only what you connect. Each source is authorised separately, and a sync only ever covers the channels, projects or folders you select. Cappuccino cannot reach anything you have not chosen.
- The text, and what we extracted from it. We store the ingested text as an artifact so every finding can point at the exact sentence it came from. Evidence you cannot trace back is not evidence.
- Not your credentials. We never see a password for a connected service. Connections use OAuth, and we hold a token you can revoke from the provider at any time.
Encryption
- Connection tokens are encrypted at rest with AES-256-GCM, using a key held outside the database. A copy of the database on its own yields no usable token.
- Passwords are never stored. Only a bcrypt hash, which cannot be reversed into the password.
- Two-factor authentication is available on any account — a code from an authenticator app on top of the password, with single-use recovery codes stored only as hashes. The shared secret is encrypted at rest like any other credential.
- Sessions can be ended everywhere at once. Changing your password does it automatically, and there is a button for it in your profile — so a lost laptop stops being signed in the moment you act, not whenever its session would have expired.
- In transit, everything is TLS — your browser to us, and us to every provider.
Who can see your workspace
- Members of that workspace, and nobody else. Every query is scoped to the workspace on your session, and permissions are re-read from the database on each action rather than trusted from the session itself.
- The database refuses direct access.Row-level security is enabled on every table with no policies attached, so the hosting provider's auto-generated data API cannot read them even with its public key. The application connects as a role that bypasses this by design; nothing else can.
- Sensitive actions are logged.Exporting data, creating or revoking a public share link, changing a plan and changing a member's role each write an audit record with who did it and when.
- Shared links are explicit and revocable. A conflict is only readable outside your workspace if someone creates a share link for it, and revoking that link takes effect immediately.
Subprocessors
- OpenAI— ingested text is sent to their API to extract plans, compare them and answer questions. OpenAI's API terms state that content submitted through the API is not used to train their models.
- Our hosting and database providers — they store the data at rest on our behalf.
- Stripe — for payment, if you are on a paid plan. Card details go to Stripe directly and never reach us.
- Our email provider — only for messages you ask us to send, such as an alignment invite, plus account mail like a password reset.
Retention and deletion
- Content stays until you remove it. Disconnecting a source deletes its stored credentials and stops future syncs; it deliberately does not delete artifacts already ingested, because deleting them would silently destroy the evidence behind findings you may still be acting on.
- Deleting a workspace deletes its content. Artifacts, extracted plans, conflicts, entities, connections and members are removed, in order, in one transaction.
- Deleting your account removes your user record and any workspace where you are the only member. Where others remain, the workspace stays and you leave it.
- You can take your data out at any time, without asking us, from the export in Settings.
What we do not have yet
We would rather tell you than have you find out in a questionnaire. Cappuccino does not currently hold a SOC 2 report, and does not yet offer SSO or SAML. If either is a requirement for you, tell us — it is the clearest signal we can get about what to build next.
Reporting a vulnerability
A contact address has not been configured on this deployment. Set LEGAL_CONTACT_EMAIL so reports have somewhere to go.