Skip to main content
← All Articles · · 10 min read

Platform Engineering Best Practices: Building Internal Developer Platforms

Learn how to build Internal Developer Platforms with golden paths, self-service infrastructure, and tools like Backstage and Port to boost developer productivity.

devopsplatform-engineeringbackstagedeveloper-experienceidp

Platform engineering has moved from buzzword to business imperative. In 2026, the organizations shipping fastest aren’t those with the most developers—they’re the ones who’ve eliminated the friction between writing code and running it in production. That’s the core promise of an Internal Developer Platform (IDP).

This guide covers how to build one that developers actually use.

What Is an Internal Developer Platform?

An IDP is not a single product you buy. It’s a curated set of capabilities, workflows, and abstractions that let developers self-serve their infrastructure needs without opening a ticket to the platform team.

Think of it as the difference between a full-service restaurant and a well-stocked kitchen. With an IDP, developers can:

  • Provision new services without Slack messages to the infra team
  • Deploy to any environment with a single command or button click
  • Get consistent observability, security scanning, and compliance baked in by default
  • Understand their service’s dependencies, runbooks, and ownership at a glance

The platform team’s job shifts from being a gatekeeper to being a product team—building the platform, measuring adoption, and iterating on feedback.


The Foundation: Golden Paths

A golden path is an opinionated, paved road from idea to production. It’s not a mandate—developers can go off-path—but going off-path comes with the cost of doing it yourself.

What a Golden Path Includes

A well-designed golden path typically covers:

  1. Service scaffold: A template repository (or a backstage create workflow) that generates a service with the right structure, CI/CD pipeline, observability, and security defaults already configured.
  2. CI/CD pipeline: A tested, maintained pipeline template that teams inherit rather than build from scratch.
  3. Infrastructure-as-code templates: Terraform or Pulumi modules for common patterns (a web service, a background worker, a database, a queue).
  4. Observability defaults: Structured logging, metrics export, and distributed tracing wired in before the first line of business logic.
  5. Security baseline: Dependency scanning, container image scanning, and secrets detection in every pipeline—not optional.

Designing Golden Paths That Get Used

The most common failure mode is building a golden path that’s slower or more annoying than the ad-hoc approach. Avoid this by:

  • Measuring adoption: If developers bypass the path, find out why. It’s almost always a friction problem, not a communication problem.
  • Making the happy path the easy path: The golden path should be the path of least resistance, not the path of maximum compliance.
  • Allowing escape hatches: Developers who need to go off-path should be able to, with clear documentation of what they’re giving up.

Self-Service Infrastructure

The goal is that a developer can go from “I need a PostgreSQL database” to “I have a PostgreSQL database with backups, monitoring, and access control” in under five minutes, without filing a ticket.

Patterns for Self-Service

Infrastructure as Code with guardrails

Expose curated Terraform modules through a service catalog or a simple CLI. Developers call the module; the module enforces your standards:

# Developer writes this
module "my_service_db" {
  source      = "git::https://github.com/your-org/tf-modules//rds-postgres"
  name        = "my-service"
  environment = "production"
  instance_class = "db.t4g.medium"
}

# The module enforces: encryption, automated backups,
# CloudWatch alarms, parameter group, subnet placement

Environment provisioning on demand

Enable developers to spin up ephemeral preview environments for every pull request. Tools like Argo CD ApplicationSets or Terraform Cloud workspaces make this tractable:

# ArgoCD ApplicationSet for preview environments
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: preview-envs
spec:
  generators:
  - pullRequest:
      github:
        owner: your-org
        repo: your-app
        tokenRef:
          secretName: github-token
          key: token
  template:
    metadata:
      name: 'preview-{{number}}'
    spec:
      source:
        repoURL: https://github.com/your-org/your-app
        targetRevision: '{{head_sha}}'
        path: helm/your-app
        helm:
          parameters:
          - name: image.tag
            value: '{{head_sha}}'
          - name: ingress.host
            value: 'pr-{{number}}.preview.yourcompany.com'

Portal Layer: Backstage vs Port

The portal is the developer-facing surface of your IDP—a place to discover services, kick off workflows, and find documentation.

Backstage (Spotify, Open Source)

Backstage is the most widely adopted open-source option. It provides:

  • Software catalog: Auto-populated from your repositories via YAML files
  • TechDocs: Docs-as-code, rendered from Markdown in repos
  • Templates (Software Templates): Scaffolders that generate repos, configure CI, and register services
  • Plugin ecosystem: 200+ plugins for Kubernetes, CI/CD tools, monitoring, and more

When Backstage makes sense:

  • You have engineering capacity to maintain and customize it
  • You need deep integration with your existing toolchain
  • You want full control over the platform

Setup snapshot:

# catalog-info.yaml — dropped in every service repo
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: payment-service
  description: Handles payment processing and reconciliation
  annotations:
    github.com/project-slug: your-org/payment-service
    backstage.io/techdocs-ref: dir:.
    prometheus.io/rule: payment_service_errors_total
tags:
  - backend
  - payments
spec:
  type: service
  lifecycle: production
  owner: payments-team
  system: checkout
  providesApis:
    - payment-api
  dependsOn:
    - component:postgres-payments
    - component:stripe-webhook

Port (Commercial, SaaS)

Port is a managed IDP platform that reduces the operational burden of running Backstage:

  • No infrastructure to maintain
  • Visual builder for catalog schemas and self-service actions
  • Built-in RBAC and audit logging
  • Scorecards for service quality tracking

When Port makes sense:

  • Your team is small or lacks Backstage expertise
  • You want faster time-to-value
  • You’re willing to pay for a managed solution

Implementation Checklist

Use this checklist to assess where you are and what to build next.

Phase 1 — Foundation (Weeks 1–4)

  • Software catalog: every service has an owner, on-call, and runbook link
  • Standardized CI/CD pipeline template adopted by >50% of services
  • Centralized secret management (Vault, AWS Secrets Manager, or equivalent)
  • Structured logging standard defined and enforced in golden path

Phase 2 — Self-Service (Weeks 4–12)

  • Service scaffolding: new service bootstrapped in < 10 minutes
  • On-demand preview environments for all frontend and API services
  • IaC module library covering: compute, databases, queues, object storage
  • Developer portal launched (Backstage or Port)

Phase 3 — Quality Gates (Weeks 12–24)

  • Service scorecard with defined maturity levels (bronze/silver/gold)
  • Automated compliance checks in every pipeline (SBOM, CVE scanning, license checks)
  • SLO definitions and error budget tracking in catalog
  • Incident runbooks linked from catalog and auto-suggested in PagerDuty

Phase 4 — Continuous Improvement

  • Developer experience survey run quarterly, results reviewed by platform team
  • DORA metrics tracked: deploy frequency, lead time, MTTR, change failure rate
  • Platform adoption rate > 80% for new services

Common Mistakes to Avoid

1. Building a portal nobody asked for Start by talking to developers. The highest-value problems are usually around environment access, dependency discovery, or incident context—not a pretty UI.

2. Perfecting the platform before launching Ship a 60% solution and iterate. A rough golden path that exists beats a perfect one that’s six months away.

3. Mandating adoption without demonstrating value Platform teams that force adoption without earning it create resentment and workarounds. Show that the golden path saves time, then let adoption follow.

4. No platform team ownership An IDP maintained as a side project will drift and die. It needs a dedicated team, a roadmap, and user metrics treated like a product.


Measuring Platform Success

The platform team should track these metrics weekly:

MetricTargetWhy It Matters
Time to first deployment (new service)< 1 dayMeasures onboarding friction
% services on golden path> 80%Platform adoption
Deployment frequencyIncreasing quarter-over-quarterDeveloper velocity
MTTR (mean time to recover)DecreasingIncident tooling quality
Platform NPS (developer survey)> 30Developer experience

Conclusion

Platform engineering is ultimately a bet that improving the developer experience will compound into faster delivery and better reliability. The evidence in 2026 strongly supports that bet.

Start with the problems your developers complain about most. Build the simplest thing that solves them. Measure adoption ruthlessly. Iterate.

The best Internal Developer Platform is the one your developers choose to use—not because they have to, but because it’s genuinely the best way to get their work done.

Free Download

50 CLI Commands That Save Hours Every Week

The exact Git shortcuts, file search tricks, Docker commands, and productivity hacks that senior developers use daily. Compiled from 5+ years of shipping production code.

  • Git mastery (10 cmds)
  • File & search wizardry
  • Docker & DevOps tricks
  • Process & network tools
  • Productivity boosters
  • macOS & Linux install guide

No spam. 1 email/week max. Unsubscribe anytime.

Found this guide useful? Check out our free developer tools.