Why APAC Platform Engineering Teams Build Internal Developer Portals
APAC engineering organizations scaling from 50 to 500+ engineers face a discovery problem: developers can't find which team owns a service, which runbook applies to an incident, which scaffolding template to use for a new microservice, or which engineering standards apply to their team. This information exists — scattered across Confluence pages, GitHub wikis, Slack messages, and individual engineers' heads — but is not centrally discoverable or actionable.
Internal developer portals (IDPs) address this by providing a curated, centrally maintained view of engineering assets (services, teams, tools, environments) alongside self-service developer actions and service maturity standards. The Gartner prediction that 80% of large software engineering organizations will have an IDP by 2026 reflects the recognition that developer portals are platform engineering infrastructure, not optional tooling.
Three tools serve the APAC IDP spectrum:
Backstage — open-source, self-hosted IDP framework from Spotify. Maximum flexibility, requires APAC platform engineering investment to build and maintain.
Port — managed IDP platform. No-code catalog configuration, self-service scaffolders, and scorecards with 70+ out-of-box integrations.
Cortex — service catalog and engineering intelligence platform. Scorecard-focused with strong PagerDuty on-call ownership integration.
The APAC IDP Problem Space
What APAC developers struggle to find without a portal
APAC Developer Scenario: "Our APAC payments service returned 500 errors at 3am.
I need to escalate — who owns the APAC fraud detection service it depends on?"
Without an APAC IDP:
1. Search Confluence for "fraud detection service owner" — 12 results, all outdated
2. Ask in #apac-platform Slack — team is asleep in different APAC timezone
3. Search GitHub org for "fraud-detection" — 3 repos, unclear which is production
4. Check PagerDuty manually — requires PagerDuty access
5. 25 minutes to find the right APAC on-call engineer to escalate to
Mean time to engage: 25 minutes
With an APAC IDP (Port/Cortex/Backstage):
1. Search IDP for "fraud detection" → instant APAC service card
2. APAC service card shows: owner (APAC Risk team), on-call ([email protected]),
runbook (link), Datadog dashboard (link), last deployment (2h ago), dependencies
3. Direct APAC Slack DM to on-call engineer with incident context
Mean time to engage: 2 minutes
APAC IDP value dimensions
Dimension Backstage Port Cortex
───────────────────────────────────────────────────────────
Software catalog ✓ ✓ ✓
Self-service actions ✓ (plugins) ✓ (no-code) Limited
Service scorecards ✓ (plugins) ✓ ✓ (strong)
On-call ownership Plugin req. Integration ✓ native
Deployment tracking Plugin req. Integration Integration
Setup time (est.) 3-6 months 2-4 weeks 2-4 weeks
Maintenance burden High Low Medium
Cost Self-hosted SaaS (paid) SaaS (paid)
APAC customization Maximum Medium Medium
Backstage: Open-Source APAC IDP Framework
Backstage architecture for APAC deployments
APAC Backstage Deployment Architecture:
Frontend (React SPA):
├─ @backstage/plugin-catalog-frontend — APAC service catalog UI
├─ @backstage/plugin-techdocs-frontend — APAC documentation portal
├─ @backstage/plugin-scaffolder-frontend — APAC service scaffolding UI
└─ Custom APAC plugins (TypeScript/React) — APAC internal tool integrations
Backend (Node.js):
├─ @backstage/plugin-catalog-backend — APAC catalog entity ingestion
├─ @backstage/plugin-scaffolder-backend — APAC template execution
├─ APAC custom backend plugins — APAC internal API integrations
└─ PostgreSQL — APAC catalog persistence
APAC Catalog sources:
├─ catalog-info.yaml in each GitHub repo (service ownership as code)
├─ Kubernetes cluster entity ingestion
└─ APAC custom data sources via catalog processors
APAC catalog-info.yaml — service ownership as code
# catalog-info.yaml — committed to each APAC service repository
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: apac-payments-service
description: "APAC payment processing microservice handling SEA transaction flows"
annotations:
github.com/project-slug: apac-company/payments-service
pagerduty.com/service-id: "APAC_PAYMENTS_SVC_ID"
backstage.io/kubernetes-label-selector: "app=apac-payments-service"
datadog.com/dashboard-url: "https://app.datadoghq.com/dashboard/apac-payments"
runbook: "https://runbooks.apac.company.com/payments/overview"
tags:
- apac
- payments
- sea
- fintech
spec:
type: service
lifecycle: production
owner: group:apac-payments-team
system: apac-payment-platform
dependsOn:
- component:apac-fraud-detection-service
- component:apac-kyc-service
- resource:apac-payments-postgres
Backstage software templates for APAC scaffolding
# template.yaml — APAC new microservice scaffolder
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: apac-microservice-template
title: APAC Go Microservice
description: Create a new APAC Go microservice with standard APAC tooling
spec:
owner: apac-platform-team
type: service
parameters:
- title: APAC Service Details
required: [apacServiceName, apacTeam, apacRegion]
properties:
apacServiceName:
title: APAC Service Name
type: string
pattern: '^apac-[a-z-]+$'
apacTeam:
title: APAC Owning Team
type: string
enum: ['apac-payments', 'apac-kyc', 'apac-platform', 'apac-risk']
apacRegion:
title: Primary APAC Region
type: string
enum: ['SEA', 'NEA', 'ANZ']
steps:
- id: fetch-apac-template
name: Fetch APAC Template
action: fetch:template
input:
url: ./skeleton
values:
apacServiceName: ${{ parameters.apacServiceName }}
- id: publish-apac-repo
name: Publish APAC Repository
action: publish:github
input:
allowedHosts: ['github.com']
repoUrl: github.com?owner=apac-company&repo=${{ parameters.apacServiceName }}
- id: register-apac-catalog
name: Register APAC in Catalog
action: catalog:register
input:
repoContentsUrl: ${{ steps['publish-apac-repo'].output.repoContentsUrl }}
catalogInfoPath: /catalog-info.yaml
Port: No-Code APAC Software Catalog and Self-Service
Port blueprint configuration (no custom code)
# port-blueprint.yaml — APAC service entity definition
identifier: apacService
title: APAC Service
icon: Microservice
schema:
properties:
apacTeam:
title: APAC Owning Team
type: string
apacRegion:
title: APAC Region
type: string
enum: [SEA, NEA, ANZ]
apacTier:
title: APAC Criticality Tier
type: string
enum: [Tier-1, Tier-2, Tier-3]
apacRunbook:
title: APAC Runbook URL
type: string
format: url
apacPagerDutyService:
title: APAC PagerDuty Service ID
type: string
Port self-service action — APAC service provisioning
# port-action-provision-service.yaml — APAC self-service without tickets
identifier: provision-apac-service
title: Provision APAC Service
icon: Github
trigger:
type: self-service
operation: CREATE
blueprintIdentifier: apacService
invocationMethod:
type: GITHUB
org: apac-company
repo: platform-automation
workflow: provision-apac-service.yml
workflowInputs:
apac_service_name: "{{ .inputs.apacServiceName }}"
apac_team: "{{ .inputs.apacTeam }}"
apac_region: "{{ .inputs.apacRegion }}"
userInputs:
properties:
apacServiceName:
title: APAC Service Name
type: string
apacTeam:
title: APAC Team
type: string
apacRegion:
title: APAC Region
type: string
enum: [SEA, NEA, ANZ]
Port scorecard — APAC production readiness
# port-scorecard-production-readiness.yaml
identifier: apac-production-readiness
title: APAC Production Readiness
levels:
- color: red
title: Not Ready
- color: orange
title: Basic
- color: green
title: Production Ready
rules:
- identifier: has-apac-owner
title: Has APAC Owner
level: Basic
query:
combinator: and
rules:
- property: apacTeam
operator: isNotEmpty
- identifier: has-apac-runbook
title: Has APAC Runbook
level: Basic
query:
combinator: and
rules:
- property: apacRunbook
operator: isNotEmpty
- identifier: has-apac-pagerduty
title: APAC PagerDuty Configured
level: Production Ready
query:
combinator: and
rules:
- property: apacPagerDutyService
operator: isNotEmpty
Cortex: APAC Service Scorecard Intelligence
Cortex scorecard for APAC engineering standards
# cortex-scorecard.yaml — APAC engineering standards scorecard
tag: apac-production-readiness
name: APAC Production Readiness
description: Standards for APAC services operating in production
rules:
- title: APAC On-Call Owner
description: Service has an APAC on-call owner in PagerDuty
expression: pagerduty != null && pagerduty.service != null
weight: 3
- title: APAC SLO Defined
description: Service has at least one SLO defined in Cortex
expression: slos != null && slos.count > 0
weight: 3
- title: APAC Runbook Documented
description: Service has a runbook URL in the catalog
expression: custom_data.apac_runbook != null
weight: 2
- title: APAC Test Coverage >70%
description: Service has code test coverage above APAC threshold
expression: github.code_coverage > 70
weight: 2
- title: APAC No Critical Vulnerabilities
description: Service has no critical severity APAC security vulnerabilities
expression: security_scan.critical_count == 0
weight: 3
Cortex on-call ownership view
Cortex APAC Service Catalog — apac-payments-service:
Service Details:
Team: APAC Payments
Tier: Tier-1 (revenue-critical)
APAC Region: SEA primary, NEA secondary
Last Deploy: 2h ago (v2.4.2 — healthy)
On-Call Now: [email protected] (APAC Payments team)
Escalation: [email protected] (APAC Payments lead)
Next shift: [email protected] (starts 2026-04-30 08:00 SGT)
APAC Scorecard: 83% (Production Ready)
✓ On-call owner configured
✓ SLO defined (99.9% availability)
✓ Runbook: https://runbooks.apac.company.com/payments
✗ Test coverage: 62% (below APAC 70% threshold)
✗ 2 critical vulnerability findings (security scan)
Dependencies:
apac-fraud-detection-service [Tier-1, APAC Risk team]
apac-kyc-service [Tier-2, APAC KYC team]
apac-payments-postgres [RDS, ap-southeast-1]
APAC IDP Tool Selection
APAC IDP Need → Tool → Why
APAC platform team with frontend → Backstage Maximum customization; APAC
engineering capacity (React/TS) → plugin ecosystem; self-hosted
APAC organization wanting portal in → Port No-code catalog + self-service
weeks, not months → actions; 70+ APAC integrations
APAC teams prioritizing on-call → Cortex Native PagerDuty integration;
ownership and incident navigation → APAC service→owner→escalation
APAC organizations on tighter IDP → Port Freemium entry; APAC scorecard
budget than Cortex commercial → and catalog without enterprise price
APAC early-stage IDP program → Configure8 Scorecard tracking without full
(starting with scorecards only) → APAC IDP infrastructure investment
APAC teams wanting full developer → Backstage Software Templates handle complex
self-service customization → APAC scaffolding flows plugins can't
Related APAC Platform Engineering Resources
For the DORA metrics that IDPs surface in service scorecards, see the APAC DORA metrics guide covering LinearB, Sleuth, and Swarmia.
For the SLO tools that provide the SLO data surfaced in Cortex and Port scorecards, see the APAC SLO management guide covering Pyrra, Sloth, and OpenSLO.
For the Kubernetes platform that Backstage catalogs and Port self-service scaffolders provision into, see the APAC Kubernetes platform engineering essentials guide covering vCluster, External Secrets, and ExternalDNS.
Beyond this insight
Cross-reference our practice depth.
If this article matches your stage of thinking, the underlying capabilities ship across all six pillars, ten verticals, and nine Asian markets.