MarBoba

The catalog data model

How MarBoba models your engineering org. Six entity kinds (component / API / resource / system / domain / team), explicit dependency edges, and per-entity scorecards.

Every IDP has a catalog. The catalog is the data model the platform uses to talk about your engineering org. Get it right and every screen in the app — scorecards, dependency graphs, on-call routing, deployment dashboards — falls out of it naturally.

Six entity kinds

KindWhat it isExamples
ComponentA runnable unit of code. Has an owner team, a repo, a lifecycle, a platform.acme-checkout-web, acme-billing-api, acme-mobile-ios
APIA typed interface — REST / GraphQL / gRPC / AsyncAPI. Has a spec format, an owner team, a host component.payments-public-rest, inventory-graphql, notifications-grpc
ResourceAn infrastructure thing your components depend on. Owner team, kind (db / queue / bucket / vault), per-environment instance.users-postgres-prod, events-kafka-staging, signed-uploads-s3
SystemA logical grouping of components + APIs + resources that ship together.Checkout, Identity Platform, Recommendations
DomainA business-level grouping of systems. The org-chart-shaped layer.Payments, Identity, Search, Growth
TeamThe owning unit. Has members, an on-call binding, scorecard responsibilities.Platform, Checkout Squad, Growth Engineering

The shape mirrors Backstage’s entity model because the model has converged across IDPs. If you’re moving off Backstage, the entity-kind mapping is 1:1; only the field names differ.

Hierarchy

Domains contain Systems. Systems contain Components, APIs, and Resources. Teams own Components, APIs, and Resources directly (not Systems or Domains — those are organizational, not operational).

Domain ── contains ──> System ── contains ──> Component
                              ├── contains ──> API
                              └── contains ──> Resource

Team ── owns ──> Component
     ├── owns ──> API
     └── owns ──> Resource

A component can belong to multiple systems (a shared library component might land in three product systems); an API is owned by exactly one team but consumed by many.

Dependency edges

Cross-entity dependencies are first-class — they’re not derived from imports or call traces (though MarBoba can auto-detect and suggest edges from a project’s package.json / go.mod / OpenAPI consumers, which you then review).

An edge connects two entities and carries an optional kind (runtime, build-time, data) and blastRadius (high, medium, low). High-blast-radius edges paint red on the resource graph and raise the approval requirement on agent actions that touch them.

Per-entity scorecards

Scorecards live alongside the catalog — they’re not a separate inventory.

Each scorecard has:

  • Rules — atomic checks (e.g., “has a connected runbook”, “has a primary-team owner”, “has a verified domain”). Three built-in rule types: presence, threshold, and custom-callable. Rules are weighted; the score is a weighted average.
  • Tier thresholds — bronze / silver / gold (pre-2026 docs call these levels).
  • Exemptions — per-(scorecard, rule, entity) opt-outs with a reason and an optional expiry. Exempted rules neither help nor hurt the score.
  • Initiatives — time-bound campaigns bundling scorecards + a target tier. Renders a per-entity leaderboard for engagement.

A score is computed at scorecard-evaluation time and cached. The cache refreshes automatically when underlying state changes (a runbook gets deleted, an entity’s lifecycle flips, etc.).

How the data flows

SourceWhat it creates
The Project WizardComponents
The Catalog → APIs / Resources / Systems / Domains screensThe other entity kinds
Auto-detection from your VCSSuggested components + dependency edges, as drafts you review
The /v1 REST API, the Terraform provider, and the marboba CLIThe same primitives, scriptable
The MCP serverRead-only views of the same catalog

There’s intentionally no second model. Whatever you create with the wizard, the API, Terraform, or the CLI all lands in the same catalog and surfaces in the same screens.

Versioning + drift

The catalog tracks two kinds of “this was the truth as of”:

  1. Catalog drift — when the deployed reality (a config in a live environment) doesn’t match what the catalog says. Drift detection records a snapshot each time it runs.
  2. Workload spec drift — when a project’s Workload Spec (YAML in the repo) doesn’t match what’s actually deployed. The Workload Spec is the declarative deploy primitive; drift detection is the reconciliation gap.

Both surface in the per-project Drift tab.

See also

See also

  • Plan tiers — The four MarBoba plans — Free, Team, Business, and Enterprise — what each includes, and how to choose.
  • Connect a GitHub repository — Authorize the MarBoba GitHub app on a repo, wire a project to it, and verify the connection by streaming a PR.