Security

VERITY Security Model

This page describes the layers behind the “Encrypted” indicator you see in VERITY. It is the authoritative reference for what VERITY does and does not guarantee today. VERITY is an early-stage product; the controls below are described alongside their limits, honestly.

Security model v1.3 — last reviewed July 9, 2026.

Data in transit — TLS

Every network hop is encrypted with TLS.

  • Application traffic. Production traffic is served over HTTPS only. TLS is terminated at the edge, and any HTTP request is redirected to HTTPS.
  • Database connection. The database connection requires SSL in any non-local environment. This is enforced at startup — if the TLS requirement is missing, the application refuses to boot.
  • AI provider calls. All calls to Anthropic (Claude) and Deepgram (transcription) travel over HTTPS via the providers' official SDKs.
  • File uploads. Uploads and downloads of client files are HTTPS-only.

Data at rest

  • Database. Client data is stored in PostgreSQL hosted on Neon, which encrypts stored data at rest by default (AES-256 on the underlying AWS-managed volumes).
  • Uploaded files. Uploaded files are stored with private access. Unauthenticated attempts to reach a private file's URL return a 403. Files are served only through an authenticated download route that verifies ownership against the signed-in professional's session before streaming the file back. Files uploaded before the private-storage cutover are being migrated; until that migration completes, those earlier files may remain reachable at their original URLs.

Application secrets

  • Session signing key. Professional sessions are signed with a server-side secret that is required at startup. Rotating it invalidates existing sessions.
  • API keys & tokens. Provider API keys (Anthropic, Deepgram) and the file-storage token are stored as server environment variables. They are never shipped to the browser and are consumed only in server-side code paths.

Abuse & rate limiting

Requests to VERITY's API are protected by a distributed, sliding-window rate limiter (Upstash Redis). If that limiter is not configured in a production environment, the application fails closed — it refuses to run unprotected rather than serve traffic without limits. During a transient Redis outage at runtime, account registration fails closed, while in-progress client and professional requests are deliberately allowed through so an outage never strands a client mid-conversation — a documented availability trade-off, not an oversight.

What the “Encrypted” indicator does & does not claim

It claims

Client data is encrypted in transit (TLS at every network hop) and at rest (Neon AES-256; default file-storage encryption). Professional authentication secrets are managed server-side.

It does not claim

  • HIPAA certification (not yet held)
  • SOC 2 attestation (not yet held)
  • End-to-end encryption in the zero-knowledge sense — AI providers see plaintext during extraction
  • Customer-managed keys (not yet supported)

Audit trail

Raw client inputs — messages, audio transcripts, and uploaded documents — are append-only and are never hard-deleted. A soft-delete is available at both the intake and professional level, but the underlying record history is preserved for forensic auditability.

Known limitations

We would rather tell you where we are not yet than imply a maturity we have not reached:

  • No centralized observability (log drain or error monitoring) yet. Production errors surface only in the hosting platform's runtime logs.
  • No formal penetration test has been performed.
  • No user-facing privacy policy, Terms of Service, or self-service data-deletion route yet.
  • Prompt injection: client content is fenced as untrusted data in every AI prompt, every extracted fact's citation quote is verified as a verbatim substring of what the client actually said (unverifiable quotes are downgraded, never trusted), and a contradiction can only be resolved by the client's verbatim clarifying words. We now run an adversarial injection test suite against this path — attacks that try to make the assistant declare the intake complete, reveal its instructions, switch into giving legal advice, break out of the untrusted-content fence, or plant fabricated facts and citations, in both English and Spanish. In our most recent run the assistant resisted every case, and the citation-verification layer rejected every fabricated quote. Stated plainly: this is mitigation, not proof — the suite is small and not exhaustive, injected text can still color how the AI reads the data around it, and no formal third-party penetration test has been performed.
  • Rate limiting fails open (except registration) during a transient Redis outage, and files uploaded before the private-storage cutover remain at their original URLs until the migration completes — both described above.

Questions

Security questions get direct answers, not stalling. Reach out to Ryan Gruzen.