Security and deployment
TruthLock is built so that the customer holds the data, the keys, and the boundary. What follows is how, and what we do not do.
Isolation
A dedicated deployment is its own VPC in its own AWS account, either yours or one we provision for you: ECS Fargate for the API and workers, RDS Postgres with pgvector, ElastiCache, S3, CloudFront for the admin app, Cognito or your own OIDC provider for sign-in, KMS for signing, Secrets Manager for credentials, CloudWatch for logs and traces. Terraform builds it. There is no shared control plane holding your records.
Inside a stack, a company owns organizations. Each organization is one knowledge domain with its own hierarchy, connectors, agents, and policies. Users see only the organizations they can reach.
For teams evaluating or running at small scale, a pooled deployment runs the same code with many companies in one stack. Every table is scoped by company, every route is tested for scoping, and Postgres row-level security enforces it beneath the application. Anyone who needs their own region, account, or auditor-facing boundary moves to a dedicated stack with an export and no code change.
Proof
Each standing record is serialized canonically, hashed claim by claim into a Merkle tree, and the root is signed with an asymmetric key in AWS KMS inside your stack. Key material never leaves KMS. Attestations are append-only: a later adjudication, invalidation, or source supersession issues a new attestation linked to the old one, and the old one continues to validate while stating that it was superseded and why.
Evidence used at grading time is snapshotted to your S3 bucket with its hash and fetch time. A URL alone is not producible six months later. The snapshot is.
An optional second anchor to a public chain provides an outside timestamp for customers who want proof that does not depend on anyone's key. It is off by default and no stack is required to run a wallet.
Model providers
Each provider is configured per company with one of three modes: platform key, your own key, or not configured. Your keys are stored in Secrets Manager under your company prefix, validated with a cheap call on save and daily, shown masked, never returned after entry, and rotated by replacement. The standing record pins the provider, model, and a fingerprint of the credential that produced it.
On AWS, Bedrock through an IAM role gives you Anthropic, Meta, Mistral, and Amazon models with no key to manage and no data leaving your account. Anthropic, OpenAI, Google, and xAI are supported directly. Any OpenAI-compatible endpoint, including self-hosted vLLM or Ollama, can be added with a base URL.
Zero-retention agreements with a model vendor are yours to sign, and they apply because the calls come from your keys.
Access
Email and password with argon2id hashing, optional authenticator app, server-side sessions behind an httpOnly cookie, throttled failed attempts, sign-out everywhere. Or OIDC to your identity provider.
Owner, admin, editor, reviewer, viewer, member, plus custom roles holding any capabilities their creator holds. Nobody can grant more than they have. A company always keeps at least one active owner.
A role is held company-wide or in one organization. Teams live inside an organization and carry one role.
The same capability table decides what the sidebar shows, whether a page is read-only, and what every API route refuses. The API cannot do what the screen would not let you do.
Hashed at rest, scoped to an organization and a capability set, revocable, with a webhook secret per key.
Sign-ins and failures, invites, role and team changes, key and organization changes, policy edits, adjudications, with actor, before, and after.
Data
We do not train on your data, we do not share it across customers, and in a dedicated stack we do not have a path to read it.