Core Concepts

Build-time vs. Runtime Data

The Bivariant platform separates build-time definitions (blueprints) from runtime data (per-organization). This separation is fundamental to multi-tenant isolation and safe distribution.

The platform makes a clear distinction between build-time data (defined in blueprints) and runtime data (created per organization when apps are used). This separation is fundamental to how multi-tenancy, versioning, and distribution work.

Build-time data

Build-time data lives in the blueprint. It defines what an application can do and is shared across all organizations that install it.

ComponentWhat's storedScope
Agent definitionsName, description, avatar, knowledge base config, default flowShared across all installations
Flow definitionsStep graph, input/output schemas, configurationShared across all installations
Integration definitionsOperations, auth methods, event channels, data typesShared across all installations
Action definitionsInput/output schemas, runner config, target IDsShared across all installations
Collection schemasField definitions, types, validation rulesShared across all installations
Screen definitionsComponent layout, data bindingsShared across all installations
Event definitionsType, schema, channel configShared across all installations
Auth method definitionsCredential field schemas, OAuth2 configShared across all installations

Build-time data is versioned with the blueprint. Publishing a new version creates an immutable snapshot. Changes to the draft do not affect published versions.

Runtime data

Runtime data is created when an app is actually used within an organization. It is isolated per organization — no organization can access another's runtime data.

ComponentWhat's storedScope
App instancesInstallation state, blueprint version linkPer organization + space
ConnectionsOAuth tokens, API keys, credentials (encrypted)Per organization + user
Collection recordsActual data rows in tablesPer organization + base
ConversationsMessages, threads, participant statePer organization
TasksExecution history, inputs, outputs, errorsPer organization
Event subscriptionsActive listeners and webhook URLsPer organization + app
Service accountsIdentity provider entries for apps and agentsPer organization
Knowledge base contentUploaded documents, embeddings, vector index dataPer organization

How it works in practice

Consider a "CRM" blueprint installed by two different organizations:

Blueprint "CRM" (v2.3) — build-time
├── Integration: Salesforce REST API
│   └── Operation: listContacts
├── Agent: "Sales Assistant"
│   └── Flow: "Handle inquiry" → greet → lookup → respond
├── Collection schema: "Deals" (fields: name, value, stage)
└── Event Channel: webhook (Salesforce events)

────────────────────────────────────

Organization "Acme Corp" — runtime
├── App: CRM (linked to blueprint v2.3)
├── Connection: "Salesforce - [email protected]" (OAuth2 tokens)
├── Collection: "Deals" → 1,547 records
├── Service Account: "Sales Assistant" (Acme identity)
└── Conversations: 2,340 threads

Organization "Beta Inc" — runtime
├── App: CRM (same blueprint, different instance)
├── Connection: "Salesforce - [email protected]" (different tokens)
├── Collection: "Deals" → 283 records
└── Completely isolated data

Both organizations use the same blueprint definition — the same agent logic, the same flow structure, the same collection schema. But their data is completely separate: different credentials, different records, different conversations.

Why this matters

Safe distribution

Because build-time definitions contain no customer data, blueprints can be safely published to the marketplace and distributed to any organization. Installing a blueprint never exposes one organization's data to another.

Version management

Publishing a new blueprint version creates an immutable snapshot. Organizations using the previous version continue to work unchanged until they explicitly update. The new version can add features, fix flows, or modify schemas without disrupting existing installations.

Composability

Since all build-time definitions follow the same structure, blueprints can reference actions from other blueprints. A flow in one blueprint can call an action defined in another, enabling modular composition of capabilities.