Security
Isolation is a query rule, not a slogan
This page describes the controls that exist in this repository and the ones that are still planned. It is not a completed security review.
Tenancy
Organization-scoped tables are read and written through a tenant helper. The helper rejects a write that names a different organization and filters reads to the active one. A membership check runs before an organization page renders. Postgres row-level security is a stretch goal, not an enabled policy.
Accounts
Sign-in is Auth.js with a database session and a one-time email link. Google is added only when both client credentials are set. Magic links are shown in the interface only when AUTH_DEV_EXPOSE_LINKS is true, or in non-production when email is unconfigured. Do not turn that flag on for a public host.
Secrets
Provider keys stay in environment variables. The health endpoint reports which integrations are configured as booleans. It does not return secret values. API keys for the MCP endpoint are stored as SHA-256 hashes. The secret is shown once.
Planned subprocessors
Production hosting is Docker on a server you control, with Postgres on Neon, Stripe, Resend, object storage, and a model provider. None of those are required to run the marketing site or the test suite. A counsel-reviewed list belongs in the privacy policy before launch.
Reporting
There is no security mailbox yet. Use the contact form and say that the note is a security report. Do not include live client data.