Skip to content
Team & Sharing

Data Privacy and Client Isolation

How Armbrain protects client data, enforces isolation between clients, and handles data ownership.


The Core Guarantee

A fractional CMO's Client A must never see Client B's strategy, brand voice, or campaign data. Armbrain enforces this through three independent layers of protection.


Three Layers of Isolation

1. Application Layer

Every SQL query includes WHERE mind_id = $active_mind. The active client mind is set per-session via switch_client. There is no tool that returns client content across client minds.

2. Ownership Layer

Each client mind has a customer_id that tracks who owns it. The customer_mind_access table tracks shared access for team features. When you switch to a client, Armbrain verifies that you own the client mind or have explicit access.

3. Database Layer (Row-Level Security)

PostgreSQL Row-Level Security (RLS) policies are defined in the schema as a defense-in-depth layer, and public/anonymous database roles have had their table grants revoked so they cannot reach customer data. Full database-level RLS enforcement (where every query is filtered by the database itself, independent of the application) is being rolled out in stages; until that activation completes, the application and ownership layers above are the enforced isolation boundary.


What This Means in Practice

If you switch from Acme Corp to Bluebell and search for "ad budget", you only see Bluebell's ad budget information -- never Acme's, even if Acme's memory is a closer semantic match.

Cross-client analysis (spotting trends across multiple clients) is done by the CMO using their own judgment, not by Armbrain tools. The briefing and briefing tools aggregate statistics (memory counts, meeting counts) but never expose memory content across client minds.


Data Ownership


What Gets Sent Where

DataWhere It LivesWhere It Gets Sent
Client client minds (Brand DNA)Supabase PostgreSQLNowhere beyond the database
Memories (all types)Supabase PostgreSQLNowhere beyond the database
Memory embeddingsPostgreSQL pgvectorNowhere beyond the database
Meeting transcriptsYour local diskLLM for extraction (via gateway)
Memory text (for classification)PostgreSQLGateway to Anthropic API (stateless call)
Memory text (for embedding)PostgreSQLGateway to Voyage AI (stateless call)

LLM Data Processing

When you store a memory or ingest a transcript:

  1. Classification -- The memory text is sent to Claude (via the gateway) for type classification. This is a stateless API call. Anthropic does not retain the data.
  2. Embedding -- The memory text is sent to Voyage AI for vector embedding. Voyage AI does not retain input text after processing.
  3. Extraction -- During transcript ingestion, chunks are sent to the LLM for knowledge extraction. Only the transcript content and client name are included -- never other clients' data.

Sensitive And Internal Notes

When you store or jot a note, Armbrain classifies visibility at write time:

Use sensitive/internal notes for CMO judgment, compensation details, legal/medical details, layoffs, contract terms, or strategic observations you do not want in a client handoff. The capture response includes visibility copy and handoff eligibility so you can see what will and will not be shared.


Data Retention


Security Summary

AspectImplementation
Encryption in transitTLS 1.2+ for all API calls
Encryption at restAES-256 via Supabase
AuthenticationUnique API key per customer
Authorizationcustomer_id + customer_mind_access checks on every operation
Tenant isolationApplication-layer customer_id/mind_id scoping on every query (PostgreSQL Row-Level Security policies are present in the schema; DB-level enforcement activation is in progress)
Audit trailbrand_dna_history tracks all Brand DNA changes
Memory attributionsource_type, source_tool, follows_tool_call track how every memory was created

Error Telemetry

Armbrain collects anonymous error reports to help diagnose issues across the user base. These reports are sent automatically when a tool call fails, and they are designed with privacy in client mind.

What gets reported:

FieldDescription
Error codeThe type of error that occurred (e.g., CONNECTION_TIMEOUT)
Tool nameWhich Armbrain tool failed
Stack trace hashA one-way hash of the error location -- not the actual code or data
Mind ID hashA one-way hash of the active client ID -- not the client name
Client versionYour installed Armbrain version
PlatformYour operating system (e.g., macOS, Linux)

What is NOT reported:

Reports are rate-limited to 10 per minute and sent in the background with a 5-second timeout. If the report fails to send, it is silently dropped -- it never interferes with your workflow.

Opting Out

To disable error telemetry, tell Armbrain in any chat:

Turn off error telemetry

When telemetry is off, no error reports are sent. This does not affect any other Armbrain functionality.


Key Details