Security & compliance posture
This page documents what we have deployed today, what we have committed to ship, and what we have explicitly decided not to pursue at the current company stage. Honesty over polish.
Image processing — landmark detection, mesh fitting, deformation rendering — happens entirely on-device. We cannot see the photo. We cannot store the photo. The only exceptions are explicit-consent flows: the patient clicks “Share with my surgeon” (a hashed reference is transmitted, not the photo) or submits to the public gallery (with admin-reviewed consent).
In transit:TLS 1.3 enforced on all routes via Vercel's edge. HSTS preload eligible. CSP nonce-based with no unsafe-inline on script-src.
At rest: Postgres volumes encrypted by Neon (AES-256). Vercel Blob storage encrypted at rest. Redis TLS-encrypted between client and Upstash.
Secrets: stored in Vercel encrypted env vars, rotated on personnel changes. AUTH_SECRET, POLAR_WEBHOOK_SECRET, and RAZORPAY_KEY_SECRET are never logged.
Every vendor that touches data on our behalf, what they do, and the BAA / DPA status. We update this table within 7 days of any vendor change.
| Vendor | Role | Data | Region | BAA / DPA |
|---|---|---|---|---|
| Vercel | Application hosting + CDN | Request logs (IP, UA) | Global edge | Enterprise plan available |
| Neon (Postgres) | Primary database | Account, profile, simulation metadata | AWS us-east + eu-central | Available |
| Upstash Redis | Rate limiting, session cache | Hashed session IDs | Global edge | Available |
| Vercel Blob | Gallery photos, KYC docs | User-uploaded images | AWS us-east | Available |
| Vercel Edge Config | Per-partner CSP allowlist | None | Global edge | N/A (no PII) |
| Resend | Transactional email | Email address, message body | AWS us-east | Available |
| Polar | Payment processing (USD/THB) | Billing details (Polar = MoR) | Polar-managed | Out of PHI scope (MoR) |
| Razorpay | Payment processing (INR) | Billing details (PCI-managed) | India | PCI; we never see card numbers |
| Sentry | Error reporting | Scrubbed; no PHI/PII reaches Sentry | AWS us-east | Available |
| PostHog | Product analytics | Pseudonymous user ID; PHI scrub | EU primary | Available (Enterprise plan) |
| Cal.com | Consultation booking | Patient name, email, booking time | AWS us-east | Available |
| Cerebras | Chatbot LLM inference | Chat input only (no patient photos) | Cerebras-managed | Under review |
Custom JWT (jose, HS256) issued on email + OTP verification. Cookie name fl-session, httpOnly, secure in production, sameSite=lax, 30-day TTL with refresh on activity.
CSRF: double-submit cookie (fl-csrf) + x-csrf-token header. Required on all mutating routes except the auth boundary itself.
Role-based access: patient, surgeon, admin. Surgeon access additionally requires KYC approval (gov ID + medical council number + clinic certificate) before deal posting or commission collection.
Procurement and audit teams ask this often, so it's worth a row-level breakdown rather than buried prose. Anything marked “legal hold” is required by tax / dispute-resolution / fraud-investigation law and is anonymised (FK link severed) rather than retained as personal data.
| Data | Action on deletion | Reason |
|---|---|---|
| Account profile (name, email, phone) | Hard delete | No legal basis to retain |
| Simulator session metadata + saved presets | Hard delete | Photo never reached us; metadata not needed post-account |
| Subscription + billing-rail metadata | Hard delete | Polar/Razorpay holds the canonical record on their side |
| Gallery submissions you uploaded | Hard delete (incl. blob storage) | Consent withdrawn; blobs removed from CDN |
| Q&A questions you submitted | Anonymise display name → “Anonymous patient” | Public answers help future patients; identifying fields removed |
| Annotations you created (surgeons) | Hard delete | Only the surgeon who created them can read them; on deletion they have no further use |
| Audit logs (admin actions, login attempts) | Legal hold — anonymise, retain | Required for fraud + dispute investigation; FK to user is set null |
| Payment records (orders, refunds, commission) | Legal hold — 7 years | Tax law (India + EU + Polar MoR jurisdictions) |
| Adverse-event reports you filed | Legal hold — anonymise, retain | Clinical-safety record; identifying fields removed |
Self-serve in-app:sign in → Settings → Danger Zone → “Delete account.” The existing flow hard-cascades through account, subscription, simulation metadata, gallery submissions, blob storage, and clears your session immediately.
Email request:if you can't access your account, email privacy@faceifylabs.com with the email address on the account. SLA: deleted within 5 business days, sooner where possible.
What we keep (legal hold): audit logs and payment records (anonymised, FK link severed). These are required by tax + dispute-resolution law for up to 7 years.
Sentry captures application errors with PII scrubbed. PostHog captures product analytics with PHI scrubbed (server-side filter). Authenticated admin actions (gallery moderation, role changes, refund issuance) are logged to the AdminAuditLog table with actor + timestamp + before/after.
A dedicated PHI-tier audit log table (photos, annotations, consultation messages) is on the Q2 roadmap (CTO §4) for first US/EU clinic conversation readiness.
On detection of an incident affecting patient data:
Security questions, BAA / DPA requests, and procurement questionnaires: security@faceifylabs.com
Vulnerability disclosure (responsible disclosure): security@faceifylabs.com with subject prefix [VDP]. We aim to acknowledge within one business day and to remediate or respond within 30.
Related: Trust & Privacy · Clinical safety · Privacy Policy · Terms