Trust & Security

What we do with your meeting data, and how we enforce it.

Every claim below names the mechanism that enforces it, in this codebase, today — not a promise, a policy you can check. Where something isn't true yet, we say so.

Claims & how they're enforced

No hidden or silent recording. Capture starts only from an explicit action you take — there is no "record everything automatically" mode.

Enforced byDesktop Companion requires pressing Record; docs/TRUST_CONSENT_AND_PRIVACY.md §1.1.

A persistent recording indicator is shown in the app window and the system tray for the whole time capture is active.

Enforced byDesktop Companion tray + in-app indicator; docs/TRUST_CONSENT_AND_PRIVACY.md §1.2.

A link you share shows the meeting summary and action items only — never the transcript or the recording — unless you explicitly widen what it includes.

Enforced byPublic share page (`/s/[token]`) renders summary-only by default; team shares mask the transcript unless scope is explicitly set to full.

Marking a meeting "Sensitive" removes it, fail-closed, from AI memory, cross-meeting search, and the AI/MCP connector, and blocks new shares of it.

Enforced byThe `is_sensitive` flag is checked in embed-meeting, extract-memory, search-memory, memory-catchup, and dashboard/lib/mcp/source.ts — all exclude sensitive meetings by default (deny unless explicitly allowed).

AI-inferred speaker names and client-name guesses are visibly labeled "AI guess" until you confirm them — never shown as fact.

Enforced bycomponents/meetings/speaker-editor.tsx renders an "AI guess" badge that only clears once you edit/confirm the label.

Every account's data is isolated with Postgres Row-Level Security — one customer can never read another customer's meetings, transcripts, clients, or settings.

Enforced byRLS is enabled on every table; a CI check (supabase/migration-tests/rls-coverage-drift.ts) fails the build if a new table ships without it.

Deleting your account removes every row you own — meetings, transcripts, clients, forms, audit history — plus the recording files in storage, then your login itself.

Enforced byExplicit ordered cascade + storage purge in dashboard/lib/account/delete-cascade.ts, self-serve from Settings → Danger Zone (POST /api/account/delete).

Deleting a single meeting removes it from your workspace and switches off every Protokol link to it straight away, including any public recap page, and cancels any delivery still queued for it. You can restore it for 30 days. Permanent deletion of the underlying recording and transcript is built and tested but is not yet switched on in production, so a soft-deleted meeting has no automatic purge date today.

Enforced bymeetings.deleted_at soft-delete today. The link kill is the same column: lib/share/public-link-availability.ts (the gate every public route goes through) and the WHERE clause of get_public_dossier. Queued deliveries are cancelled or revoked by POST /api/meetings/[id]/delete via lib/delivery/stop-on-delete.ts, and dispatch-deliveries refuses any schedule whose meeting it cannot confirm live. Restore is refused past 30 days (lib/meetings/restore-window.ts). supabase/functions/purge-deleted-meetings still ships with PURGE_ENABLED off and its cron inactive (lib/retention.ts CLOUD_PURGE_ACTIVE = false, DEC-0042); when it is armed, FK-cascade correctness is enforced by the CI guard meetings-erasure-cascade-drift.

Outbound webhook deliveries to your own systems (Zapier, Make, n8n, a generic endpoint) are HMAC-SHA256 signed once you set a webhook secret, with a timestamp that blocks replay.

Enforced bysupabase/functions/_shared/webhook-signature.ts signs `${timestamp}.${body}`; receivers verify the signature plus a replay window.

Data is encrypted in transit (TLS) and at rest; Protokol's primary database and recording storage are hosted in the EU.

Enforced bySupabase project hosted in eu-central-1 (platform-managed TLS + at-rest encryption).

Who processes your data

A factual inventory of the vendors involved in running Protokol — not a legal sub-processor agreement (that's the DPA, which lists the same table). Kept in one place (lib/dpa.ts) so this page and the DPA can never drift apart.

VendorPurposeRegion
GoogleCalendar & Drive integration; Gemini AI transcription/analysisEU / US
MicrosoftOutlook calendar & Teams integrationEU / US
SupabaseDatabase, auth & file storageEU (eu-central-1)
BrevoTransactional email (recaps)EU
PaddlePayments (merchant of record)EU / US
VercelDashboard hosting & CDNGlobal edge

What we don't claim

  • No certification is claimed. Protokol does not hold SOC 2, ISO 27001, or HIPAA certification today.
  • No accuracy percentage is claimed for transcription or extraction. Every dossier answer links back to an exact quote in the transcript so you can check it yourself.
  • Automatic purge of soft-deleted meetings is not live yet — the scheduled hard-delete job exists in code but ships disabled. See "Deleting a meeting" above.

Verify an evidence pack

Handed a Compliance Evidence Pack by one of our customers? Check its integrity and export provenance yourself — no login required.

Go to the pack verifier