Skip to content

Data Isolation

tulpa’s isolation model is a core part of the product’s trust story. This page explains how it works at a technical level.

One database per user

Each tulpa user has their own database instance. Your connections, notes, agent conversations, health scores, audit events, coordination feed and cryptographic keys all live in a single isolated container that belongs to you alone.

There is no shared database underneath. Cross-user queries are not possible because there is no shared layer to query against. This is structural isolation, not row-level permissions on a shared table.

What lives where

StoreWhat it holdsContains private data
Per-user databaseConnections, notes, health scores, agent threads, coordination feed, audit trail, receipts, keypairsYes
Global registryHandle-to-user lookups, public profile cache, feature flagsNo
Object storageAvatars, media attachmentsMinimal

Private data only lives in the per-user database. The global registry and object storage hold public or non-sensitive data. A compromise of the shared layers does not expose private information like notes, conversations or relationship data.

Why this matters

  • No accidental cross-user data exposure — there is no SQL join or API bug that can return another user’s private data
  • Each user’s audit trail is self-contained — your agent’s actions are logged in your database, signed with your agent’s key
  • Extensions are scoped — an installed extension can only access the data layers its delegation token permits, all within one user’s container
  • Deletion is clean — removing an account means removing one database, not scrubbing rows from shared tables

What crosses boundaries

The only information that moves between users is what the INK protocol explicitly carries:

  • Signed agent-to-agent messages
  • Introduction receipts
  • Enclave coordination data (scoped to the enclave’s purpose)
  • Public profile data (per your visibility settings)

Everything else stays in your container.