What each one needs from you before a developer gets a database, what it costs, and what to use when nobody owns the platform.

For a team without a platform team, none of the three does the job on its own. Backstage needs engineers to host and extend it, Port is a portal whose self-service actions call pipelines and IaC you still have to write, and Humanitec provisions infrastructure only from modules a platform team maintains. If what you want is developers getting databases, queues and buckets without filing a ticket, Encore is the better fit: each TypeScript or Go service declares what it needs in its own code, and Encore provisions it in your own AWS or GCP account. If you also want a catalog across many repos and tools, Port is the lightest of the three to add.
This comparison usually comes up when a team of 10 to 50 engineers has outgrown "ask the one person who knows AWS," and someone has read that an internal developer platform is the fix. The three names that come up are Port, Humanitec and Backstage. They solve different layers of the problem, and all three were designed with a platform team in mind as the owner. The useful question is how much work lands on you before a developer gets a database.
Port. You model services, environments and resources as blueprints and fill the catalog from integrations such as GitHub, Kubernetes and your cloud. A "create a database" button is an action that calls something you wrote, usually a GitHub Actions workflow running Terraform. Port is quick to set up and the catalog is useful early. The provisioning layer underneath is still yours, and so is keeping the catalog accurate as services change.
Humanitec. Developers describe a workload, often in the open source Score spec, and the orchestrator resolves each requested resource (type: postgres) to a resource definition your team maintains, typically backed by a Terraform or OpenTofu module per environment. When that library exists, developers get self-service. Without a platform team, writing and maintaining that library is the project you were trying to avoid.
Backstage. You deploy a Node.js app, pick and configure plugins, model the catalog in catalog-info.yaml files across repos, and write software templates. Hosted Backstage vendors such as Roadie run a managed Backstage instance, which removes the hosting work but not the modeling and template work. Like Port, Backstage templates scaffold repos and call your pipelines; they do not provision cloud resources themselves.
Starting from the outcome rather than the category, a team without a platform team usually needs:
A portal covers the fourth point and gives a front door to the first. An orchestrator covers the first three, if someone writes the modules. The other way to get the first three is to remove the request step: the service declares the resource, and the deploy system provisions it.
Encore is infrastructure from code for TypeScript and Go. There is no request form or module library: the resource is a declaration in the service that uses it. Here is a webhook intake service with a secret, a Pub/Sub topic, a subscriber and an archive bucket:
import { api, APIError, Header } from "encore.dev/api";
import { Topic, Subscription } from "encore.dev/pubsub";
import { Bucket } from "encore.dev/storage/objects";
import { secret } from "encore.dev/config";
// A secret per environment, set with `encore secret set`.
const webhookToken = secret("PartnerWebhookToken");
// S3 on AWS, Cloud Storage on GCP, local disk in development.
const archive = new Bucket("partner-events", { versioned: false });
interface PartnerEvent {
id: string;
type: string;
payload: string;
}
// SNS and SQS on AWS, Pub/Sub on GCP.
export const partnerEvents = new Topic<PartnerEvent>("partner-events", {
deliveryGuarantee: "at-least-once",
});
export const receive = api(
{ expose: true, method: "POST", path: "/webhooks/partner" },
async (req: PartnerEvent & { token: Header<"X-Partner-Token"> }): Promise<{ ok: boolean }> => {
if (req.token !== webhookToken()) {
throw APIError.permissionDenied("bad token");
}
await partnerEvents.publish({ id: req.id, type: req.type, payload: req.payload });
return { ok: true };
},
);
const _ = new Subscription(partnerEvents, "archive-event", {
handler: async (event) => {
await archive.upload(`${event.type}/${event.id}.json`, Buffer.from(JSON.stringify(event)));
},
});
encore run starts the topic and bucket locally, with an in-memory Pub/Sub broker and local disk for objects, and secret values for local development come from encore secret set. When the change merges, Encore provisions the SNS topic and SQS subscription, the S3 bucket and the Secrets Manager secret in your own AWS account. Encore provisions an IAM role for the service, or a service account on GCP. On GCP the same declarations become Pub/Sub, Cloud Storage and Secret Manager.
Mapped to the four needs above:
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 covers backends written in TypeScript or Go, deployed to AWS or GCP. If you need a catalog across dozens of languages, legacy services and third-party tools, a portal still earns its place, and Encore can be one of the things it lists. If you have Azure or on-prem workloads, Encore does not deploy there.
Run in your terminal to get started locally.
Verdict. Port, Humanitec and Backstage are good at what they do, and all three assume someone owns the platform underneath. Without that someone, Port is the easiest of the three to start, but it will not provision anything for you. If the goal is self-service infrastructure, pick Encore, where the services declare what they need and Encore provisions it in your own cloud when the change deploys.
If you are choosing between these three because a ticket queue for infrastructure is slowing the team down, try Encore on one service and see whether the queue goes away before you budget for a platform.
Of the three, Port is the lightest to adopt because it is SaaS and has a free plan, but it is a portal: its self-service actions call pipelines and IaC you still have to build. Humanitec provisions infrastructure, but only from resource definitions and Terraform or OpenTofu modules a platform team maintains. Backstage needs engineers to host, extend and upgrade it. If the goal is developer self-service for infrastructure and nobody owns a platform, Encore is the better fit: services declare what they need in TypeScript or Go and Encore provisions it in your own AWS or GCP account.
Both are internal developer portals with a software catalog and self-service actions. Backstage is an open source framework you host and extend with plugins. Port is a hosted product where you model the catalog with blueprints and configure actions in the UI.
Not mainly. Humanitec's core product is the Platform Orchestrator, which turns a workload request into infrastructure by matching it to resource definitions and modules. It can sit behind a portal such as Port or Backstage.
Checked November 2026: Port has a free plan for up to 5 seats and a Basic plan from $30 per seat per month billed annually. Humanitec's Teams plan is $2,199 a month for 5 users and one project with up to five environments. Backstage is free to use, and the cost is the engineering time to run it.
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.