Skip to main content
Global
AIMenta
Blog

APAC Internal Developer Portal Guide 2026: Backstage, Port, and Cortex for Platform Engineering Teams

A practitioner guide for APAC platform engineering teams building internal developer portals in 2026 — covering Backstage for self-hosted open-source IDPs with maximum flexibility and plugin customization, Port for managed no-code software catalogs with self-service scaffolders and automated scorecards, and Cortex for service catalog and engineering intelligence with native PagerDuty on-call ownership integration and automated production readiness scorecard scoring.

AE By AIMenta Editorial Team ·

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.

Keep reading

Related reading

Want this applied to your firm?

We use these frameworks daily in client engagements. Let's see what they look like for your stage and market.