A Backstage portal where one form produces a repository, CI/CD, cloud identity, infrastructure and a running Kubernetes service
Product teams shouldn't need to become cloud experts just to ship a new service. I designed and run an Internal Developer Platform built on Backstage. Developers choose a golden-path template, answer a few questions, and the platform does the rest: it creates the repository, wires up passwordless CI/CD, provisions infrastructure, deploys to Kubernetes and registers the service in a searchable catalog.
There are templates for Node.js (Express + TypeScript), .NET and Python (FastAPI). Each one can start a brand-new service or onboard an existing codebase.
The platform is split into independently versioned pieces, so each one can evolve without breaking the others:
| Component | Responsibility |
|---|---|
| Portal | Backstage app with custom scaffolder actions, catalog validation and TechDocs extensions |
| Catalog | Every entity as YAML, grouped by business domain behind a single root location |
| Shared skeleton | Language-agnostic Terraform and Helm pulled into every template |
| Language templates | Node.js, .NET and Python layers on top of the shared skeleton |
| Shared libraries | Reusable CI workflows, a tagged Terraform module library and a common Helm chart |
Templates merge the shared skeleton with a language layer when they render. Fixing a Terraform module or Helm value once fixes it for every language.
# Illustrative scaffolder template steps
steps:
- id: fetch-shared
action: fetch:template
input:
url: ../shared-skeleton
values: { name: ${{ parameters.name }}, domain: ${{ parameters.domain }} }
- id: fetch-language
action: fetch:template
input: { url: ./skeleton-nodejs }
- id: publish
action: publish:github
- id: onboard-identity # creates per-environment OIDC federated credentials
action: github:actions:dispatch
- id: register
action: catalog:register
Creating a repository triggers an onboarding workflow that sets up Entra ID federated credentials for each deployment environment. No client secret is ever created or stored.
Infrastructure workflows run on merge in a fixed order: base → compute → database → integration → security → storage. A missing dependency can't cause a half-built environment.
Per-stage service connections and domain-group RBAC are applied through a governance pipeline, so access is reviewed as code rather than granted by hand.
For existing codebases, the template analyses the source and generates a Dockerfile and Helm values, so teams don't have to start from scratch.
A cost-estimate step shows the projected monthly cost of the requested infrastructure before anything is provisioned.
Engineers can describe the resource they need in plain English. A pipeline runs an AI agent that knows the platform's conventions, and it opens a pull request containing Terraform, Helm, pipeline and catalog changes. A human reviews and merges it.
A good developer platform makes the right way the easy way. Turning standards into templates freed product teams to focus on features, and freed the platform team from being a ticket queue.
About this case study: this write-up is drawn from my hands-on platform engineering experience. Organisation names, system names, figures and timelines have been changed or generalised, and all code, configuration and queries are illustrative examples written for this page.