A Mini Internal Developer Platform built from scratch to demonstrate modern platform engineering practices.
A self-service developer platform where engineers spin up new services with a single Backstage form — with GitHub repo, CI pipeline, and Kubernetes deployment wired up automatically. No tickets. No manual ops.
Developer fills Backstage form (name, team, language, namespace)
↓
GitHub repo created under idp-lab-org
(working code + GitHub Actions CI pipeline)
↓
PR raised to idp-lab-gitops
(deployment manifests + ArgoCD Application)
↓
PR merged → ArgoCD auto-deploys to Kubernetes dev namespace
↓
Service running • catalog registered • zero manual Kubernetes work
| Repo | Description |
|---|---|
| idp-lab-gitops | GitOps config — deployments, ArgoCD apps, Backstage templates |
| idp-lab-backstage | Backstage developer portal |
| payment-ui | Sample Node.js frontend — created via golden path |
| payment-service | Sample Python backend — created via golden path |
| Layer | Tool |
|---|---|
| Kubernetes | kind (local) |
| GitOps | ArgoCD with App of Apps pattern |
| Self-service infra | Crossplane (custom AppEnvironment XRD) |
| CI/CD | GitHub Actions → Docker Hub |
| Developer portal | Backstage |
| GitHub auth | GitHub App — no PAT tokens, auto-rotating tokens |
- GitHub App instead of personal PAT tokens — short-lived tokens, auto-rotated
- Org-level secrets for CI — no per-repo secret management
- Pre-commit hooks blocking
.pemfiles and credential patterns - Gitignored secrets —
app-config.yamland.pemfiles never committed - Environment variable injection for private keys at runtime
payment-ui and payment-service demonstrate real microservice communication inside Kubernetes:
- User types a message in the UI
- UI sends it to the Python backend via Kubernetes internal DNS
- Backend processes it and returns the result with the actual pod name and namespace
- Proves both services are running and connected inside the cluster
Built by @sky2194 as a platform engineering portfolio project.