Build Golden Paths Developers Will Actually Use
At 2am, nobody wants to discover that a service was built from a copied Helm chart last touched eighteen months ago. The chart still points at an abandoned image registry, the readiness probe checks the wrong port, and the deployment job requires credentials owned by someone who left the company.
This is how internal developer platforms usually begin. Not with a grand platform engineering strategy, but with enough delivery papercuts that somebody finally says, "We should standardise this."
They are right. The trouble starts when standardisation becomes a portal project instead of a delivery project.
A useful internal developer platform gives teams a supported route from repository creation to production. That route is the golden path. It should encode how your organisation handles CI/CD, GitOps, infrastructure, security controls, observability, and Kubernetes operations. More importantly, it should remove decisions that application teams should never have been forced to make.
Start with the deployment you already understand
Do not start by designing a platform for every workload the company might run in five years. Start with one service shape that is common, understood, and painful today.
A sensible first candidate is usually a stateless HTTP service deployed to Kubernetes. The golden path might provide:
- A repository template with build, test, and ownership files
- A hardened container build with dependency and image scanning
- A standard Helm chart or Kustomize base
- Resource requests, probes, disruption budgets, and security contexts
- GitOps deployment through Argo CD or Flux
- Logs, metrics, traces, alerts, and dashboard links
- A documented escape hatch for requirements the template cannot meet
That is already a substantial product. Adding databases, queues, scheduled jobs, GPU workloads, and twelve cloud services before this path works is how platform teams create a large backlog and a small user base.
The first path should be narrow enough to maintain and useful enough that teams voluntarily choose it.
The contract belongs in Git
A golden path needs a clear contract. Developers should be able to see what the platform expects without reverse engineering a portal or asking in Slack.
For example, a small service descriptor can capture the inputs that differ between applications:
apiVersion: platform.tecleads.io/v1
kind: Service
metadata:
name: invoice-api
spec:
owner: finance-platform
runtime: nodejs22
port: 8080
environments:
- development
- staging
- production
exposure: internal
persistence: none
observability:
alerts: standard-http
The platform can turn that contract into repository files, CI/CD workflows, Kubernetes manifests, GitOps application definitions, and observability configuration. Whether the implementation uses Backstage templates, Port, Humanitec, Crossplane, custom controllers, or a modest collection of scripts matters less than the quality of the contract.
Keep the descriptor boring. If developers need a training course to create one, the abstraction is leaking.
Store generated deployment configuration in Git where teams can review it. A pull request showing an image update from one digest to another is easier to audit than a deployment hidden behind a portal button. The portal can provide the front door, but Git should remain the source of truth.
Your CI pipeline is part of the product
Many platforms generate a repository and then abandon the team to maintain several hundred lines of pipeline YAML. That is scaffolding, not a golden path.
Put common CI/CD behaviour in versioned, reusable workflows. A service pipeline should call a supported workflow that handles the repetitive controls:
jobs:
build:
uses: tecleads-platform/workflows/.github/workflows/container.yml@v3
with:
dockerfile: Dockerfile
image: invoice-api
run_tests: true
publish_sbom: true
secrets: inherit
The reusable workflow can pin build actions, issue short-lived cloud credentials through OIDC, run tests, scan dependencies, produce an SBOM, sign the image, and publish an immutable digest. Application teams still own their code and tests. The platform team owns the delivery machinery.
Version these workflows properly. Publishing v4 should not silently change every repository using v3. Run representative consumer repositories against a candidate release before promoting it. Platform changes can break production just as effectively as application changes, except they often break several teams at once.
The same principle applies across AWS, Azure, GCP, OCI, and on-prem Kubernetes. Keep workload identity, registry access, and cluster-specific details behind the platform contract. Do not pretend the providers are identical. Give teams a consistent interface while preserving the controls each environment actually needs.
GitOps should make drift visible, not mysterious
Once the pipeline publishes an image, it should update the desired state through a pull request or an automated promotion process with an audit trail. Argo CD or Flux then reconciles that state into the cluster.
This separation matters. The CI system builds an artifact. The GitOps controller deploys it. CI credentials do not need broad write access to Kubernetes, and the cluster continuously reports whether reality matches Git.
There is still room for operational judgement. Automatic reconciliation is sensible for most application resources. Automatic pruning of shared namespaces, custom resource definitions, or security policy needs more care. One bad ownership label can turn a tidy GitOps cleanup into an incident.
Expose reconciliation status where developers already work. A portal page that says "deployment failed" is not enough. Link directly to the Argo CD application, the failed health check, the relevant logs, and the commit that introduced the change. The golden path must shorten diagnosis, not add another screen to click through.
Guardrails need useful error messages
Admission policies are a good place to enforce requirements that cannot be optional. Kyverno or OPA Gatekeeper can reject privileged containers, mutable image tags, missing resource requests, or workloads without an approved registry.
A rejection such as policy violation is technically accurate and operationally useless. Tell the developer what failed, why the control exists, and how to fix it. Include a working example.
Run the same checks before deployment where possible. A policy failure in a pull request costs minutes. The same failure after a production promotion has already started costs attention, interrupts another team, and usually generates a noisy incident channel.
Security controls that arrive early feel like normal engineering constraints. Controls that appear only at the cluster boundary feel like traps.
Measure whether the path helps delivery
Adoption is not proof that the platform works, especially if use is mandatory. Measure where teams wait, retry, or leave the path.
DORA metrics can help assess the delivery system: deployment frequency, lead time for changes, change failure rate, and time to restore service. Use them to find friction in the system, not to rank developers or teams. Once a metric becomes a target for individual performance, people will optimise the number instead of the delivery process.
Pair those metrics with direct platform signals. Watch workflow failure reasons, GitOps reconciliation time, template abandonment, policy rejection patterns, and support requests. If several teams override the same default, the default is probably wrong. If every exception requires a meeting, the platform is becoming a ticket queue with nicer branding.
Keep the escape hatch
A golden path is supported, not compulsory in every detail. Teams running unusual workloads need a way out, but leaving the path should be an explicit engineering decision with ownership attached.
Document which guarantees disappear when a team opts out. Perhaps they own pipeline maintenance, security updates, dashboards, or Kubernetes upgrades. That makes the trade clear without turning the platform team into architecture police.
The best pressure toward adoption is simple: make the supported path faster, safer, and less annoying than building everything from scratch.
If you only do one thing this week
Take one production service and write down every manual decision between git init and a healthy deployment. Mark which decisions genuinely belong to the application team. Automate one of the rest, including its failure message and operational documentation.
That is the beginning of a platform. Not a portal, not a product announcement, and not another committee. A working path that removes one piece of delivery friction, then keeps doing it.
If this is on your plate, TecLeads does exactly this as part of our DevOps & Platform Engineering work. If you'd like a second pair of eyes on your setup, book a 30-minute call or explore what we do.