When Basecamp pulled its HEY email service off the cloud and back onto its own hardware in 2023, it reported saving about $7 million over five years. The number traveled, and it hardened a shift that had been building, where teams stopped treating "which cloud" as the only question and started asking what should sit between their code and that cloud. That layer, the cloud development platform, is where most of the leverage now lives, and the market for it splits into a few distinct shapes that solve different problems.
A platform-as-a-service takes a git push and hands back a running app on the vendor's infrastructure. An internal developer platform is something a platform team assembles so that every team in the company ships the same way with the same guardrails. A backend platform provisions the databases, queues, and cron your services declare and runs them, often in your own cloud account. Picking well means knowing which of these you need, because a startup reaching for an IDP and a hundred-engineer org reaching for a raw PaaS are both making expensive mistakes.
The cloud development platform landscape splits into four shapes: managed PaaS, backend platforms, internal developer platforms, and infrastructure-as-code tools, each sitting between your code and the raw cloud.
The categories overlap at the edges, but they answer different questions, and the fastest way to shortlist is to match the platform's shape to where your team spends its time.
We cover the IDP and pure-backend ends of this in depth elsewhere: see platform engineering tools for the portal-and-orchestrator category, and the backend developer platform guide for platforms centered on services and data. This roundup stays broad and points into those where the detail lives.
These run your app on the vendor's infrastructure. The appeal is that there is nothing to operate, and the cost is that you live inside the vendor's environment.
Heroku defined the category and still sets the mental model: a git push, a Procfile, and an add-on marketplace for everything else. It is stable and well documented, and its pricing climbs quickly once you add the databases, caches, and monitoring that arrive as separate add-ons. It fits teams with existing Heroku apps or ones that value the ecosystem over cost.
Railway is the modern take on that DX. Connect a repo, get a deploy in minutes, provision Postgres from a clean UI, and grow from there. Observability is basic and there is no local-development story, so it suits teams that want to ship a straightforward service fast without configuration.
Render covers web services, static sites, managed Postgres and Redis, and cron under one roof with predictable pricing. It is a solid default for web applications that want git-based deploys without much ceremony, and it thins out once you need Pub/Sub or distributed tracing.
Fly.io runs your containers close to users across a global edge network, which is its reason to exist. When end-to-end latency matters, it is hard to beat; the tradeoff is that you bring Docker knowledge and wire up observability yourself.
For a deeper cut on the PaaS category itself, including where it stops fitting, see platform as a service and internal developer platform vs PaaS.
These are less about "deploy my app" and more about "give my services the infrastructure they need." The database, queue, or cron is declared in code and provisioned for you.
Supabase generates a REST and realtime API straight from your Postgres schema, with auth and storage attached. It is quick for data-first apps, and custom server logic lives in Edge Functions rather than in a general backend, so it fits products where the database is the core abstraction more than ones built from many services.
Convex is a reactive backend where queries update live as data changes, with strong TypeScript ergonomics. It shines for realtime and collaborative apps, and it runs on a proprietary document store, so it is a bet on that model rather than a general-purpose Postgres backend.
Vercel is frontend-first and excellent at it, with serverless and edge functions for API routes alongside Next.js. It is the right home for a frontend with modest API needs, and it is not built for stateful backends with their own databases, Pub/Sub, and long-running work.
At enough scale, the problem is no longer running one app but making dozens of teams ship consistently. This is where developer portals and orchestrators come in. Backstage, open-sourced by Spotify, gives you a software catalog and templates you self-host and extend. Port, Cortex, and OpsLevel offer that as a managed product with scorecards and service metadata, and Humanitec focuses on the orchestration layer that turns a developer's request into provisioned infrastructure.
These are worth their weight once you have a platform team and real inconsistency to tame, and they are overkill for a handful of engineers on a couple of services. The platform engineering tools and Backstage alternatives guides go through this category in detail, and what is platform engineering covers the discipline behind it.
For teams that want to describe the cloud directly, Terraform is the standard, with a vast provider ecosystem and multi-cloud reach, at the cost of learning HCL and managing state. Pulumi does the same job in real languages like TypeScript, Python, and Go, which suits teams that would rather write code than config. Both give total control and leave operating the result to you, so they pay off when you have the DevOps staff and the requirements to justify the ownership.
The failure mode at both ends is picking a platform for a problem you do not have. A three-person team does not need an internal developer platform; a hundred-engineer org with ten teams stepping on each other will outgrow a raw PaaS. The useful test is to name the constraint that hurts today and pick the lightest platform that removes it.
| If your bottleneck is | Reach for | Skip |
|---|---|---|
| No time to operate anything | Managed PaaS (Railway, Render, Fly.io) | IDPs, raw IaC |
| Wiring up databases, queues, cron per service | A backend platform | Hand-rolled add-ons |
| Teams shipping inconsistently at scale | An internal developer platform | Adding more PaaS accounts |
| Requirements no higher-level tool meets | Terraform or Pulumi | Managed platforms |
| Keeping infra in your own cloud account | A backend platform or IaC | Vendor-hosted PaaS |
For a longer walkthrough of building the platform layer yourself, see how to build an internal developer platform.
Encore is a code-first backend platform rather than a developer portal or an orchestrator, so it sits alongside the backend-shaped tools above rather than replacing Backstage or Port. You declare infrastructure as typed objects in your application code, a Postgres database, a Pub/Sub topic with delivery guarantees, cron, object storage, secrets, and services call each other with type-checked functions through ~encore/clients, with distributed tracing built in.
import { api } from "encore.dev/api";
import { SQLDatabase } from "encore.dev/storage/sqldb";
// The database is a typed object; Encore provisions and wires it.
const db = new SQLDatabase("users", { migrations: "./migrations" });
export const getUser = api(
{ method: "GET", path: "/users/:id", expose: true },
async ({ id }: { id: string }): Promise<User> => {
return db.queryRow`SELECT * FROM users WHERE id = ${id}`;
},
);
It provisions into your own AWS or GCP account with sensible defaults you adjust in the dashboard, deploys your services together, and gives you environments, preview environments per pull request, CI/CD, a service catalog, and an architecture diagram. Because the infrastructure lives in the same TypeScript or Go as the application, an agent generating code has fewer separate config files to keep in sync. It works with an existing setup through a Terraform provider that exposes provisioned resources as data sources, and encore build docker exports a standard image if you want to run it elsewhere. Where you need the portal-and-scorecard model of an IDP, or full manual control over every cloud resource, the tools in those categories remain the better fit.
A cloud development platform is the layer your team builds and runs services on top of the raw cloud. It covers a wide range, from a platform-as-a-service that takes a git push and gives you a running app, to an internal developer platform that standardizes how every team ships, to a backend platform that provisions databases and queues from your code. What they share is that they hide some of the operational work of running software so developers spend less time on plumbing.
A PaaS like Heroku or Render is a product you rent. It runs your app on the vendor's infrastructure and you accept its defaults. An internal developer platform is something a platform team builds for its own organization, often on top of Kubernetes, to give developers a consistent way to ship services with the guardrails that company needs. A PaaS gets you running in an afternoon; an IDP is worth building once you have enough teams that inconsistency and hand-offs are slowing everyone down.
A small team usually ships fastest on a managed PaaS such as Railway, Render, or Fly.io, because there is nothing to operate and deployment is a git push. The tradeoff is that you run on the vendor's infrastructure and inherit its pricing and limits. If you already know you will need Postgres, background jobs, and cron, pick a platform that provides those directly so you are not stitching add-ons together as you grow.
No. Kubernetes is one way to build a platform, and it is what most large internal developer platforms run on, but it is not required. Managed platforms hide orchestration entirely, and several backend platforms deploy into your cloud account without asking you to write or operate Kubernetes manifests. Reach for Kubernetes directly when you need control it gives that nothing else does, and expect to staff a platform team to run it.
Agents write more of the code now, and they do better when infrastructure is expressed in the same language as the application rather than in separate YAML, Terraform, and Dockerfiles they have to generate and keep in sync. Platforms where a database or a queue is a typed object in your code give an agent fewer places to make a mistake and give you a diff that is easy to review. Platforms that lean on hand-written config files put more of that surface in front of the agent.
Yes, if you pick a platform built for it. Managed platforms run your app on their infrastructure, which is simple but means your data and compute live with the vendor. Infrastructure-as-code tools like Terraform and Pulumi provision into your own account but leave the running to you. Some backend platforms provision into your AWS or GCP account directly, which keeps ownership and cloud pricing while removing most of the setup work.
Automated infrastructure for humans and agents
Let agents build and validate features with real infrastructure in the dev loop. Encore automatically provisions infrastructure, from local dev to production in your cloud on AWS/GCP.