A Backstage-based Internal Developer Platform that gives developers a single portal to discover services, browse docs, scaffold new projects, and monitor CI/CD — without filing DevOps tickets. Golden-path templates turn a 2-week setup into a 5-minute prompt.
Without an IDP:
- Developer needs a new microservice → tickets to Platform, Security, and Ops teams → 2 weeks
- No single place to find which team owns a service or what version is deployed
- Docs live in 4 different wikis, none of them current
With an IDP:
Developer types: idp scaffold --template microservice --name payment-api
Result in 30 seconds:
✓ GitHub repo created (srujantata/payment-api)
✓ CI/CD pipeline wired (Jenkins → SonarQube → Harbor → ArgoCD)
✓ Kubernetes manifests generated (Deployment + Service + HPA + NetworkPolicy)
✓ Grafana dashboard pre-provisioned
✓ Service registered in Software Catalog
✓ TechDocs page created
Developer Browser
│
▼
Backstage Portal (React SPA)
├── Software Catalog ──► Component YAML in each repo
├── TechDocs ──► mkdocs-material, auto-built from /docs
├── Templates ──► Scaffolder: generates repos + registers components
└── Plugins
├── Jenkins ──► latest pipeline status per component
├── ArgoCD ──► sync status + health
├── SonarQube ──► quality gate + coverage metrics
├── Harbor ──► image tags + vulnerability summary
└── AWS Cost ──► per-namespace spend from Cost Explorer API
│
▼
Backend (Node.js)
├── catalog-backend ──► reads catalog-info.yaml from all repos
├── scaffolder-backend ──► runs Cookiecutter / GitHub API calls
└── techdocs-backend ──► builds + serves MkDocs sites
Every service registers itself by committing a catalog-info.yaml:
# catalog-info.yaml (in each service repo)
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: payment-api
description: Handles payment processing for checkout flow
annotations:
jenkins.io/job-full-name: "payment-api/main"
argocd/app-name: payment-api
sonarqube.org/project-key: payment-api
github.com/project-slug: srujantata/payment-api
tags:
- java
- payments
- tier-1
links:
- url: https://grafana.internal/d/payment-api
title: Grafana Dashboard
spec:
type: service
lifecycle: production
owner: group:platform-team
system: checkout
dependsOn:
- component:postgres-db
- component:kafka
providesApis:
- payment-api-v1The scaffolder template creates everything a new microservice needs:
# templates/microservice/template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: microservice
title: "New Microservice"
description: "Scaffold a production-ready microservice with CI/CD, k8s manifests, and observability"
tags: [java, go, python, recommended]
spec:
owner: group:platform-team
type: service
parameters:
- title: Service Details
required: [name, language, owner]
properties:
name:
title: Service Name
type: string
pattern: '^[a-z][a-z0-9-]*$'
language:
title: Language
type: string
enum: [java, go, python]
owner:
title: Owner Team
type: string
ui:field: OwnerPicker
steps:
- id: fetch-template
name: Fetch template
action: fetch:template
input:
url: ./skeleton
values:
name: ${{ parameters.name }}
language: ${{ parameters.language }}
owner: ${{ parameters.owner }}
- id: create-github-repo
name: Create GitHub repo
action: publish:github
input:
repoUrl: github.com?repo=${{ parameters.name }}&owner=srujantata
defaultBranch: main
repoVisibility: private
- id: register-catalog
name: Register in catalog
action: catalog:register
input:
repoContentsUrl: ${{ steps['create-github-repo'].output.repoContentsUrl }}
catalogInfoPath: /catalog-info.yamlShows latest build status inline with each catalog component:
// packages/app/src/components/catalog/EntityPage.tsx
import { EntityJenkinsContent } from '@backstage-community/plugin-jenkins';
const serviceEntityPage = (
<EntityLayout>
<EntityLayout.Route path="/ci-cd" title="CI/CD">
<EntityJenkinsContent />
</EntityLayout.Route>
</EntityLayout>
);import {
EntityArgoCDOverviewCard,
EntityArgoCDHistoryCard,
} from '@roadiehq/backstage-plugin-argo-cd';
// Shows sync status, health, and deployment history
<EntityArgoCDOverviewCard />
<EntityArgoCDHistoryCard />// Shows per-namespace AWS spend, helping teams own their cloud costs
import { EntityCostInsightsCard } from '@backstage-community/plugin-cost-insights';
<EntityCostInsightsCard />Every service gets auto-generated documentation from its /docs directory:
# mkdocs.yml (in each service repo)
site_name: Payment API
docs_dir: docs/
plugins:
- techdocs-core
nav:
- Home: index.md
- API Reference: api.md
- Runbooks: runbooks/
- Architecture: architecture.mdWhen a PR merges, the TechDocs pipeline builds and publishes the site automatically. Docs live next to code — they stay current because they break CI when they don't.
# Create Backstage app
npx @backstage/create-app@latest --name internal-developer-platform
cd internal-developer-platform
# Install community plugins
yarn --cwd packages/backend add \
@backstage-community/plugin-jenkins-backend \
@roadiehq/backstage-plugin-argo-cd-backend
yarn --cwd packages/app add \
@backstage-community/plugin-jenkins \
@roadiehq/backstage-plugin-argo-cd
# Configure (app-config.yaml)
cat >> app-config.yaml << 'EOF'
jenkins:
baseUrl: http://jenkins.jenkins.svc.cluster.local:8080
username: ${JENKINS_USERNAME}
apiKey: ${JENKINS_API_KEY}
argocd:
baseUrl: https://argocd.your-cluster.internal
token: ${ARGOCD_TOKEN}
EOF
# Run locally
yarn dev
# Deploy to Kubernetes
helm repo add backstage https://backstage.github.io/charts
helm install backstage backstage/backstage \
-n backstage --create-namespace \
-f helm/values.yaml- Developers — scaffold new services, discover existing ones, check CI/CD without leaving the portal
- Tech leads — see quality gates, coverage, and ownership for every component in the org
- Platform team — enforce golden-path standards via templates instead of tribal knowledge
- Finance/management — per-team AWS cost attribution from the Cost plugin
- Backstage IDP deployment and configuration
- Software Catalog with multi-team component ownership
- Scaffolder golden-path templates (GitHub repo + CI/CD + k8s + catalog registration in one command)
- TechDocs auto-generated living documentation
- Plugin integration: Jenkins, ArgoCD, SonarQube, Harbor, AWS Cost
- Developer self-service platform reducing time-to-new-service from weeks to minutes