Skip to content

Backstage Primer & Modeling Guide — Developer Portal Catalog with Linked.Archi

This guide introduces the Backstage software catalog model as formalised in Linked.Archi, explains how its concepts map to semantic assets, and demonstrates practical modeling through a worked example.

Backstage Concepts

What is Backstage?

Backstage is an open-source developer portal platform originally created by Spotify. Its Software Catalog provides a centralised registry of all software components, systems, APIs, resources, and their ownership within an organisation.

Backstage is: - Developer-centric — built for engineering teams to discover and understand services - Ownership-first — every entity has a clear owner (team/group) - API-aware — APIs are first-class citizens with provider/consumer relationships - Domain-driven — entities are grouped into business domains

"Backstage unifies all your infrastructure tooling, services, and documentation to create a streamlined development environment from end to end." — backstage.io

Catalog Entity Types

graph TD
    subgraph Software["Software Entities"]
        Component["Component"]
        System["System"]
        API["API"]
        Resource["Resource"]
    end

    subgraph Organisational["Organisational Entities"]
        Domain["Domain"]
        User["User"]
        Group["Group"]
    end

    Component -->|"partOfSystem"| System
    Component -->|"providesAPI"| API
    Component -->|"consumesAPI"| API
    Component -->|"usesResource"| Resource
    Component -->|"ownedBy"| Group
    System -->|"belongsToDomain"| Domain
    User -->|"memberOf"| Group

    style Software fill:#B3D9FF,stroke:#333,color:#000
    style Organisational fill:#D4E6B5,stroke:#333,color:#000
Entity What it represents
Component A deployable unit — service, library, website, or application
System A set of components that provide business or technical value together
API An interface owned and maintained in the ecosystem (OpenAPI, AsyncAPI, gRPC, GraphQL)
Resource Infrastructure used by components — databases, buckets, queues, external services
Domain A high-level business domain grouping systems and components
User A human user in the ecosystem
Group A team, department, or tribe that owns entities

Relationships

Relationship From → To Meaning
ownedBy Any → Group Entity is owned by a team
partOfSystem Component → System Component belongs to a system
providesAPI Component → API Component exposes an API
consumesAPI Component → API Component depends on an API
usesResource Component → Resource Component uses infrastructure
belongsToDomain Any → Domain Entity is part of a business domain
memberOf User → Group User belongs to a team

Lifecycle

Components carry a lifecycle property: experimentalproductiondeprecated.

Semantic Assets

Asset Set

modelingLanguages/backstage/
├── backstage-metamodel.ttl             ← Entry point: arch:Metamodel
├── backstage-onto.ttl                  ← OWL ontology (7 elements, 7 relationships)
├── backstage-tax.ttl                   ← SKOS taxonomy
├── backstage-shapes.ttl                ← SHACL validation
├── backstage-viewpoints.ttl            ← 5 viewpoints
├── backstage-reference-data.ttl        ← Lifecycle states, component types, API types
├── backstage-presentation-contexts.ttl ← Developer, Architect, Stakeholder themes
└── backstage-deliverable-templates.ttl ← Document templates

Concept-to-Asset Mapping

Backstage Concept Semantic Representation File
Entity types (Component, System, etc.) owl:Class rdfs:subClassOf arch:Element backstage-onto.ttl
Relationships (ownedBy, providesAPI, etc.) Three-declaration pattern backstage-onto.ttl
Lifecycle, component types, API types skos:ConceptScheme backstage-reference-data.ttl
Validation (ownership required, etc.) sh:NodeShape backstage-shapes.ttl
Viewpoints arch:Viewpoint backstage-viewpoints.ttl

Cross-Language Integration

Backstage entities map naturally to ArchiMate and C4:

Backstage ArchiMate 4.0 C4
bs:Component am4:ApplicationComponent c4:Container or c4:Component
bs:System (group of components) c4:SoftwareSystem
bs:API am4:ApplicationInterface
bs:Resource am4:Node / am4:Artifact c4:DeploymentNode
bs:Group am4:Role

Worked Example: PayFlow (Fintech Platform)

Prerequisites

core/core-onto.ttl
modelingLanguages/backstage/backstage-onto.ttl
modelingLanguages/backstage/backstage-tax.ttl
modelingLanguages/backstage/backstage-shapes.ttl
modelingLanguages/backstage/backstage-viewpoints.ttl
modelingLanguages/backstage/backstage-reference-data.ttl
modelingLanguages/backstage/backstage-metamodel.ttl

About PayFlow

PayFlow is a fintech platform providing payment processing, merchant onboarding, and financial reporting as a service. The engineering organisation is structured into domain-aligned squads using Backstage as their developer portal.

The complete, validatable example model is available at examples/payflow/payflow-model.ttl.

Model File Header

@prefix skos:    <http://www.w3.org/2004/02/skos/core#> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix arch:    <https://meta.linked.archi/core#> .
@prefix bs:      <https://meta.linked.archi/backstage/onto#> .
@prefix :        <https://meta.linked.archi/examples/payflow/> .

:PayFlowModel
    a                          arch:Model ;
    skos:prefLabel             "PayFlow — Backstage Catalog Model"@en ;
    arch:modelConformsToMetamodel <https://meta.linked.archi/backstage/metamodel#Backstage> ;
    dcterms:created            "2025-06-27"^^xsd:date ;
.

Element Patterns

## Domains
:PaymentsDomain a bs:Domain ; skos:prefLabel "Payments"@en .
:MerchantDomain a bs:Domain ; skos:prefLabel "Merchant Services"@en .
:PlatformDomain a bs:Domain ; skos:prefLabel "Platform"@en .

## Groups (teams)
:PaymentsSquad a bs:Group ; skos:prefLabel "Payments Squad"@en .
:MerchantSquad a bs:Group ; skos:prefLabel "Merchant Squad"@en .
:PlatformTeam a bs:Group ; skos:prefLabel "Platform Team"@en .
:SRETeam a bs:Group ; skos:prefLabel "SRE Team"@en .

## Systems
:PaymentGateway a bs:System ; skos:prefLabel "Payment Gateway"@en .
:MerchantPortal a bs:System ; skos:prefLabel "Merchant Portal"@en .
:ObservabilityPlatform a bs:System ; skos:prefLabel "Observability Platform"@en .

## Components
:PaymentProcessor a bs:Component ; skos:prefLabel "payment-processor"@en ; bs:lifecycle "production" .
:FraudService a bs:Component ; skos:prefLabel "fraud-service"@en ; bs:lifecycle "production" .
:PayoutService a bs:Component ; skos:prefLabel "payout-service"@en ; bs:lifecycle "production" .
:MerchantOnboarding a bs:Component ; skos:prefLabel "merchant-onboarding"@en ; bs:lifecycle "production" .
:ReportingService a bs:Component ; skos:prefLabel "reporting-service"@en ; bs:lifecycle "experimental" .
:WebhookDispatcher a bs:Component ; skos:prefLabel "webhook-dispatcher"@en ; bs:lifecycle "production" .

## APIs
:PaymentsAPI a bs:API ; skos:prefLabel "Payments API (OpenAPI)"@en .
:MerchantAPI a bs:API ; skos:prefLabel "Merchant API (OpenAPI)"@en .
:PaymentEventsAPI a bs:API ; skos:prefLabel "Payment Events (AsyncAPI)"@en .
:FraudScoringAPI a bs:API ; skos:prefLabel "Fraud Scoring API (gRPC)"@en .

## Resources
:PaymentsDB a bs:Resource ; skos:prefLabel "payments-db (PostgreSQL)"@en .
:EventBus a bs:Resource ; skos:prefLabel "event-bus (Kafka)"@en .
:MerchantDB a bs:Resource ; skos:prefLabel "merchant-db (PostgreSQL)"@en .
:RedisCache a bs:Resource ; skos:prefLabel "redis-cache"@en .

Relationship Patterns

## Ownership
:PaymentProcessor bs:ownedBy :PaymentsSquad .
:FraudService bs:ownedBy :PaymentsSquad .
:PayoutService bs:ownedBy :PaymentsSquad .
:MerchantOnboarding bs:ownedBy :MerchantSquad .
:ReportingService bs:ownedBy :MerchantSquad .
:WebhookDispatcher bs:ownedBy :PlatformTeam .
:PaymentGateway bs:ownedBy :PaymentsSquad .
:MerchantPortal bs:ownedBy :MerchantSquad .

## System membership
:PaymentProcessor bs:partOfSystem :PaymentGateway .
:FraudService bs:partOfSystem :PaymentGateway .
:PayoutService bs:partOfSystem :PaymentGateway .
:WebhookDispatcher bs:partOfSystem :PaymentGateway .
:MerchantOnboarding bs:partOfSystem :MerchantPortal .
:ReportingService bs:partOfSystem :MerchantPortal .

## API provision
:PaymentProcessor bs:providesAPI :PaymentsAPI .
:PaymentProcessor bs:providesAPI :PaymentEventsAPI .
:FraudService bs:providesAPI :FraudScoringAPI .
:MerchantOnboarding bs:providesAPI :MerchantAPI .

## API consumption
:PayoutService bs:consumesAPI :PaymentsAPI .
:MerchantOnboarding bs:consumesAPI :PaymentsAPI .
:WebhookDispatcher bs:consumesAPI :PaymentEventsAPI .
:PaymentProcessor bs:consumesAPI :FraudScoringAPI .

## Resource usage
:PaymentProcessor bs:usesResource :PaymentsDB .
:PaymentProcessor bs:usesResource :EventBus .
:PaymentProcessor bs:usesResource :RedisCache .
:FraudService bs:usesResource :RedisCache .
:MerchantOnboarding bs:usesResource :MerchantDB .
:WebhookDispatcher bs:usesResource :EventBus .

## Domain membership
:PaymentGateway bs:belongsToDomain :PaymentsDomain .
:MerchantPortal bs:belongsToDomain :MerchantDomain .
:ObservabilityPlatform bs:belongsToDomain :PlatformDomain .

Service Catalog View

graph TD
    subgraph PaymentsDomain["Payments Domain"]
        subgraph PG["Payment Gateway (System)"]
            PP["payment-processor<br/>production"]
            FS["fraud-service<br/>production"]
            PS["payout-service<br/>production"]
            WD["webhook-dispatcher<br/>production"]
        end
    end

    subgraph MerchantDomain["Merchant Services Domain"]
        subgraph MP["Merchant Portal (System)"]
            MO["merchant-onboarding<br/>production"]
            RS["reporting-service<br/>experimental"]
        end
    end

    PP -->|"provides"| PAPI["Payments API"]
    PP -->|"provides"| PEAPI["Payment Events"]
    FS -->|"provides"| FSAPI["Fraud Scoring API"]
    MO -->|"provides"| MAPI["Merchant API"]

    PS -->|"consumes"| PAPI
    MO -->|"consumes"| PAPI
    WD -->|"consumes"| PEAPI
    PP -->|"consumes"| FSAPI

    PP -->|"uses"| PDB["payments-db"]
    PP -->|"uses"| EB["event-bus"]
    MO -->|"uses"| MDB["merchant-db"]

    style PaymentsDomain fill:#B3D9FF,stroke:#333,color:#000
    style MerchantDomain fill:#D4E6B5,stroke:#333,color:#000
    style PG fill:#E3F2FD,stroke:#333,color:#000
    style MP fill:#E8F5E9,stroke:#333,color:#000

Validation

.scripts/validate.sh --shacl payflow-model.ttl \
    core/core-shapes.ttl \
    modelingLanguages/backstage/backstage-shapes.ttl

Further Reading