Five alternatives to Port, from open source portals to scorecard tools, ranked by how much you still have to build before a developer can ship a new service.

The best Port alternative for teams that want developer self-service without building a platform first is Encore: instead of a portal action that triggers a pipeline someone has to maintain, each TypeScript or Go service declares the Postgres databases, Pub/Sub topics, buckets, cron jobs and secrets it needs, and Encore provisions them in your own AWS or GCP account, with a service catalog, API docs and architecture diagrams generated from the code. If what you need is a catalog of everything your company runs, use Backstage if you can host it, Cortex or OpsLevel if you want scorecards and standards as a service, and Atlassian Compass if your teams live in Jira.
Port is a hosted internal developer portal. You model services, environments and cloud resources as blueprints, fill the catalog from integrations, track standards with scorecards, and give developers self-service actions like "create a service" or "add a database". Its pricing starts with a free plan for up to 5 seats, then $30 per seat per month on Basic and $48 on Standard, up to 50 seats (checked November 2026; Enterprise is custom). Teams look for alternatives for three reasons: per-seat cost as the org grows, wanting to self-host, or realizing that the portal is the easy part and the actions behind it are where the work is.
The ranking is by how much of the platform you still have to build before a developer can ship a new service with a database. Backstage, Cortex, OpsLevel and Compass are good at cataloging and measuring what exists. Like Port, they hand provisioning to tooling you bring.
A typical Port setup for "new service with a database" has three parts: a blueprint for the service, a self-service action with a form, and the backend the action calls, usually a GitHub Actions workflow running Terraform, that creates the repository, the database and the IAM role. The first two are configuration, and the third is the platform: the part that breaks when AWS changes a default or a team needs a queue nobody wrote a module for.
Encore is infrastructure from code for TypeScript and Go, and it removes that third part. The service declares what it uses, and Encore knows how to provision each resource:
// invoices/invoices.go (encore.dev v1.58)
package invoices
import (
"context"
"fmt"
"time"
"encore.dev/cron"
"encore.dev/pubsub"
"encore.dev/storage/objects"
"encore.dev/storage/sqldb"
)
// A Postgres database for this service: RDS or Cloud SQL in your account.
var db = sqldb.NewDatabase("invoices", sqldb.DatabaseConfig{
Migrations: "./migrations",
})
// A private bucket for invoice PDFs: S3 or Cloud Storage.
var PDFs = objects.NewBucket("invoice-pdfs", objects.BucketConfig{})
// Other services subscribe to this topic: SNS/SQS or GCP Pub/Sub.
type Issued struct{ InvoiceID int64 }
var InvoiceIssued = pubsub.NewTopic[*Issued]("invoice-issued", pubsub.TopicConfig{
DeliveryGuarantee: pubsub.AtLeastOnce,
})
type IssueResponse struct{ Issued int }
// IssueDrafts turns draft invoices into issued ones.
//
//encore:api private
func IssueDrafts(ctx context.Context) (*IssueResponse, error) {
// Claim draft or still-issuing rows so a crash after the status write
// but before Publish is retried, and two overlapping runs cannot both
// take the same draft.
rows, err := db.Query(ctx, `
UPDATE invoices SET status = 'issuing'
WHERE id IN (
SELECT id FROM invoices
WHERE status IN ('draft', 'issuing')
FOR UPDATE SKIP LOCKED
)
RETURNING id
`)
if err != nil {
return nil, err
}
defer rows.Close()
var ids []int64
for rows.Next() {
var id int64
if err := rows.Scan(&id); err != nil {
return nil, err
}
ids = append(ids, id)
}
if err := rows.Err(); err != nil {
return nil, err
}
issued := 0
for _, id := range ids {
w := PDFs.Upload(ctx, fmt.Sprintf("%d.pdf", id))
if _, err := w.Write(renderPDF(id)); err != nil {
w.Abort(err)
return nil, err
}
if err := w.Close(); err != nil {
return nil, err
}
// invoice_events (invoice_id PRIMARY KEY, published_at TIMESTAMPTZ)
// records a successful Publish so a retry after a crash cannot emit
// a second InvoiceIssued. Subscribers should also treat InvoiceID as
// an idempotency key.
if _, err := db.Exec(ctx, `
INSERT INTO invoice_events (invoice_id) VALUES ($1)
ON CONFLICT (invoice_id) DO NOTHING
`, id); err != nil {
return nil, err
}
var publishedAt *time.Time
if err := db.QueryRow(ctx, `
SELECT published_at FROM invoice_events WHERE invoice_id = $1
`, id).Scan(&publishedAt); err != nil {
return nil, err
}
if publishedAt == nil {
if _, err := InvoiceIssued.Publish(ctx, &Issued{InvoiceID: id}); err != nil {
return nil, err
}
if _, err := db.Exec(ctx, `
UPDATE invoice_events SET published_at = now()
WHERE invoice_id = $1 AND published_at IS NULL
`, id); err != nil {
return nil, err
}
}
if _, err := db.Exec(ctx, `
UPDATE invoices SET status = 'issued' WHERE id = $1 AND status = 'issuing'
`, id); err != nil {
return nil, err
}
issued++
}
return &IssueResponse{Issued: issued}, nil
}
// Triggered by the Encore platform; no scheduler to set up.
var _ = cron.NewJob("issue-drafts", cron.JobConfig{
Title: "Issue draft invoices",
Schedule: "0 6 * * *",
Endpoint: IssueDrafts,
})
func renderPDF(id int64) []byte {
return []byte(fmt.Sprintf("invoice %d", id)) // replace with your PDF renderer
}
encore run starts the database, bucket and topic locally. Cron jobs do not run locally or in preview environments, and in deployed environments the job is Encore platform Managed.On AWS, the deploy creates RDS, S3 and SNS with SQS in your own account. On GCP, it creates Cloud SQL, Cloud Storage and Pub/Sub. Encore provisions an IAM role for the service, or a service account on GCP, and a database role that can reach only this database. The Encore platform runs the cron job, with no scheduler resource to set up. A new team gets a working service by writing the code, not by filling in a form that triggers a pipeline.
The portal pieces of Port map to Encore like this:
The same setup applies when AI agents ship backend changes to your cloud. An agent that needs a bucket declares it next to the code that uses it and tests it with encore run, and the deploy system provisions it. Cloud access sits with Encore's IAM role, not the agent, and with infrastructure approval turned on, an Admin approves the change before it is applied.
Simon Vans-Colina, CTO at Pave Bank, said on the customers page: "My challenge was to find a way to skip building a platform as good as Monzo's. The Encore platform fit that description perfectly."
Encore is not a catalog for everything your company runs. It covers backends written in TypeScript or Go and deployed to AWS or GCP, and it has no scorecards for services built elsewhere. If you need a single place to see a Java monolith, a fleet of Lambda functions and a data platform, keep a portal for that and use Encore for the services you build on it. Existing RDS databases and S3 buckets can be connected to Encore declarations, and the Encore Terraform provider lets your other Terraform read Encore-managed resources.
Run in your terminal to get started locally.
Backstage is the open source portal framework Spotify built and donated to the CNCF. It gives you a software catalog defined in catalog-info.yaml files, software templates, TechDocs and a large plugin ecosystem. It is the main alternative when the objection to Port is per-seat pricing or the need to self-host.
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: invoices
annotations:
github.com/project-slug: acme/invoices
spec:
type: service
lifecycle: production
owner: team-billing
With Backstage the cost moves from licenses to people: you deploy and upgrade it yourself, plugins are TypeScript and React code you maintain, and software templates call the same kind of pipelines a Port action would. Our Backstage alternatives guide covers the hosted options.
Cortex describes itself as an engineering operations platform. It builds a catalog and context graph from your tools, and its strength is production-readiness scorecards: rules like "every service has an owner, an on-call rotation and a runbook" checked across the whole org. It also has self-service workflows for scaffolding services and provisioning infrastructure through golden paths.
Pick Cortex when the question is "which of our 400 services meet our standards" more than "how does a team get a database". Like Port, the workflows call infrastructure code you maintain.
OpsLevel is a hosted catalog with standards checks, self-service workflows and a Kubernetes syncer that fills the catalog from cluster metadata. It now leans into agents that run maintenance campaigns, such as opening upgrade pull requests across many repositories and tracking them to merge.
It fits organizations with many existing services where ownership and keeping everything upgraded are the main problems. OpsLevel also offers on-prem and single-tenant options on its Enterprise plan, which matters if a hosted portal is the objection to Port. It does not provision infrastructure for new services itself.
Compass is Atlassian's developer portal: a component catalog, health scorecards and metrics, and on-call operations on paid plans. The free plan covers up to 3 full users with unlimited basic users, and paid plans are priced per full user.
It is the natural pick for teams that already run Jira and Confluence and want the catalog next to their tickets and docs. Self-service and provisioning are thinner than in Port.
Verdict. If you need a catalog of everything your company runs, Port and the portals above all do that job, and the choice comes down to hosting and price. If what you want is for a team to ship a service with a database, queue and bucket without waiting on a platform team, Encore ranks first, because the service declares its infrastructure and Encore provisions it in your cloud on deploy, with the catalog generated as a side effect. Try it with the quickstart.
Encore is the best Port alternative for TypeScript and Go teams that want developer self-service, so a team can create a service with a database, queue and bucket without filing a ticket: the service declares those resources in code and Encore provisions them in your own AWS or GCP account, with a service catalog and API docs generated from the same code. If you need a catalog of everything your company runs, Backstage is the open source option, Cortex and OpsLevel are hosted catalogs built around scorecards and standards, and Atlassian Compass fits teams already on Jira.
Backstage is free and open source under Apache-2.0, but you host, upgrade and extend it yourself. Atlassian Compass has a free plan for up to 3 full users, and Port itself has a free plan for up to 5 seats.
Not by itself. Port's self-service actions and automations send a payload to a backend you provide, such as a webhook, a GitHub Actions workflow, a GitLab or Jenkins pipeline, or a Kafka topic. That backend creates the infrastructure, so someone still has to write and maintain it.
Port is a hosted SaaS portal you configure with blueprints, integrations and actions. Backstage is an open source framework from Spotify that you deploy, extend with plugins written in TypeScript and React, and keep upgraded yourself. Both catalog services and offer self-service forms that call tooling you already run.
Deploy to your cloud on AWS and Google Cloud
without managing infrastructure
Encore lets developers and agents define application infrastructure directly in code, then automatically provisions it from local development to production in your AWS or GCP account.