DEALITHIC
SECURITY
Built for institutional deal teams. This document outlines the technical and operational controls governing how DEALITHIC stores, processes, and protects confidential deal data — from infrastructure to authentication to document handling.
DEALITHIC supports two authentication methods, both handled server-side with no secrets exposed to the client. Authentication state is scoped to the authenticated session and access to deal data is isolated per user account.
| Control | Implementation | Status |
|---|---|---|
| Google OAuth 2.0 | PKCE authorization code flow via Google Identity Platform. Tokens exchanged server-side only. User identity verified against Google's token endpoint before account creation or login. | ✓ PASS |
| Email / Password Auth | Passwords hashed with bcrypt (cost factor 10) on registration. On login, bcrypt.compare() is used — raw passwords are never logged, stored, or transmitted beyond the initial POST body. | ✓ PASS |
| Password Reset Flow | Cryptographically secure 256-bit random token (Node.js crypto.randomBytes). Token expires after 1 hour. All prior unused tokens invalidated on each new reset request. Reset links sent via authenticated transactional email. | ✓ PASS |
| Anti-Enumeration | The password reset endpoint returns HTTP 200 regardless of whether the email exists in the system, preventing attackers from enumerating registered accounts. | ✓ PASS |
| Minimum Password Policy | Passwords must be at least 8 characters. Enforced server-side on all registration routes — client-side validation is supplementary only. | ✓ PASS |
| Service Key Isolation | Supabase service-role keys are only accessible within server-side API routes (Next.js Route Handlers, Railway backend). They are injected via environment variables and are never exposed to or usable from client-side JavaScript. | ✓ PASS |
| Input Normalization | All email addresses are trimmed and lowercased before persistence or comparison, preventing case-variation account duplication or bypass attempts. | ✓ PASS |
Every authentication event is recorded to an immutable login_events ledger in the DEALITHIC database. Records capture the authenticated email, authentication method (email/password or Google OAuth), and UTC timestamp on every sign-in — regardless of session outcome.
User account records also maintain a last_login timestamp updated on each successful authentication. This provides a per-account audit trail suitable for access reviews.
- Login event log — email, auth method, and UTC timestamp on every sign-in
- Per-account last_login — always current, updated server-side on authentication
- Deal audit trail — deal creation, analysis runs, and sharing events tied to authenticated email
- Signup event log — new account creation events captured with method and timestamp
- Webhook audit — CRM sync events logged with email and event type on account creation
- Zero secrets in source code — all API keys, database credentials, and signing secrets are injected via environment variables through Vercel and Railway's encrypted variable stores
- Principle of least privilege — each service is provisioned with only the credentials required for its function; the frontend holds no direct database credentials
- Server-side-only secret access — Supabase service keys, OpenAI keys, Resend keys, and Stripe keys are accessible only within server-side execution contexts, never bundled into client JavaScript
- Webhook authentication — internal service-to-service webhooks (e.g. CRM sync) require a shared secret transmitted via a dedicated header, validated before processing
- Dependency management — Node.js and Python dependencies are pinned and managed via package.json and requirements files; supply chain integrity maintained through standard package registries
- No persistent infrastructure — the application runs entirely on managed cloud services; there are no self-managed servers, VMs, or bare-metal hosts requiring manual patching
DEALITHIC's infrastructure stack is composed exclusively of vendors that maintain SOC 2 Type II or equivalent enterprise certifications. No deal data transits vendors outside this tier.
| Vendor | Role | Certification / Posture |
|---|---|---|
| Vercel | Frontend hosting, serverless API execution, CDN | SOC 2 Type II · ISO 27001 · GDPR-compliant DPA available |
| Supabase | PostgreSQL database, row-level access | SOC 2 Type II · HIPAA-eligible add-on · ISO 27001 · GDPR-compliant |
| Railway | Backend API / inference engine hosting | SOC 2 Type II in process · encrypted secret store · isolated containers |
| OpenAI / Anthropic | AI analysis engine (deal memo generation) | SOC 2 Type II · enterprise data processing agreements available · zero training use of API data |
| Resend | Transactional email (auth, notifications) | SOC 2 Type II · GDPR compliant · TLS email delivery |
| Stripe | Payment processing | PCI DSS Level 1 · SOC 2 Type II · no card data touches DEALITHIC servers |
| Google Identity | OAuth 2.0 authentication provider | ISO 27001 · SOC 2/3 · FedRAMP authorized |
The following controls were verified through internal security review in May 2026. An independent third-party penetration test is scheduled as part of the SOC 2 engagement.
| Test | Method | Result |
|---|---|---|
| TLS enforcement | Verified HTTPS redirect on all routes; confirmed TLS 1.3 via SSL Labs scan | ✓ PASS |
| Password hashing | Confirmed bcrypt hash output in database; verified no plaintext fallback path exists in registration or login routes | ✓ PASS |
| Password reset token entropy | Verified 256-bit entropy via crypto.randomBytes(32); confirmed 1-hour expiry and single-use invalidation logic | ✓ PASS |
| Email enumeration resistance | Confirmed password reset returns HTTP 200 for both registered and unregistered emails; response body and timing indistinguishable | ✓ PASS |
| Cross-account data access | Verified all deal retrieval queries are scoped to the authenticated user's email; no route returns deal data without email scope | ✓ PASS |
| Client-side secret exposure | Audited Next.js bundle; confirmed service-role keys, AI API keys, and webhook secrets are absent from all client-side JavaScript bundles | ✓ PASS |
| OAuth code replay | Confirmed authorization code is single-use per Google OAuth spec; replay of a consumed code returns invalid_grant from Google's token endpoint | ✓ PASS |
| SQL injection | All database queries use Supabase's PostgREST API with encoded URL parameters; no raw SQL construction in any route handler | ✓ PASS |
| Webhook authentication | Verified x-dealithic-secret header required and validated on all internal webhook endpoints; requests without valid secret rejected | ✓ PASS |
DEALITHIC takes security disclosures seriously. If you identify a potential vulnerability, please report it to security@dealithic.co. We will acknowledge receipt within 1 business day and aim to remediate confirmed findings within 14 days.
We ask that you do not exploit vulnerabilities or access data beyond what is necessary to demonstrate the issue. We will not pursue legal action against researchers acting in good faith under these guidelines. A formal bug bounty program is under consideration.