Security & data isolation
The one-pager enterprise buyers ask for. How tenant data is isolated, how identity is checked, and where the bright lines are. If something here is unclear, email us.
Protections at a glance
Each control below names the place it is actually implemented, so a reviewer can verify it instead of taking our word for it.
- AuthenticationrequireSupabaseAuth middleware + apiGuard.server.ts
Every protected server function re-validates the bearer token against the auth server; sessions cannot be forged client-side. Enterprise plans add SAML 2.0 SSO.
- Authorizationis_team_member(team_id, auth.uid()) policies
Postgres row-level security keyed on team_id gates every user-data table, so a member of one team cannot read or write another team's rows.
AI, voice, and manual endpoints are token-bucket limited per caller, and unauthenticated probes are throttled before any model call. Blocked calls return a retry hint.
Programmatic access uses per-team keys stored hashed, verified server-side only, revocable instantly, with a last-used timestamp.
- Data handling/ai-governance and /privacy
Uploaded well, log, and simulation data is used to run your team's scenarios — not to train shared models. AI prompts are redacted and context-capped before any model call.
- Logging & PIIsrc/lib/security/securityAuditLog.server.ts
Server functions never log raw payloads. Audit records store event kinds, subjects, hashed IPs, and email domains only.
- Audit trail/security-audit (team admins and engineers)
Sign-in attempts, AI endpoint access, rate-limit events, and failed authorization are recorded and reviewable by team admins, with CSV export.
- Supply chain/dependency-scans (weekly scheduled scan)
Every shipped third-party package is re-checked weekly against the public advisory database (OSV.dev/GHSA/CVE) on an automated schedule, with a severity-ranked report exportable as PDF or CSV.
- Retention & deletion/privacy — retention, export, and deletion
Team data is retained while the workspace is active. Export or deletion requests are handled on request — the process and contact are documented.
All traffic is served over HTTPS with HSTS; managed Postgres and object storage are encrypted at rest by the platform provider.
- Browser hardeningsecurity headers middleware in src/server.ts
A strict Content-Security-Policy, frame-ancestors lockdown, nosniff, and a tight Referrer-Policy ship on every response.
- Subprocessors/subprocessors
The third parties that can process workspace data are listed publicly, with what each one is used for.
Team-scoped row-level security
Every user-data table runs Postgres row-level security keyed on team_id. The check function is_team_member(team_id, auth.uid()) is the single source of truth — every policy on every table delegates to it. A signed-in user from team A literally cannot select, insert, update, or delete a row that belongs to team B; the database refuses before the server fn returns.
Bearer-validated server functions
Every protected server function declares the requireSupabaseAuth middleware. The bearer token is re-validated against the auth server on every call — sessions can't be forged client-side, expired tokens are rejected, and the resulting Supabase client acts as the user (RLS still applies). Service-role writes are reserved for trusted webhook handlers behind a signature check.
Scoped public SDK keys
Programmatic access uses per-team API keys minted from the workspace settings UI. Keys are stored hashed (SHA-256, server-only verification via verify_api_key()), can be revoked instantly, and carry a last_used_at timestamp for audit. Public SDK routes live under /api/public/sdk/v1/* and are locked by a 15-test drift-guard suite.
Data residency
Application traffic is served from Cloudflare's global edge (Workers runtime). Tenant data lives in a single managed Postgres region — see request data-residency details for the current region and replication posture. Dedicated single-region deployments are available for enterprise plans.
No PII in logs
Server functions never log raw input payloads. The AI Engineer copilot redacts secrets and caps context at 8 KB before any LLM call. Workspace activity logs capture event kinds + subjects (e.g. ai.engineer / simulation name), not free-form fields. External error logs (Cloudflare, Supabase) carry only opaque IDs.
Rate limiting & abuse controls
AI copilot, voice transcription, and manual-search endpoints share one token-bucket limiter keyed per caller. Unauthenticated probes are throttled before any model call so a script cannot burn credits, and a blocked call returns a retryAfterSec hint plus a rate_limited audit event. Limits are declared in one table, so every surface behaves identically.
Transport, encryption & browser hardening
All traffic is HTTPS with HSTS. Managed Postgres and object storage are encrypted at rest by the platform provider. Every response also carries a strict Content-Security-Policy, a frame-ancestors lockdown, X-Content-Type-Options: nosniff, and a tight Referrer-Policy — applied centrally in the server middleware, not per route.
SAML 2.0 single sign-on
Enterprise plans support SAML SSO with Okta, Azure AD / Entra ID, Google Workspace, OneLogin, JumpCloud, and any compliant IdP. We configure the connection from your IdP metadata URL — give us the URL and the email domains to claim. SCIM 2.0 user provisioning is on the roadmap. Email us to start the SSO setup.
Compliance & questionnaires
SOC 2 Type II is in progress. For active questionnaires (CAIQ, SIG Lite, vendor risk forms), security architecture reviews, or a signed DPA / BAA, email security@wellboregenius.com with your timeline and we'll route to the right person within 1 business day.