Security

How we protect school data

Every school's data lives in its own isolated database, and every request runs through the same hardening layer regardless of plan.

Per-tenant isolation

Each school is provisioned its own database. Application code resolves the tenant from the request hostname before any query runs, so one school's data is never reachable from another's session.

Account protection

  • Passwords are hashed with bcrypt, never stored in plain text
  • Login attempts are rate-limited to slow down brute-force attempts
  • Sessions are server-side, signed, and httpOnly

Request hardening

  • Content-Security-Policy with per-request nonces
  • CSRF tokens required on state-changing forms
  • HTTPS is enforced in production

Access control

Staff, admin, parent, and student portals are permission-scoped — each role only reaches the routes and data its permission set allows, enforced on every request, not just in the UI.

Audit trail

Sensitive actions inside a school's portal (records changes, approvals, settings edits) are written to an audit log that administrators can review.

Found an issue?

If you believe you've found a security vulnerability, please contact us directly rather than filing a public report, so we can investigate before any details are shared.