Skip to main content
ControlFrame

Subprocessors

5 current or deployment-selected subprocessors, derived by reading the dependency manifest, host configuration, and modules that open outbound connections. Each row names the file that establishes it.

Reviewed 2026-08-28

The vendors that can see ControlFrame data

ControlFrame subprocessors
VendorPurposeData categoriesRegionDPA
Netlifyalways in the pathApplication hosting, serverless functions, CDN, DNS, and private aggregate storage for controlframe.aiHTTP request metadata used for hosting and edge abuse limiting, function execution logs, session cookies in transit, identifier-free public homepage Web Vitals histograms, and — where object storage falls back to Netlify Blobs — evidence artifacts and run recordsProvider-operated edge and hosting regions; no contractual residency restriction recordednot recorded
Supabasealways in the pathManaged PostgreSQL for the control plane, and its managed backupsAll tenant application data: organizations, projects, identities and sessions, audit runs, control results, evidence object metadata and content digests, the hash-chained access logAWS us-east-2 (United States)not recorded
Anthropicreached only on a specific pathManaged frontier inference for agentic evidence planning and run reviewPrompt content for the routed purpose. Payloads classified `restricted` are denied to this boundary by default and the denial is recordedProvider-operated regions; no contractual residency restriction recordednot recorded
Resendalways in the pathTransactional email for invitations, account verification, password reset, engagement and recipient-mailbox delivery, and inquiry follow-upRecipient name and email address, organization and role context where included, time-bounded invitation/verification/reset/recipient links, engagement or mailbox delivery context, and fields submitted through the public inquiry flowProvider-operated regions; no contractual residency restriction recordednot recorded
S3-compatible object storagenamed by the deploymentEvidence artifacts, export packages, and content-addressed objectsEvidence artifacts and export packages, stored under tenant-scoped keysNamed by the operator at deployment time; the platform ships no defaultnot recorded
Why every DPA cell reads not recorded
ControlFrame keeps no executed data-processing-agreement register today, so every row reads `not recorded` — including rows where the vendor publishes standard terms we have not countersigned. The column will carry an executed date and instrument per vendor once counsel review completes. Recording `in place` before that register exists is the claim a diligence team verifies first.
Derivation

Where each row came from

This list was not copied from a template. A subprocessor list with an invented row is a compliance finding; one missing a real row is a bigger one. So each entry carries the files that establish the outbound dependency, and a reviewer can grep for them.
Netlify
Provider-operated edge and hosting regions; no contractual residency restriction recorded
  • netlify.toml
  • @netlify/plugin-nextjs (package.json)
  • @netlify/blobs in lib/audit-platform/storage.ts, lib/runs/blobs-store.ts, lib/gtm/lead-capture.ts, lib/observability/public-web-vitals-store.server.ts
Supabase
AWS us-east-2 (United States)
  • prisma/schema.prisma (datasource db, provider postgresql, url env DATABASE_URL)
  • docs/DESIGN-CREDENTIALS-AND-TRUST.md §B3

This is the database the tenant shield protects. The runtime connects to it as controlframe_app, which is neither a superuser nor BYPASSRLS.

Anthropic
Provider-operated regions; no contractual residency restriction recorded
  • @anthropic-ai/sdk in lib/ai/model-router.ts
  • lib/ai/egress-gate.ts (deny-by-default for restricted payloads to external-managed boundaries)

Reached only when the deployment routes to the managed-frontier mode. A deployment pointed at a customer-controlled model endpoint does not reach this vendor at all.

Resend
Provider-operated regions; no contractual residency restriction recorded
  • https://api.resend.com/emails in lib/auth/auth-email-transport.ts
  • lib/auth/invitation-email.ts, lib/auth/email-verification.ts, and lib/auth/password-reset-email.ts
  • engagement and recipient-mailbox email call sites through the shared auth email transport
  • https://api.resend.com/emails in lib/gtm/lead-notification.ts
S3-compatible object storage
Named by the operator at deployment time; the platform ships no default
  • @aws-sdk/client-s3 in lib/audit-platform/storage.ts
  • CONTROLFRAME_OBJECT_STORAGE_{PROVIDER,BUCKET,REGION,ENDPOINT}

Provider, endpoint, region and bucket are all supplied by the deployment. An Enterprise customer pointing this at their own bucket in their own region makes this row theirs rather than ours — which is the intended arrangement, and the reason it is listed as a shape instead of a named vendor.

Boundaries

What is deliberately not on this list

A subprocessor list that includes everything is a list nobody reads carefully. These three are the categories a reviewer would reasonably ask about, with the reason each sits outside the arrangement.
Systems ControlFrame collects evidence from
They are the customer's own targets, configured and credentialed by the customer. ControlFrame is not their processor; it is a client of them on the customer's instruction.
The private runner
It runs inside the customer's boundary and is operated by the customer, so the runner itself is not a subprocessor. Credentials and signing private keys remain runner-side; legacy-selected artifact bytes may enter ControlFrame's governed custody, while Runner v2 is currently verify-only and cannot collect or transfer artifacts.
Build and development tooling
It never holds production data. A subprocessor list that includes a linter is a list nobody reads carefully.
Change notification

How a change to this list reaches you

Notification of change is a standard DPA clause, and a list published without a notification path does not satisfy it. Today the path is the contact channel named in the privacy notice; a dedicated subprocessor-change subscription is not yet provisioned. This page states that rather than implying one exists.

Read the effective privacy notice · Back to the trust center

Subprocessors | ControlFrame