Migrate from Port to Backstage

Moving a Port catalog to self-hosted Backstage is mostly a data mapping and rebuild exercise. This page covers what moves cleanly, what needs rework, and the sequence to cut over safely.

On this page

How to migrate from Port to Backstage without losing the catalog

If your renewal, data residency rules or lock-in concerns are pushing you off Port, the short answer is this: the catalog can move, but Port blueprints must be remapped to Backstage kinds such as Component, API, Resource, System and Domain, and Port's self-service actions have to be rebuilt as Software Templates. Platform engineering teams usually own this work, often with an implementation partner who handles the export scripts, the descriptor templates and the cutover plan. The effort depends mostly on how many blueprints you have, how many relationships between them need to survive, and how many actions carry business logic that lives in Port's action runners today. Treat the blueprint inventory as the first deliverable, because every later step depends on it.

Backstage is licensed under Apache-2.0 and has no paid edition from the project itself, so the license line on your quote should be zero. What remains is infrastructure (a PostgreSQL database, hosting for the backend and the frontend, and CI for the portal's own build), the build effort to model entities and author templates, the plugins you need for integrations, and the ongoing time a team spends upgrading Backstage. Backstage ships a monthly main release line and a weekly next line, so budget for regular upgrades rather than a one-off project. Ask any partner to split their quote into those components. Confirm with your own team whether you also want an identity provider for sign-in, because Backstage's authentication documentation expects sign-in resolvers that map every provider to the same identity and advises against guest access in production.

Run the old and new portals side by side during cutover. Export entities from Port first, using its API as described in the Port export guidance, then generate catalog-info.yaml files and register them through a Location so that ownership and relationships are visible in Backstage before you turn anything off. Keep Port read-only for teams that still depend on it, and set a dated checklist per team covering catalog accuracy, template parity and access rules. Confirm your rollback path before you retire any Port integration, because Port's data integrations may still feed Port's own catalog in parallel. Plan for the data that will not map cleanly, such as Port scorecards and custom properties, and decide in advance whether you rebuild them or accept a gap.

Which Port capabilities map to Backstage and which need rework

This table maps each part of a Port catalog to its closest Backstage equivalent and labels it clean, needs rework or gap. Read the rows as a starting inventory for your migration, then check each Port-specific feature against your own blueprints and integrations. The main takeaway is that the catalog data model moves cleanly, while actions, integrations and access rules need design work.

Port capabilityBackstage equivalentStatus
Blueprints for Component, API and Resource entitiesCatalog kinds Component, API and Resource, each described in a catalog-info.yaml fileClean: map each blueprint to one kind, then confirm the spec fields you rely on
Blueprints for Service groupings and ownershipSystem, Domain, Group and User kinds, linked through owner and system referencesNeeds rework: relations must be re-expressed as Backstage references
Entities and their propertiesEntity metadata, spec fields and annotations in catalog-info.yaml files kept in GitNeeds rework: export entities, then decide which properties stay in Git and which come from live sources
Self-service actionsSoftware Templates with scaffolder actionsNeeds rework: rebuild each action as a template and confirm approval steps and backend runners
Ocean integrations for Kubernetes, cloud and CI dataBackstage plugins such as Kubernetes, or custom ingestion into the catalogGap: confirm a plugin exists for each source before planning custom ingestion
Scorecards and maturity rulesScorecard or insights plugins, which must be confirmed for your Backstage versionGap: confirm plugin availability and rebuild rules as code
Role-based access by plan and teamSign-in resolvers and permission policies, configured per deploymentNeeds rework: map Port roles to Backstage groups and test that identities resolve consistently
Port-specific UI features and dashboardsBackstage home page and custom UI pluginsGap: confirm each Port-only view or widget and budget custom plugin work

What data moves out of Port and what to rebuild

Port's catalog data leaves through two routes: its REST API and the state of the Terraform resources that manage it. What you can move cleanly is the entity and blueprint data, while integrations, identity links and Ocean-based feeds need to be rebuilt on the Backstage side.

REST API export path

Blueprints and entities can be read through Port's REST API and written to JSON, which becomes the input for generating catalog-info.yaml files. Before you script the export, confirm the regional API endpoint for your Port organization, the access token lifetime and the request limits in Port's current documentation, since these shape how you page through large catalogs. Store the raw export unchanged so you can rerun the mapping as blueprints evolve.

Terraform state route

If Port blueprints and entities were provisioned with Terraform, the state file holds resource definitions that can be read as a second source of truth. This route is useful for catching blueprints created in code, but state may lag behind changes made in the Port UI. Reconcile the state output against the API export before you treat either as complete.

Blueprints become catalog kinds

Each Port blueprint must be assigned a Backstage kind, typically Component, API, Resource, System or Domain. Properties map to spec and metadata fields, and relations map to dependsOn or ownerOf references. Decide the mapping per blueprint in writing, because a blueprint that describes both a service and a database often needs to split into two entities.

Ownership and identity links

Port teams, user references and ownership fields must resolve to Backstage Group and User entities that match your identity provider. Backstage sign-in resolvers need to map every login method to the same identity, so ownership data is only useful once those identifiers are consistent. Check for stale users and retired teams during the mapping review.

Ocean feeds must be rebuilt

Port's data integrations, most built on its Ocean framework, pull from sources such as Git, CI and cloud accounts on a resync interval. Those feeds do not transfer to Backstage. Each one needs a replacement, either a Backstage plugin, a catalog processor or a scheduled ingestion job, and each replacement needs an owner who will maintain it after cutover.

Git and CI links to reconnect

Port entities link to repositories, pipelines and deployment records. In Backstage, these links are set through annotations in catalog-info.yaml and through the plugins that read them, so each annotation and each plugin needs an explicit check. Confirm that every Git and CI link resolves to a live repository and pipeline before you retire the Port links.

Migration sequence from inventory to decommission

This sequence moves a Port catalog into a self-hosted Backstage portal in controlled stages, so each stage produces evidence before the next one starts. Port stays live until the Backstage portal has been checked against it, users are moved, and every action has a tested replacement.

  1. Inventory blueprints, entities and actions

    Export the Port data model in full: every blueprint with its properties and relations, the entity counts per blueprint, the self-service actions, and the scorecards and integrations that feed them. Record which Port integrations are hosted by Port and which are self-hosted with Helm or Docker, because the self-hosted ones carry their own infrastructure to retire or keep. Have the owning teams confirm which entities are still active. The output is an inventory spreadsheet with one row per blueprint, action and integration, marked keep, map, rebuild or retire.

  2. Run a pilot with one domain

    Choose a single domain with a small number of services, a team willing to give feedback, and a clear owner. Stand up a Backstage instance in your infrastructure with PostgreSQL, sign-in through your identity provider with a single resolver that maps each provider to the same identity, and guest access turned off. Load only that domain's catalog and one Software Template. The pilot is done when the owning team can find, edit and scaffold its components in Backstage and the team lead signs off in writing on what is missing.

  3. Map blueprints to Backstage kinds

    Build a mapping table that links each Port blueprint to a Backstage kind such as Component, API, Resource, System, Domain, Group, User or Template, and records how each property and relation translates. Blueprints that describe a service usually map to Component, while infrastructure types often map to Resource. Flag any blueprint with no clean equivalent so the team decides whether to model it as a custom kind, a tag, or drop it. The output is a reviewed mapping table approved by the platform owner and the teams that use the blueprints.

  4. Generate and validate catalog-info files

    Script the export of Port entities into catalog-info.yaml descriptor files, one per entity, stored next to the source code they describe. Validate every file against the Backstage descriptor format, check that owner references point to real Group or User entities, and confirm that each Location file registers the expected paths. Run the import in a non-production Backstage instance and compare entity counts and ownership with the Port export. The output is a validated set of catalog-info.yaml files and a reconciliation report showing zero unexplained differences.

  5. Rebuild self-service actions as Software Templates

    For each Port self-service action on the keep list, write a Software Template that collects the same inputs, runs the same scaffolder steps, and publishes the same results. Note where an action needs an approval step or a backend runner, and where a custom plugin is needed. Owners review each template with a test run in a sandbox account. The output is a signed-off template list showing each Port action, its Software Template replacement, the reviewer, and any gaps still open.

  6. Run both portals in parallel

    Keep Port and Backstage live side by side for a defined comparison window agreed in advance. Each day or each sync cycle, compare entity counts, owners, scorecard results and action outcomes between the two portals, and log every mismatch with its cause. Ask a sample of users from each domain to complete their normal tasks in Backstage and record what they could not do. Treat the parallel run as complete only when mismatches are resolved or accepted in writing by the owners.

  7. Cut over users and actions

    Publish the cutover checklist before the switch: DNS or bookmark changes, identity provider configuration, access roles translated from Port to Backstage permissions, integrations repointed to Backstage, the rollback steps, and the named person who can authorize rollback. Move domains in waves, starting with the pilot domain, and confirm each wave against the checklist. Redirect Port links where possible and notify teams before each wave. The output is a completed checklist for every wave and a record of any rollback decisions.

  8. Decommission Port and retire its integrations

    After the final wave has been stable through an agreed observation period, export a final archive of Port data and keep it under your records policy. Revoke Port API tokens, remove the Port integrations and any self-hosted Ocean or Helm deployments, and tell the vendor the subscription will end, confirming the contract terms and any data deletion commitments in writing. Remove the old DNS entries and access groups. The output is a decommission record listing the archive location, revoked credentials, removed integrations and the vendor's written confirmation of termination and data handling.

How the migration changes by catalog size and starting point

When most entities were created by hand in Port's UI, the migration is mostly a modeling exercise. Each blueprint becomes a decision about which Backstage kind fits it, and each entity becomes a catalog-info.yaml file that someone must write and place in the owning repository. Because there are few integrations to rebuild, the work is concentrated in review and ownership.

  • Blueprint review: List every blueprint and map it to a kind such as Component, Resource, System or Domain. Several blueprints often collapse into one kind with a type value.
  • Entity export: Pull entities through Port's REST API so the catalog is captured as data before any edits in the UI.
  • Ownership placement: Move each descriptor into the repository of the team that owns the service, so ownership lives with the code.
  • Relations: Recreate dependencies as dependsOn and ownerOf references, since these are the links teams most often miss.
  • Single cutover: A small catalog can usually move in one batch once entities validate in a staging Backstage instance.

Confirm with your Port administrator which entities were edited by hand after import, because those edits exist only in Port and must be copied across.

What drives the cost and duration of the move

This table breaks the move from Port into components, showing who is paid for each, whether it is one-time or recurring, and what pushes it up or down. Use it to scope the work before requesting a quote, since blueprint sprawl, action backends and identity design usually matter more than the portal install itself.

DriverWhy it changes cost or effortWhat to ask for or confirm
Blueprint count and relationshipsEach blueprint maps to a Backstage kind and catalog-info.yaml pattern. Many relations between blueprints need explicit modeling, which raises design and validation time.Inventory of blueprints, relation types and entity counts from your Port export, with the proposed kind mapping in writing.
Self-service actions and backendsEach Port action becomes a Software Template with scaffolder steps. Actions that call external systems or need approvals need custom actions or plugins and tested backends.Count of actions, the backend each one calls, and which ones need approvals or custom scaffolder actions.
Ocean integrations to replacePort's Ocean integrations push data into the catalog. Each one must be rebuilt as a Backstage ingestion source, a processor or a scheduled sync, then validated against source systems.List of active integrations, source systems, sync frequency and whether each has a Backstage equivalent or needs custom code.
Identity and RBAC designBackstage has no single built-in permission model for every team. Sign-in resolvers must map each provider to one identity, and access rules must be designed and tested before cutover.Identity provider used, group structure, the permission policy model and who approves the access design.
Plugin choices and maintenancePlugins for Kubernetes, search, scorecards or cloud resources vary in maturity. Forked or custom plugins add recurring upgrade and security work.Shortlist of required plugins, whether each is community or custom, and the named owner for each plugin after handover.
Hosting and PostgreSQLProduction runs need a managed or self-operated PostgreSQL database, container hosting, backups, TLS and monitoring. These are recurring infrastructure costs billed by your cloud or data center.Hosting target, database service, backup and restore targets and the environments included in the quote (for example, staging).
Upgrade cadenceThe main release line ships monthly and the next line ships weekly on Tuesdays, per the versioning policy. Each upgrade needs testing against your plugins and custom code.Upgrade procedure, test scope per release, and whether upgrades are included in a retainer or billed per change.
Platform team timeSomeone must own the portal, plugin maintenance, catalog data quality and developer onboarding after go-live. This effort recurs for as long as the portal runs.Estimated monthly effort per role, the internal owner named for the portal, and the handover plan with documentation.
Parallel running during cutoverRunning Port and Backstage together means two sets of catalog data and actions to keep consistent until teams switch. Duration depends on how many teams depend on each workflow.Cutover plan, the number of teams migrated per wave and the criteria for retiring Port actions.

What usually goes wrong and how to prevent it

Most failed Port to Backstage migrations break in the same few places: the data model, identity, access settings, catalog maintenance, templates and the runtime. Each risk below has a prevention step you can check before cutover, and several of them only show up after users start relying on the new portal.

Blueprints flattened into too few kinds

Teams often map every Port blueprint to a generic Component because it is faster. Port blueprints carry their own properties, relations and ownership fields, and collapsing them loses the distinctions that drive scorecards, filters and ownership views. Before writing any catalog-info.yaml, list each blueprint and choose a Backstage kind (Component, API, Resource, System, Domain, Group or User) that matches how it is used. Check that relations survive the mapping by sampling a few entities in the new catalog.

Identity resolvers mapping one person to several users

When a person signs in through more than one provider, such as GitHub and Okta, the default behavior can create separate User entities. Ownership then splits across duplicate identities and access reviews become unreliable. Configure sign-in resolvers so every provider resolves to the same identity, and test with one account that uses two providers. Confirm that group membership from your identity provider maps to Backstage Group entities before you import ownership data from Port.

Guest access left on in production

Guest sign-in is convenient during a pilot, but it lets unauthenticated or loosely identified users reach the catalog and templates. Teams sometimes forget to disable it when they move from a demo instance to production. Remove the guest provider from the production auth configuration, then verify with a logged-out browser session that catalog pages, TechDocs and scaffolder actions all redirect to sign-in. Record this check in the cutover runbook so it is repeated for each environment.

Catalog-info files drifting from repositories

Port entities were updated from the portal or from integrations, so the source of truth was never the repository. After migration, catalog-info.yaml files can fall behind the code they describe, and the catalog quietly shows stale owners, lifecycles and dependencies. Add the descriptor files to the same repositories as the code, require them in pull request review, and schedule a report that lists entities whose owners no longer exist. Assign one team to own the catalog data after cutover.

Untested Software Templates

Self-service actions in Port often ran in a tested pipeline, but a Software Template that scaffolds a repository, creates a pipeline and registers the new component has many steps that can fail silently. A template that worked in one organization may write to the wrong group or use an expired token elsewhere. Run each migrated template against a sandbox organization, check the generated catalog-info.yaml and the registered entity, and repeat the run after every change to the template or its plugins.

Node.js version mismatches

Backstage supports exactly two adjacent even-numbered Node.js releases, and as of Backstage 1.46.0 these are Node.js 22 and 24. A build server, container image or developer laptop on another version can produce failures that look like plugin bugs. Pin the Node.js version in your build image and in the repository's engines or version files, check it against the current versioning policy before each Backstage upgrade, and plan upgrades on the monthly release line so security backports arrive without a long gap.

Questions teams ask before moving from Port to Backstage

How much effort does a move from Port to Backstage take?

The effort depends on how much catalog data you have, how many blueprints and self-service actions need rebuilding, and how many integrations must be re-pointed at Backstage. Effort rises with the number of custom blueprint relations, the number of Ocean integrations feeding Port, and the number of actions that call internal systems through custom code. It falls when your blueprints map cleanly to Backstage kinds such as Component, API, System and Group, and when most actions can be expressed as Software Templates using existing scaffolder actions. Ask any partner to size the work from an inventory of blueprints, entities, actions and integrations, and to state the assumptions behind that estimate in writing.

Can an internal platform team do the migration alone?

Often yes, if the team already runs Kubernetes, manages Git repositories and understands the services Port reads from. Backstage is a TypeScript and Node.js codebase, so the team needs people comfortable with that stack, plus owners for identity, the database and the plugins they choose. Teams that have not built a portal before usually underestimate catalog modelling and the plugin work. A fixed-scope engagement from DeployOpen can cover planning, implementation, integration, hardening and documentation of the Backstage portal inside your own infrastructure, with scope and deliverables agreed in writing before work starts.

What does the work need from engineering and security teams?

Engineering teams provide the catalog owners, the service repositories where catalog-info.yaml files will live, and the self-service actions they rely on today. Security teams need to define how users sign in, which identity provider resolves each user, and how roles map to catalog access. The Backstage authentication documentation advises configuring sign-in resolvers so every provider resolves to the same identity, and not offering guest access in production. Security should also review the PostgreSQL database, the secrets used by templates and the network paths between Backstage, Git and your cloud accounts before the portal is opened to developers.

Can all of Port's catalog data be exported completely?

Port's REST API exposes blueprints and entities, so most catalog structure and property values can be pulled out in a machine-readable form and mapped to Backstage kinds. Completeness depends on your setup, so confirm it against your own tenant before relying on it. Check that relations, scorecard results, action run history, audit logs and any data written by custom integrations are included in your export path. Also confirm the API token lifetime and request limits for your region, and plan the export as a repeatable script so you can rerun it during cutover. Confirm these details with Port's documentation and account team.

Can the parallel run between Port and Backstage be avoided?

A parallel run can be shortened or skipped for a small catalog with a single team, but it is hard to avoid for a large organization. Port feeds data through integrations that keep updating while you build, so a direct cutover needs a freeze window on catalog changes or a final resync. Running both portals gives teams a fallback while the Backstage catalog is validated against source systems, and it lets owners review entities before developers depend on them. Decide the parallel period based on how many teams depend on Port actions, how often the catalog changes, and how confidently you can reconcile the two data sets.

What ongoing upkeep does a self-hosted Backstage portal require?

Backstage is open source under Apache-2.0 with no paid edition from the project, so the recurring costs are your own infrastructure, the engineers who maintain the portal, and any support retainer you buy. The versioning policy describes a main release line shipped monthly and a next line shipped weekly, and high and critical vulnerabilities are backported to releases from the last six months where feasible. Plan for regular upgrades, Node.js version alignment, plugin maintenance, database backups, monitoring and access reviews. Ask any partner what upgrade cadence, plugin ownership and on-call model are included in the quote.

Does moving to Backstage remove all licensing costs?

Backstage itself carries no license fee, but it is not a zero-cost option. You still pay for compute and storage, the PostgreSQL database, identity provider licenses you already hold, and the people who build, run and upgrade the portal. Some commercial tools that plug into Backstage may carry their own fees. Compare these components with your current Port subscription, including seats, plan features and integrations, rather than comparing license lines alone. The Backstage GitHub repository and CNCF project page confirm the open-source status and project maturity.

How DeployOpen scopes and runs a Port to Backstage migration

DeployOpen is a Chainscore Labs company that plans, implements, customizes, integrates, hardens, backs up, upgrades and documents self-hosted open-source platforms inside the client's own infrastructure, including their cloud accounts, data centers or air-gapped networks. For a Port to Backstage move, that means the Backstage deployment, its PostgreSQL database, the identity provider behind sign-in, the Git hosts that hold catalog-info.yaml files, and the CI pipelines that run Software Templates all sit in your environment, not ours. DeployOpen does not run your catalog for you and does not issue audit reports or certifications. Independent auditors and certification bodies do that work, and DeployOpen prepares the systems, controls and evidence they will review.

Most engagements are fixed-scope. Before any work starts, the written scope names the blueprints to be mapped, the entity kinds that will be produced, the self-service actions to rebuild as Software Templates, the identity and RBAC decisions, the cutover approach, and the deliverables and timelines both sides accept. Items you should expect to see in that scope include the export method (Port's API or Terraform state), the agreed mapping of each blueprint to a Backstage kind, the list of Port integrations that must be replaced or retired, and the criteria for switching teams to the new portal. Ongoing upgrades, Backstage release tracking and support can be added as an optional retainer, which is useful because Backstage ships on a regular release cadence. A quote follows from the written scope, so the more precisely you describe the Port tenant, its integrations and your identity setup, the more precise the quote will be.

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.