Backstage Developer Portal: Building Your Internal Platform
Spotify created the Backstage developer portal to solve a real problem: hundreds of microservices, dozens of teams, and no single place to find documentation, ownership, or deployment status. Open-sourced in 2020 and now a CNCF incubating project, it has become the de facto standard for internal developer portals. This guide covers everything from initial setup to production deployment with custom plugins.
Why Developer Portals Matter in 2026
As organizations scale beyond 50 microservices, developers spend increasingly more time searching for information than writing code. Who owns this service? Where are the docs? How do I deploy? What’s the API contract? Without a central hub, these questions eat hours every week. Moreover, onboarding new engineers becomes painful when tribal knowledge lives in Slack threads and wikis nobody maintains.
Backstage solves this by providing a single pane of glass — a software catalog that tracks every service, library, and piece of infrastructure your organization runs. Furthermore, it offers scaffolding templates that let developers spin up new services following your organization’s golden paths, and a plugin ecosystem that integrates with your existing tools.
Setting Up Backstage from Scratch
Getting started requires Node.js 18+ and Yarn. The CLI scaffolds a complete application with a frontend, backend, and example plugins. Additionally, Backstage uses a PostgreSQL database in production (SQLite for development).
# Create a new Backstage app
npx @backstage/create-app@latest my-portal
cd my-portal
# Start in development mode
yarn dev
# Project structure
# packages/app/ - React frontend
# packages/backend/ - Node.js backend
# app-config.yaml - Main configuration
# catalog-info.yaml - This repo's catalog entry
The configuration file app-config.yaml controls everything: database connections, authentication providers, catalog locations, and plugin settings. For production, you’ll want to configure GitHub or GitLab authentication and point the catalog at your organization’s repositories.
# app-config.production.yaml
app:
baseUrl: https://backstage.yourcompany.com
backend:
baseUrl: https://backstage.yourcompany.com
database:
client: pg
connection:
host: localhost
port: 5432
user: backstage
password: ${POSTGRES_PASSWORD}
auth:
providers:
github:
development:
clientId: ${GITHUB_CLIENT_ID}
clientSecret: ${GITHUB_CLIENT_SECRET}
catalog:
locations:
- type: url
target: https://github.com/your-org/*/blob/main/catalog-info.yaml
The Software Catalog: Heart of Backstage
Every entity in your organization — services, libraries, APIs, teams, infrastructure — gets a catalog-info.yaml file in its repository. This file describes what the component is, who owns it, and how it relates to other components. The catalog then aggregates all these files into a searchable, browsable directory.
# catalog-info.yaml for a microservice
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: payment-service
description: Handles payment processing and billing
annotations:
github.com/project-slug: your-org/payment-service
backstage.io/techdocs-ref: dir:.
pagerduty.com/service-id: PXXXXXX
tags:
- java
- spring-boot
- payments
links:
- url: https://grafana.yourcompany.com/d/payment-service
title: Grafana Dashboard
icon: dashboard
spec:
type: service
lifecycle: production
owner: team-payments
system: billing-platform
providesApis:
- payment-api
consumesApis:
- user-api
- notification-api
dependsOn:
- resource:payment-db
- component:auth-service
The power of the catalog lies in its relationship model. You can see which services depend on each other, which team owns what, and how APIs connect consumers to providers. This visibility alone prevents countless incidents caused by unexpected dependencies.
Entity Kinds and the Catalog Data Model
To use the catalog effectively, it helps to understand the small but expressive vocabulary of entity kinds. A Component is a thing you build and run, such as a service or a library. An API describes a contract that components provide or consume. A Resource represents infrastructure such as a database or queue, while System and Domain group related components into coherent business areas. Finally, Group and User entities model your org chart so ownership resolves to real people.
These kinds are not decorative — they drive the graph that makes Backstage valuable. For instance, because payment-service declares providesApis: [payment-api], any component that lists consumesApis: [payment-api] automatically shows up as a downstream dependency. Consequently, when an on-call engineer investigates an incident, they can trace the blast radius without grepping through dozens of repositories.
One common edge case is orphaned entities. If a repository is deleted but its catalog location still points at the old URL, the entity lingers with a processing error. Therefore, production teams typically enable orphan cleanup and configure the catalog processor to deduplicate entities that share the same name across multiple locations. Getting ownership and lifecycle fields right early prevents a slow drift into an untrustworthy catalog.
Backstage Developer Portal: TechDocs for Living Documentation
TechDocs is Backstage’s built-in documentation system based on MkDocs. It renders Markdown files stored alongside your code directly in the portal. The key benefit: documentation lives with the code it describes, so developers update docs in the same pull request that changes the code.
# docs/mkdocs.yml in your service repo
site_name: Payment Service
nav:
- Home: index.md
- Architecture: architecture.md
- API Reference: api.md
- Runbooks:
- Deployment: runbooks/deployment.md
- Incident Response: runbooks/incidents.md
- Database Migrations: runbooks/migrations.md
plugins:
- techdocs-core
In production, configure TechDocs to build documentation in CI/CD and publish to cloud storage (S3, GCS, or Azure Blob). This avoids building docs on-the-fly and keeps the Backstage instance lightweight. Moreover, the recommended “external” build strategy separates the documentation pipeline entirely from the portal, so a broken docs build never degrades the catalog experience.
Software Templates: Golden Paths for New Services
Templates let developers create new projects following your organization’s standards. Instead of copying an old repo and removing half the code, developers fill out a form and get a properly configured repository with CI/CD, monitoring, and documentation already set up.
# template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: spring-boot-service
title: Spring Boot Microservice
description: Create a production-ready Spring Boot service
spec:
owner: platform-team
type: service
parameters:
- title: Service Details
properties:
name:
title: Service Name
type: string
pattern: '^[a-z][a-z0-9-]*