← Back to Projects

Internal Developer Platform with Golden Paths

A Backstage portal where one form produces a repository, CI/CD, cloud identity, infrastructure and a running Kubernetes service

Platform: Azure + AKS
Portal: Backstage
IaC: Terraform + Helm
Role: Platform owner

Overview

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 Problem It Solves

Architecture

The platform is split into independently versioned pieces, so each one can evolve without breaking the others:

ComponentResponsibility
PortalBackstage app with custom scaffolder actions, catalog validation and TechDocs extensions
CatalogEvery entity as YAML, grouped by business domain behind a single root location
Shared skeletonLanguage-agnostic Terraform and Helm pulled into every template
Language templatesNode.js, .NET and Python layers on top of the shared skeleton
Shared librariesReusable CI workflows, a tagged Terraform module library and a common Helm chart
Developerfills template formScaffolderrenders skeletonNew repo+ OIDC identityCatalogregistrationFirst pushbuild & scanContainerregistryHelm deployto AKSService livewith APM
Golden-path flow: from template form to a running, catalogued service

Implementation

1. One skeleton, many languages

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.

template.yaml
# 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

2. Identity without secrets

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.

3. Infrastructure in dependency order

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.

4. Access by domain, not by person

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.

5. Onboarding existing apps

For existing codebases, the template analyses the source and generates a Dockerfile and Helm values, so teams don't have to start from scratch.

6. Cost before commitment

A cost-estimate step shows the projected monthly cost of the requested infrastructure before anything is provisioned.

Agentic "Add a Resource" template

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.

Key Outcomes

3
language golden paths
0
stored cloud secrets per new repo
1 form
repo → running service

Lessons Learned

Conclusion

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.

Technologies Used

BackstageTypeScriptNode.jsTerraformHelmAKSGitHub ActionsAzure DevOpsEntra IDAzure Container RegistryKey VaultService BusTechDocs

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.

Hardening a Developer Portal on AKS →
← Back to Projects Get in Touch