Platform Engineering Developer Portal: Stop Making Developers File Tickets
Your developers want to deploy a new service. In most organizations, that means filing a Jira ticket for infrastructure, waiting 3 days for a Kubernetes namespace, filing another ticket for a database, waiting 2 more days, then configuring CI/CD, monitoring, and logging manually. Platform engineering developer portal replaces all of that with a self-service experience where developers click “Create New Service” and have a production-ready environment in 5 minutes.
What Platform Engineering Actually Is
Platform engineering is the discipline of building internal tools that make developers self-sufficient. It’s not about creating another layer of abstraction that developers have to fight — it’s about removing the toil that slows down delivery. Moreover, the best platform teams treat internal developers as their customers and build products for them, not bureaucratic processes around them.
The key insight is that most developer requests are variants of the same patterns: “I need a service with a database, a message queue, CI/CD, and monitoring.” A platform engineering team codifies these patterns into reusable templates (golden paths) that developers can instantiate with a few clicks. Consequently, the platform team stops being a bottleneck (processing tickets) and starts being a multiplier (building tools that serve everyone).
Spotify pioneered this with Backstage, their open-source developer portal that they built internally and then donated to the CNCF. Today, Backstage is the most widely adopted developer portal framework, used by teams from 50-person startups to enterprises with thousands of engineers.
Building Your Portal with Backstage
Backstage provides three core capabilities: a service catalog (what services exist, who owns them, what they depend on), software templates (create new services from standardized templates), and a plugin ecosystem (integrate your existing tools into one interface).
# catalog-info.yaml — Register your service in the portal
# This file lives in YOUR repo, next to YOUR code
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: order-service
description: |
Processes customer orders, manages order lifecycle,
and publishes order events to Kafka.
annotations:
# Integrations — Backstage pulls data from these tools
github.com/project-slug: company/order-service
pagerduty.com/service-id: PSVC123
grafana/dashboard-selector: "order-service"
sonarqube.org/project-key: order-service
jenkins.io/job-full-name: order-service/main
tags:
- java
- spring-boot
- kafka
links:
- url: https://order-service.internal.company.com/swagger-ui
title: API Documentation
- url: https://grafana.internal/d/orders
title: Monitoring Dashboard
spec:
type: service
lifecycle: production
owner: team-commerce # Links to a Team entity
system: e-commerce-platform # Logical grouping
dependsOn:
- component:inventory-service
- component:payment-service
- resource:orders-database
- resource:orders-kafka-topic
providesApis:
- orders-api-v2
consumesApis:
- inventory-api
- payment-apiWhy the catalog matters: In a 200-service architecture, nobody can keep track of what exists, who owns it, and what it depends on. The catalog provides a live, searchable map of your entire system. Additionally, when someone is paged at 2 AM for the order-service, they can immediately see its dependencies, find the monitoring dashboard, and identify the owning team — all in one place.
Golden Paths: Standardize Without Restricting
A golden path is a pre-built template that creates a new service with everything configured correctly: repository, CI/CD pipeline, Kubernetes manifests, database, monitoring dashboards, and alerting rules. The developer fills in a few fields (service name, team, tech stack) and the template does the rest.
# Software template — "Create New Microservice"
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: spring-boot-service
title: Spring Boot Microservice
description: |
Creates a production-ready Spring Boot service with:
- GitHub repository with branch protection
- CI/CD pipeline (GitHub Actions)
- Kubernetes deployment manifests
- PostgreSQL database (via Crossplane)
- Grafana dashboard + PagerDuty integration
- Sonar quality gate
spec:
owner: platform-team
type: service
parameters:
- title: Service Information
required: [name, description, owner]
properties:
name:
type: string
pattern: "^[a-z][a-z0-9-]*$"
description: Service name (lowercase, hyphens only)
description:
type: string
description: What does this service do?
owner:
type: string
ui:field: OwnerPicker # Dropdown of registered teams
database:
type: string
enum: [postgresql, mysql, none]
default: postgresql
messaging:
type: string
enum: [kafka, rabbitmq, none]
default: none
steps:
# 1. Generate code from template
- id: generate
name: Generate Service Code
action: fetch:template
input:
url: ./skeleton # Template repository
values:
name: ${{ parameters.name }}
owner: ${{ parameters.owner }}
# 2. Create GitHub repository
- id: publish
name: Create Repository
action: publish:github
input:
repoUrl: github.com?owner=company&repo=${{ parameters.name }}
description: ${{ parameters.description }}
defaultBranch: main
protectDefaultBranch: true
requireCodeOwnerReviews: true
# 3. Provision database if requested
- id: database
name: Provision Database
if: ${{ parameters.database != 'none' }}
action: crossplane:create
input:
apiVersion: database.company.io/v1
kind: PostgreSQLInstance
metadata:
name: ${{ parameters.name }}-db
spec:
size: small # 2 vCPU, 8GB RAM, 100GB storage
# 4. Register in Backstage catalog
- id: register
name: Register in Catalog
action: catalog:register
input:
repoContentsUrl: ${{ steps.publish.output.repoContentsUrl }}
catalogInfoPath: /catalog-info.yamlThe crucial point: Golden paths are optional, not mandatory. Developers CAN deviate — but the golden path is so good that most don’t want to. This is the difference between platform engineering (paved roads) and infrastructure bureaucracy (gatekeeping). Furthermore, when 90% of services follow the golden path, operational support becomes dramatically easier because everything is consistent.
Platform Engineering Developer Portal: Measuring Success
A platform isn’t successful because it exists — it’s successful because developers use it voluntarily and ship faster. The metrics that matter:
- Time to first deploy for new services: Before portal: 2 weeks. After: 1 hour. This is the single most impressive metric to show leadership.
- Time to first deploy for new hires: How quickly can a new team member deploy a change? This measures how well your platform reduces onboarding friction.
- Golden path adoption rate: What percentage of new services use your templates? Below 70% means your templates don’t match what developers actually need — go talk to them.
- DORA metrics improvement: Deployment frequency, lead time for changes, MTTR, and change failure rate should all improve after platform adoption.
- Developer satisfaction: Survey your developers quarterly. Ask: “How easy is it to deploy a new service?” If scores aren’t improving, your platform has usability problems.
Common Mistakes to Avoid
Mistake 1: Building a portal nobody asked for. Start by talking to developers. What actually slows them down? Don’t assume — ask. You might discover that the biggest pain point isn’t service creation but database access, or not infrastructure at all but slow CI/CD pipelines.
Mistake 2: Making the portal mandatory and the only way. If developers can’t bypass the portal for edge cases, they’ll resent it. The portal should be the easiest way, not the only way.
Mistake 3: Building everything from scratch. Backstage exists. Crossplane exists. ArgoCD exists. Your job is to integrate and configure these tools for your organization, not to build a developer portal from zero.
Mistake 4: Platform team as gatekeepers. If the platform team must approve every service creation or infrastructure request, you’ve just moved the bottleneck. Self-service means self-service — with guardrails, not gates.
Getting Started: The 30-Day Plan
- Week 1: Interview 10 developers. Ask what slows them down most. Identify the top 3 pain points.
- Week 2: Deploy Backstage, register 10 existing services in the catalog, and add GitHub + PagerDuty plugins.
- Week 3: Create one golden path template for the most common service type (probably a REST API with a database).
- Week 4: Invite 5 developers to try the template. Observe them using it. Fix every friction point they encounter. Then open it to everyone.
Related Reading:
Resources:
In conclusion, platform engineering developer portal initiatives succeed when they’re built with empathy for developers and measured by developer outcomes. Start small, solve real pain points, and expand based on what developers actually need.