Security and deployment

The record is only worth something if nobody, including us, can quietly change it.

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

One stack per customer.

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.

Pooled tier

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

Signed with a key you control. Superseded, never edited.

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

Your keys, or none at all.

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

Roles are sets of capabilities. One table drives everything.

Sign-in

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.

Roles

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.

Scope

A role is held company-wide or in one organization. Teams live inside an organization and carry one role.

One authority

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.

API keys

Hashed at rest, scoped to an organization and a capability set, revocable, with a webhook secret per key.

Audit log

Sign-ins and failures, invites, role and team changes, key and organization changes, policy edits, adjudications, with actor, before, and after.

Data

What we hold, and for how long.

  • Responses and questions you submit, which may contain personal data. Retention is set per organization. Redaction hooks run before storage when you configure them.
  • Evidence snapshots from your connectors, in your bucket, encrypted at rest with your keys.
  • Connector credentials in Secrets Manager. External connectors query your stores and never copy the corpus.
  • Standing records and attestations, which are the product and are kept for as long as you keep the stack. Records are exportable as a bundle at any time.

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.

Ask us the hard questions. We wrote the threat model before the code.