Skip to content

Manifest Format

Reference for the .bifrost/ YAML files that back portable bundles.

The .bifrost/ directory is the canonical YAML representation of every platform entity in a workspace. It is export-only: produced by bifrost export (or bifrost export --portable) and consumed by bifrost import. The runtime sync loop (bifrost watch, bifrost sync) does not push or pull .bifrost/ content — entity mutations go through the CLI or MCP.

.bifrost/
├── organizations.yaml
├── roles.yaml
├── workflows.yaml
├── integrations.yaml
├── configs.yaml
├── tables.yaml
├── knowledge.yaml
├── events.yaml
├── forms.yaml
├── agents.yaml
└── apps.yaml

A bundle also contains:

  • bundle.meta.yaml — source environment, CLI version, scrub rules applied
  • workflows/ — verbatim copies of every @workflow-decorated .py file
  • apps/ — verbatim copies of app source directories (TSX, TS, CSS)

The same manifest serves two audiences. A non-portable export (bifrost export <dir>) keeps every field. A portable export (bifrost export --portable <dir>) strips fields that don’t survive a cross-environment hop. The split is enforced in api/bifrost/portable.py.

Field classExamplesKept in portable bundle?
Identity (UUIDs of entities)id on workflow / form / agentYes — preserved for idempotent round-trip
Portable contentForm fields, agent prompts, workflow codeYes
Org referencesorganization_id anywhere in the treeStripped
Role bindingsroles: [<uuid>, ...] on forms / agents / appsRewritten to role_names: [<name>, ...]
Attributionuser_id, created_by, updated_byStripped
Timestampscreated_at, updated_at, last_*Stripped
OAuth secretsclient_secret, oauth_token_id, access_token, refresh_tokenStripped
Secret config valuesvalue on configs where config_type == "secret"Nulled (key + description retained)
Event-source runtime stateexternal_id, expires_at, state on event sourcesStripped

Declares every registered workflow, tool, and data provider.

FieldPortableNotes
idYesStable across environments
path, function_nameYesResolved by relative file path inside the bundle
typeYesworkflow, tool, or data_provider
category, tags, endpoint_enabled, timeout_secondsYes
access_level, rolesEnv-specificroles rewritten to role_names in portable mode
organization_idEnv-specificStripped in portable mode

Declares integration types with their config schema and OAuth provider config.

FieldPortableNotes
id, nameYes
config_schemaYesSchema definitions (key, type, required, description)
oauth_providerPartialProvider name + scopes kept; client_secret stripped
mappingsEnv-specificoauth_token_id and organization_id stripped

OAuth tokens never round-trip. After importing, re-run the OAuth flow per-org to populate oauth_token_id.

Standalone config values not tied to an integration schema.

FieldPortableNotes
id, key, description, config_typeYes
valueConditionalPlaintext values kept; secret values nulled in portable mode
organization_idEnv-specificStripped in portable mode

Form content lives inline under each form’s UUID. There are no per-UUID .form.yaml files.

FieldPortableNotes
id, name, descriptionYes
fields, workflow_id, launch_workflow_id, default_launch_paramsYesPortable form content
access_level, rolesEnv-specificroles rewritten to role_names in portable mode
organization_id, created_by, timestampsEnv-specificStripped in portable mode

Agent content (system prompts, tool bindings, delegations, knowledge namespaces, budgets) lives inline under each agent’s UUID. Same pattern as forms — no per-UUID .agent.yaml files.

FieldPortableNotes
id, description, system_prompt, channelsYes
tools, delegated_agents, knowledge_namespacesYesReferences resolved by name
max_iterations, max_token_budget, max_run_timeoutYes
access_level, rolesEnv-specificroles rewritten to role_names in portable mode
FieldPortableNotes
id, name, description, dependenciesYesnpm dependencies stored on the DB row
pathYesSource directory (TSX/TS/CSS only — no metadata files)
access_level, rolesEnv-specificroles rewritten to role_names in portable mode

Event sources (webhooks and schedules) with their subscriptions.

FieldPortableNotes
id, source_typeYeswebhook, schedule, or internal
cron_expression, timezone, schedule_enabled (schedule)Yes
adapter_name (webhook)Yes
subscriptionsYesworkflow_id / agent_id references
external_id, expires_at, stateEnv-specificAdapter-managed, stripped in portable mode

Top-level seed data describing the source environment’s orgs and roles. bifrost import drops these files entirely when --org or --role-mode name is used — they only round-trip when re-applying a bundle to the same environment that exported it.

The manifest importer validates that:

  • All organization_id references point to declared organizations
  • All role references resolve (by ID in raw mode, by name in portable mode)
  • Integration-schema-bound configs reference a declared integration
  • Event subscription workflow_id / agent_id references resolve
  • Table application_id references point to declared apps

Validation errors surface as warnings in bifrost import --dry-run output before any write happens.