Security Overview
What we do, what we don't, and what's still in motion. This document is written for the person at your company who will sign the security questionnaire.
1. Architecture in one sentence.
Customer messages enter through tenant-scoped webhook endpoints, get routed to Aria with retrieval over your encrypted tenant knowledge base, and return through the same channel they came in on. Sensitive values are stripped before any transcript is persisted to a ticket, handed to your team, or written to a log (see PII redaction below). Every step is logged. No customer data passes through our marketing infrastructure.
2. Encryption.
- In transit: TLS 1.2 or higher for every external connection. HSTS enforced on our marketing site and on customer-facing widget endpoints.
- At rest: tenant data lives in a managed Postgres database on Supabase with at-rest encryption provided by the underlying storage layer, and every query is scoped to the authenticated tenant by row-level security. Knowledge files use server-owned, tenant-isolated OpenAI vector revisions.
- Secrets: integration credentials, API keys, and webhook secrets are stored encrypted in the tenant database (Fernet, AES-128-CBC + HMAC), never in application code or environment variables checked into source control. AWS Secrets Manager migration is on the v1.1 roadmap.
3. PII redaction pipeline.
Every customer message is scanned for sensitive content. Matched values are stripped before the transcript is written into a support ticket, handed to your team, or recorded in an audit log. Pattern coverage today:
- US Social Security Numbers written in the usual 3-2-4 grouping, with dashes, spaces or dots
- Payment card numbers (Luhn-validated)
- AWS access keys (
AKIAprefix) - Stripe live and test keys (
sk_live_,sk_test_) - GitHub tokens (
ghp_,gho_,ghs_) - Generic high-entropy strings that fingerprint as secrets
Matched values are replaced with [REDACTED] in the persisted transcript — the version that lands in tickets, team handoffs, and audit logs. Redaction runs on the way in, before the message reaches the model or the session transcript, so the original is not retained anywhere. Emails and phone numbers are kept in tickets so your team can act on them; audit logs strip those too.
4. Tenant isolation.
Knowledge base files and conversation history are isolated per tenant. Server-side resolution selects the tenant's active OpenAI vector revision; browser requests cannot supply an authoritative vector-store identifier. Every indexed document carries tenant, version, full content hash, and source attributes, and cross-tenant retrieval probes gate activation.
Aria's reasoning loop has no path to the file index of any other tenant. There is no shared embedding space across customers.
SMS phone numbers follow the same isolation discipline. A phone number is stored under one partner tenant, used only within conversation threads that originated from that partner's intake, and never reused across tenants. Outbound SMS routes through a per-tenant Twilio Messaging Service so messages carry the partner's brand identity at the carrier level, not ours. Each partner's toll-free number goes through Twilio Toll-Free Verification before SMS is enabled (unverified → pending → verified); see the compliance roadmap for current status. Opt-out state (cs_pro_sms_opt_out) is partner-scoped: opting out of one partner's SMS does not opt out of another's.
5. Authentication and access control.
- Customer authentication: email and password, or a magic-link email. Enterprise workspaces can sign in through their own identity provider over OpenID Connect (Okta, Microsoft Entra, Google Workspace, or any conformant provider), with PKCE, a verified
id_token, an optional email-domain allowlist, and optional just-in-time seat provisioning. SAML 2.0 and SCIM directory sync are on request rather than self-serve — talk to us if you need either. - API authentication: tenant-scoped bearer tokens, signed and carrying role-derived permissions that are checked per endpoint. They are stateless — verified by signature, never stored server-side, so there is no key table to breach. Enterprise workspaces can present their own identity provider's tokens over OIDC instead. We do not currently issue long-lived API keys or offer per-key IP allowlisting; if you need either, ask before you sign.
- Webhook signing: every inbound webhook is HMAC-signed and verified against the public URL the provider signed against (proxy-headers respected). Stripe and HubSpot use SHA-256, Twilio uses SHA-1 per their respective specifications.
- Internal access: least-privilege access, audit-logged. As a sole-founder operation today, the operator (Michael Neubauer) is the only person with production data access; every read is logged.
6. Logging, monitoring, and incident response.
Every conversation turn produces a structured audit record: tenant ID, timestamp, model used, latency, tool calls, redaction matches, and outcome (resolved / escalated / failed). Audit records are retained 12 months, append-only, with restricted access. Each row is hash-chained to the one before it and its own contents, so a record cannot be altered or removed after the fact without the chain failing verification. PII in the record body is redacted at write time rather than on a retention timer.
We monitor for anomalies in error rates, latency tails, and authentication patterns. Confirmed incidents are communicated to affected customers within 24 hours of confirmation, with a written postmortem within 7 business days.
7. Vulnerability management.
- Dependency audit via
pip-auditbefore a release goes out. As of 24 August 2026 the shipped dependency set has no known vulnerabilities; the only advisory anywhere in the toolchain is againstpipitself, which builds the image and does not run in it. - Secret scanning through GitHub push protection, plus a
detect-secretspass over the tree. Our hosted CI pipeline defines both as automatic gates, but that pipeline is not currently running — see the honesty note below — so today these are run deliberately rather than on every commit. - Container images are rebuilt from the base image on every release, which is how base-image security updates reach production. We do not currently rebuild on a fixed weekly schedule.
- No external penetration test has been performed yet. We will not describe one as routine before the first one has happened; it is on the roadmap alongside SOC 2 Type I.
8. Backup and recovery.
Database backups are managed by Supabase's automated backup mechanism for our current plan; ask us for the retention window and recovery options in force on the day you sign, and we will show you the plan we are on rather than a tier we are not. Knowledge bytes and immutable vector revisions are versioned by full content hash, so a validated prior OpenAI revision can be reactivated per tenant. The full backup procedure is documented in the operations runbook.
9. Compliance roadmap.
SOC 2 Type I: engaging Vanta; target Q4 2026. SOC 2 Type II: 12 months after Type I sign-off. HIPAA: BAA template drafting, target Q1 2027 (gated on Type I completion). GDPR: standard contractual clauses + Data Processing Agreement template drafting, target Q1 2027. Data residency: all customer data is stored and processed in the United States. We do not currently offer EU region pinning on any plan, and we will not sell it until a second region is actually running.
10. Subprocessors.
We use a small set of infrastructure providers, each used under the data-processing terms in its own standard customer agreement. We have not yet executed separate negotiated Data Processing Agreements with these providers. We will put one in place before processing customer data on behalf of a business that requires it; if that is a procurement condition for you, ask us for the current status before you sign. Current list, with the reason each is necessary:
- Anthropic — model inference and prompt caching. Conversation content is sent here to generate responses.
- OpenAI — vector stores for knowledge-base retrieval, and provider health checks. Your knowledge-base content is indexed here; model inference no longer runs on this provider.
- Cloudflare — marketing site, edge caching, DDoS protection, transactional KV. The marketing surface never touches customer conversation data.
- Fly.io — tenant runtime compute. Tenants share one application; isolation is logical, enforced in the data layer rather than by separate processes.
- Supabase — managed Postgres for tenant data. Tenants share one database; isolation is row-level security, with every query bound to the authenticated tenant.
- Redis — rate-limit counters, session locks, and delivery idempotency keys. Holds IP addresses and session identifiers, not conversation content.
- Sentry — application error monitoring. Receives error stack traces; customer conversation content is not sent.
- Resend — transactional email (sign-in links, contact form, dunning). Customer conversation content never passes through Resend.
- Twilio, Stripe, HubSpot, Slack, Gmail, Google Sheets, Calendly, Zendesk — invoked only with credentials you explicitly authorize, only on your behalf. This also covers any additional helpdesk/CRM integration you connect through the operator dashboard (Front, Gorgias, Salesforce, Kustomer, Jira Service Management, ServiceNow, Help Scout, Intercom, Freshdesk, Zoho, Pipedrive) — each is invoked only with the credentials you provide for that connection.
Full subprocessor list with addresses and processing categories: available on signed NDA. We give 30 days' notice before adding a new subprocessor.
11. Responsible disclosure.
If you find a security issue, send a responsible disclosure. We acknowledge within 1 business day, triage within 5, and credit researchers in our public security notes if you'd like.
12. Contact.
Security questionnaires, SOC 2 letter requests, BAA requests, custom architecture diagrams: contact us.