Designing an Internal Developer Platform: Abstraction Layers, Golden Paths, and the Governance Balance
How to design the abstraction layer between your platform and your application teams — what to hide, what to expose, and how to build the golden paths that make good practices the easy practices.
The design of a platform's abstraction layer determines whether developers adopt it or route around it. Abstract too much and developers cannot do what they need; developers write workarounds that bypass the platform. Abstract too little and the platform is just documentation — developers face the same complexity they had before. The right abstraction hides complexity developers should not need to manage and exposes control over the things that vary legitimately between services.
The Golden Path Concept
A golden path is an opinionated, supported route through the platform — the recommended way to deploy a service, set up monitoring, or manage a secret. It is not the only way, but it is the way that is documented, tested, and automatically compliant with security and operational standards.
The golden path removes decision fatigue from developers. Instead of evaluating 15 options for CI/CD configuration, the developer follows the golden path and gets a working, compliant pipeline. The platform team has made the decisions that are the same for every service; the developer makes the decisions that are specific to their service.
Golden path for deploying a service:
1. Run: platform service create my-service --template api-service
→ Creates repository with standard structure
→ Configures CI pipeline with security gates
→ Creates Kubernetes namespace with resource quotas
→ Sets up basic monitoring (RED metrics, logs, traces)
→ Registers service in the service catalogue
2. Write your application code
3. Push to main → automated deployment to staging
4. platform deploy my-service --env production → production deployment with approval gate
The developer writes application code. The platform handles infrastructure, compliance, and observability.
What to Abstract vs What to Expose
A useful design heuristic: abstract whatever is the same for all services; expose control over whatever varies legitimately between services.
Abstract (same for all services, hide the complexity):
- Kubernetes deployment YAML structure
- Container registry authentication
- TLS certificate provisioning
- Default network policies
- Standard observability configuration (log format, metric endpoints)
- Security scanning in CI
Expose (legitimately varies between services, give developers control):
- Resource requests and limits (services have different load profiles)
- Scaling configuration (autoscaling thresholds differ by workload)
- Environment-specific configuration (connection strings, feature flags)
- Service dependencies (what services does this service depend on?)
- Custom alerting thresholds (what constitutes a problem for this service)
The platform interface should be simple enough that a new developer can deploy their first service within one day without reading infrastructure documentation. Every hour spent debugging platform configuration is an hour not spent on product work.
The Escape Hatch Design Decision
Rigid platforms break when developers encounter legitimate requirements outside the golden path. Every platform needs escape hatches: defined ways to access the underlying infrastructure when the abstraction is insufficient.
Tiered access model:
- Tier 1 (default): use the golden path. Fully managed, compliant, no infrastructure knowledge required.
- Tier 2 (advanced): customise parameters within the golden path. Override specific resource limits, add custom health check paths, configure environment-specific variables.
- Tier 3 (escape hatch): access the underlying infrastructure directly, with approval and documentation requirements. "I need a sidecar container for X reason" or "I need a custom network policy for Y integration."
Escape hatches prevent the platform from becoming an obstacle while keeping usage visible. If 30% of services are using Tier 3 regularly, that is a signal that the golden path does not cover a common requirement — time to add it to Tier 2.
Service Catalogues: Making the Platform Discoverable
A service catalogue is the discovery layer for the platform. It answers: what services exist, who owns them, what do they depend on, and how do they behave?
Backstage (from Spotify, now a CNCF project) is the most widely adopted open-source service catalogue. It provides:
- A registry of all services with ownership, contact, and documentation
- Integration with CI/CD pipelines to show deployment status
- Plugin ecosystem for integrating monitoring, on-call schedules, and runbooks
- Software templates that generate new services from golden paths
## backstage/catalog-info.yaml — registered with the catalogue
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: billing-service
description: Processes billing events and generates invoices
annotations:
github.com/project-slug: org/billing-service
pagerduty.com/integration-key: abc123
grafana/dashboard-url: https://grafana.internal/d/billing
spec:
type: service
lifecycle: production
owner: billing-team
dependsOn:
- component:payment-service
- component:customer-service
- resource:billing-database
Policy as Code: Governance Without Bureaucracy
The platform enforces governance automatically, not through approval gates. Security, compliance, and operational standards are encoded as policies that evaluate every deployment:
## OPA/Gatekeeper policy: no containers running as root
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sNoRoot
metadata:
name: no-root-containers
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
namespaces: ["production", "staging"]
When a developer deploys a container configured to run as root, the deployment is rejected automatically with a clear error message: "Container 'my-api' is configured to run as root (uid 0). Use a non-root user. See platform documentation for the correct pattern."
The developer does not need to talk to a security team; the platform enforces the standard and explains how to comply. The security team focuses on defining policies, not enforcing them manually.
The right platform design produces the opposite of bureaucracy: developers move faster because they do not have to think about infrastructure, and governance is stronger because it is automated rather than manual.
Related
Platform Observability: Building the Visibility Layer Every Application Team Gets Automatically
How platform teams build and operate the metrics, logging, and tracing infrastructure that application teams consume without configuring — and what good platform observability coverage actually looks like.
Neural Networks Explained: What They Are, How They Learn, and Why They Work
Neurons, layers, weights, activation functions, backpropagation, and gradient descent — the actual mechanics of how a neural network learns from data, explained without the mathematics becoming the obstacle.
RAG, Prompting, and Building Applications on LLMs: The Practitioner's Guide
Retrieval-augmented generation, system prompts, few-shot examples, chain-of-thought, structured output, and the engineering patterns that make LLM applications reliable in production.
Working on this in production?
We do this work directly alongside engineering teams — architecture review, migration, and hands-on enablement.