Trust Center

Security posture, by control.

Every security control we operate, with status indicators (live, in progress, planned). For the formal SOC 2 / FedRAMP path see /trust/compliance; for vulnerability disclosure see security.txt.

Last updated 2026-05-09
§01 · Encryption

In transit and at rest.

TLS 1.3 in transit, end-to-end.

Live

Every connection from browser to platform uses TLS 1.3 with HSTS preloading enabled. Older protocols (TLS 1.0, 1.1, 1.2) are disabled at the edge.

AES-256 at rest for production data.

Live

Postgres data is encrypted at rest by Neon (AES-256). Vercel Blob storage is encrypted at rest by Vercel. Backups are encrypted with the same key tier.

Per-request CSP nonces.

Live

Content Security Policy with strict-dynamic is computed per request. Currently in report-only mode while we verify clean telemetry; flipping to enforce mode is a one-env-var change once the 24-48h observation window is clean.

§02 · Access control

Who can do what.

Role-based access across four user classes.

Live

Contractor, Service Provider, Lobbyist, and Admin user classes are isolated at the data and route layers. A contractor cannot read a provider’s leads; an admin’s elevated mutations require a fresh authentication. Implementation: NextAuth JWT with role-bound session callbacks.

Bcrypt-hashed passwords (12 rounds).

Live

No plaintext, no reversible hashes, no recoverable secrets. Password reset emails contain a single-use, time-bound token; the password itself is never sent.

MFA infrastructure shipped, currently disabled platform-wide.

In progress

TOTP MFA + bcrypt-hashed backup codes are shipped on admin / provider / lobbyist login paths. Currently disabled via the MFA_ENABLED env flag (operator decision). Flipping to true restores enforcement for every previously-enrolled user — no re-enrollment required.

Same-origin CSRF defence at the middleware layer.

Live

Every state-changing /api/* request runs an Origin/Referer same-origin check before the route handler. Webhook endpoints (Stripe, intel ingest) and NextAuth callbacks are exempted with their own non-cookie auth.

§03 · Logging & monitoring

What we keep, for how long.

Audit logging on every administrative mutation.

Live

AuditLog rows captured on admin login, role changes, application approve/reject, provider/lobbyist suspension, Stripe Connect onboarding completion. 365-day retention; super_admin queryable.

Incident log

Application observability via Sentry.

Live

Error rate, latency, and unhandled-promise alerts are routed to the operator inbox. PII is scrubbed at the SDK boundary; no user emails or message bodies enter Sentry.