01Identity verified on the server
Every request resolves the signed-in identity, academy membership, and role on the server before any data is read or changed. Browser-supplied tenant or role values are never trusted. Sign-in runs through Supabase Auth, with Google sign-in available, using authorization-code flow with PKCE.
02Tenant isolation at the database
Each customer table is tenant-scoped and protected by forced Postgres row-level security. Repositories are tenant-scoped in code as well, and cross-tenant and anonymous access are covered by automated tests.
03Encryption
TLS protects all traffic. Databases, backups, and storage are encrypted at rest by our providers. Google Workspace tokens are additionally encrypted at the application layer with a server-only key, and the application connects to the database over certificate-verified TLS.
04Human approval before effects
Schedule changes, guardian-facing messages, sensitive feedback, learning records, payments, and every external send require an authorized person’s approval. Sandbox, pending, failed, and externally executed states are shown distinctly, and a sandbox capture is never presented as a real send.
05AI guardrails
Deterministic rules decide validity, authorization, and persistence; models only interpret and draft. Inputs are minimized before leaving our systems (first names only, contact details and sensitive numbers stripped, task-scoped context). Each AI feature has its own switch, per-user rate limit, and per-academy daily budget, with a rules-only fallback and a kill switch. Model providers are contractually prohibited from training on our data.
06Minimized logs, append-only audit
Request logs use a strict metadata allowlist that excludes message content, identities, tenant values, network addresses, tokens, and secrets. Business changes are written to an append-only audit trail with actor, action, and time.
07Verified external events
Webhooks from Stripe, Resend, and Twilio are signature-verified and replay-protected before they change any state.
08Secrets and release gate
Credentials live in the hosting platform’s encrypted environment and never reach the browser. Every release must pass type checking, the full test suite including authorization and tenant-isolation tests, dependency audit, source hygiene, and performance budgets before it can be deployed.