Platform Engineering: Spotify Backstage & Golden Path Scaffolding¶
Skill metadata
Name internal-developer-portal-backstage · Level staff · Tags platform-engineering backstage idp golden-paths devex
"Internal Developer Platform engineering: Backstage software catalog and entity model, Golden Path scaffolder templates, TechDocs, and platform-as-product adoption and DevEx metrics. Use when building self-service so developers can create a new production-ready service in one click, defining golden paths, onboarding services into a catalog, or measuring platform adoption."
Source: skills/platform-engineering/internal-developer-portal-backstage/SKILL.md
When to Use This Skill¶
Triggers — load this skill when:
- A platform team needs a catalog, scaffolder template, or golden path defined
- Service onboarding and ownership metadata must be standardized
- Platform adoption or DevEx needs to be measured as a product
Route elsewhere when:
- Underlying delivery automation ->
cicd-pipeline-designandgitops-multi-cluster-argo-flux - Delivery performance measurement ->
devops-metrics-dora-kpis
1. Backstage Software Template Definition (template.yaml)¶
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: springboot-microservice-template
title: Production Spring Boot Microservice
description: Scaffolds a 12-factor Spring Boot service with CI/CD, Helm charts, and OpenTelemetry
spec:
owner: platform-team
type: service
parameters:
- title: Service Configuration
required: [component_id, description, owner]
properties:
component_id:
title: Unique Service Name
type: string
pattern: '^[a-z0-9-]+$'
description:
title: Description
type: string
owner:
title: Owner Team
type: string
ui:field: OwnerPicker
steps:
- id: fetch-base
name: Fetch Template Skeleton
action: fetch:template
input:
url: ./skeleton
values:
component_id: ${{ parameters.component_id }}
owner: ${{ parameters.owner }}
- id: publish-github
name: Publish Repository to GitHub
action: publish:github
input:
repoUrl: github.com?owner=my-org&repo=${{ parameters.component_id }}
defaultBranch: main
- id: register-catalog
name: Register in Backstage Catalog
action: catalog:register
input:
repoContentsUrl: ${{ steps['publish-github'].output.repoContentsUrl }}
catalogInfoPath: '/catalog-info.yaml'
2. Platform Engineering Golden Rules¶
- Paved Road over Mandates: Build self-service workflows that make the secure and reliable way the easiest way for product engineers.
- Treat the Platform as a Product: Measure internal customer Net Promoter Score (NPS), Time to 10th Deployment, and lead time for changes (DORA).
- Service Ownership via Catalog: Require clear team ownership, on-call links, and API specifications for every registered component.
3. TechDocs as the Documentation Plane¶
TechDocs renders docs-as-code from each service's own repository into the portal, so documentation lives beside the code it describes and is reviewed in the same PR:
# catalog-info.yaml
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: payments-api
annotations:
backstage.io/techdocs-ref: dir:. # mkdocs.yml at the repo root
backstage.io/source-location: url:https://github.com/acme/payments-api
spec:
type: service
lifecycle: production
owner: group:payments
system: checkout
# mkdocs.yml
site_name: Payments API
nav: [Overview: index.md, Runbook: runbook.md, API: api.md]
plugins: [techdocs-core]
Build docs in CI and publish to object storage (the external build pipeline), not on the Backstage
server — in-server builds make the portal slow and couple its uptime to doc rendering. Make the
scaffolder template emit mkdocs.yml, an index.md and a runbook.md stub so every new service
starts with a documentation surface, and treat a missing runbook annotation as a catalog lint
failure rather than a suggestion.
4. Anti-Patterns¶
| Anti-pattern | Why it fails in production |
|---|---|
| Launching the catalog by bulk-importing every repository | Thousands of entities with stale or absent owners, so the first lookup a developer tries returns garbage and they never come back. Onboard the services people actually page for, with real owners. |
| Mandating platform adoption instead of earning it | Teams comply on paper and keep their own pipelines underneath, so you now maintain two systems. Golden paths must be the fastest route to production, or they are shelfware. |
| A scaffolder template that generates a repository and nothing else | The developer still has to request CI, credentials, infrastructure and on-call registration by hand — the one-click promise breaks at step two. A golden path provisions the whole chain or it is a file generator. |
| Treating the portal as a project with an end date | The catalog rots the moment nobody owns it; six months later ownership data is wrong and the portal is a liability during incidents. Staff it as a product with a roadmap. |
| Measuring adoption by page views | Views measure curiosity. Measure the outcomes the platform exists to change: time from repo creation to first production deploy, share of services on the golden path, and change failure rate for those services. |
| Building the portal before talking to developers | You automate the steps that were easy to automate rather than the ones that hurt. Start from the top three sources of developer friction, evidenced by a survey or by watching an onboarding. |
| Running TechDocs builds on the Backstage server | Doc rendering competes with the portal's own uptime and gets slow as the catalog grows. Build docs in CI and publish to object storage. |