The best Heroku alternatives in 2026
Heroku taught a generation what deploying should feel like: `git push heroku main`, a build, a URL. Everything since has been some variation on that idea. The migration conversation has been running for years now, and the posts all look the same — a table of eight platforms, a pricing column, a recommendation.
The table isn't the hard part. The hard part is that Heroku was doing about nine things for you, most of which you never configured, and any shortlist that only compares 'runs your app' will hand you a migration that finishes at 80% and stays there. I build PandaStack, which is one option among many below — I'll flag my bias where it applies and try to be useful regardless.
What you're actually replacing
Before you evaluate anything, write down which of these you're using. Most teams under-count by four.
- Buildpacks — detect the language, install the runtime, build with no Dockerfile. This is the thing people miss most, because it never required a decision.
- The process model — a web process plus workers plus one-off run commands, all from one declaration file.
- Managed Postgres with backups, followers, and a fork command that made a copy of production for testing.
- Add-ons — Redis, mail, monitoring, all provisioned with one command and wired in as environment variables.
- Release phase — the hook that runs migrations after build and before traffic, and fails the release if migrations fail.
- Review apps — an environment per pull request, torn down on merge.
- Config vars, with a restart on change.
- Log drains and a unified log stream across all processes.
- The bit nobody lists: someone else patching the OS.
The four categories, and who each is for
Rather than ranking products that change quarterly, sort by architecture. Your requirements map to a category first, and only then to a vendor.
1. Container PaaS — the direct replacements
Render, Railway, Fly.io, Koyeb, Northflank, DigitalOcean App Platform, Scaleway, Clever Cloud. These are the closest analogues: connect a repo, they build and run it in a container, they offer managed databases, and most support preview environments and background workers.
Choose this category if you want the shortest migration. Your app almost certainly runs unchanged; the work is re-creating add-ons and re-plumbing environment variables. What to check specifically: whether build detection covers your stack without a Dockerfile, whether there's a pre-traffic release hook for migrations, whether the managed database offers point-in-time recovery and a fork-for-testing operation, and what an idle service costs.
2. Serverless and edge platforms
Vercel, Netlify, Cloudflare, AWS Lambda and friends. Excellent for frontend-heavy apps and request-scoped work, genuinely global, and the free tiers are generous.
The mismatch with a Heroku app is the process model. If you have workers, cron, WebSockets, or anything long-running, you're not migrating — you're re-architecting into functions plus a queue plus a scheduler plus a separate service for the socket connections. Sometimes that's the right move. It is never the quick move, and it should be a deliberate decision rather than something you discover in week three.
3. Kubernetes, with or without a PaaS layer on top
Managed Kubernetes plus something like Coolify, Dokku, Kamal, or an internal Helm setup. Maximum control, no vendor lock-in, and you become the platform team.
The honest version: this is the right answer when you have enough services that a platform team is justified anyway, or a compliance requirement that forces self-hosting. It is the wrong answer when three engineers who want to ship product features are now debating ingress controllers. Heroku's real product was the absence of that conversation.
4. MicroVM platforms
Fly.io machines, PandaStack, and similar. Your app gets a virtual machine with its own kernel instead of a container. This is my category, so weigh accordingly.
It's the right pick when the box matters: you run code you didn't write, you need kernel-level capabilities like nested containers or device mapper, or you have per-tenant isolation you must defend in a security review. It's also relevant when your app needs to create isolated environments at runtime — creating a microVM through snapshot-restore is about 179ms at p50, so per-customer or per-job machines become an ordinary operation rather than a provisioning project. It is not the right pick if you just want a Heroku-shaped thing with a broad add-on catalogue; the container platforms are further along there and I'd say so to a prospect.
The evaluation checklist that actually predicts pain
Whatever category you pick, run these seven checks before committing. Every one of them corresponds to a migration that stalled.
- Deploy your real app, not a hello-world. Buildpack detection is where surprises live — monorepos, private package registries, native extensions, and post-install scripts all behave differently under different builders.
- Run a migration through whatever the release hook is. Confirm that a failing migration blocks the release rather than crash-looping the app.
- Restore a database backup, timed. A backup you've never restored is a hypothesis. Check whether point-in-time recovery exists and how far back it goes.
- Start a worker process and a scheduled job. The process model beyond `web` is where serverless platforms stop matching.
- Measure a cold request after an idle period, if the platform sleeps idle apps. Then check whether uptime monitors and crawlers reset the idle timer — if they do, nothing ever sleeps and the saving is imaginary.
- Read the logs during a failed deploy. Good platforms make the failure obvious; on bad ones you'll be reading a truncated build log with an exit code and no context, once a week, forever.
- Price your actual duty cycle, not your peak. Most apps are busy a small fraction of the week, and platforms differ enormously in whether idle time bills.
A migration order that doesn't hurt
The sequencing matters more than the destination. This order lets you stop safely at any point.
- Inventory config vars and add-ons. Every one is a dependency you may not have known you had.
- Move stateless services first — web and workers — while the database stays where it is. Slower cross-provider queries, but a clean rollback.
- Run both in parallel against the same database, with a small traffic share on the new platform, long enough to see a full weekly cycle.
- Move the database last, during a planned window, having restored a backup on the new platform at least once beforehand.
- Keep the old environment able to serve for two weeks after cutover. Not a snapshot — actually able to serve.
The short version
If you want the closest thing to Heroku with the least work: a container PaaS. Render and Railway are the ones I hear about most and both are good; check specifically for a release-phase equivalent and for database point-in-time recovery, because those are the two features teams assume are present and then find aren't.
If your app is mostly a frontend with API routes: a serverless platform, accepting that background work moves to a queue and a scheduler.
If you already run Kubernetes for other reasons: put a deploy layer on it and be done.
If the isolation boundary is a requirement — untrusted code, kernel capabilities, per-tenant separation, or an app that provisions environments at runtime — look at microVM platforms, mine included. And if your Heroku bill is small and everything works, staying put is a legitimate answer that no vendor will ever give you. Migration costs weeks of engineering time; make sure you're buying something with them.
Frequently asked questions
What do I actually lose when migrating off Heroku?
More than the app runtime. Buildpacks that detect your language and build with no Dockerfile; the process model of web plus workers plus one-off run commands; managed Postgres with backups, followers, and a fork-for-testing operation; the add-on ecosystem that provisioned Redis or mail in one command; release phase, which ran migrations after build and before traffic and failed the release if they failed; review apps per pull request; config vars with restart-on-change; log drains; and someone else patching the operating system. Most teams under-count by about four of these, and release phase is the one that causes incidents during migration.
Which type of platform should replace Heroku?
Sort by architecture before vendor. Container platforms such as Render, Railway, Fly.io, Koyeb, or Northflank are the closest analogues and give the shortest migration — your app usually runs unchanged. Serverless and edge platforms suit frontend-heavy apps but force a re-architecture if you have workers, cron, or WebSockets. Kubernetes with a deploy layer gives maximum control at the cost of becoming a platform team, which is right only if you would justify one anyway. MicroVM platforms fit when the isolation boundary is a genuine requirement — untrusted code, kernel-level capabilities, or per-tenant separation you must defend in a security review.
What is the safest order to migrate off Heroku?
Inventory every config var and add-on first, since each is a dependency you may not know you have. Then move stateless services — web and workers — while the database stays put, accepting slower cross-provider queries in exchange for a clean rollback. Run both environments in parallel against the same database with a small traffic share on the new platform for at least a full weekly cycle. Move the database last, in a planned window, after restoring a backup on the new platform at least once. Keep the old environment genuinely able to serve, not merely snapshotted, for a couple of weeks after cutover.
How do I compare hosting costs honestly?
Price your real duty cycle rather than your peak. Most applications do genuine work for a small fraction of the week — an internal tool or staging environment often under five percent — and platforms differ enormously in whether idle time bills at all. If a platform sleeps idle apps, measure the cold request after your longest idle period, not the demo, and check whether automated traffic from uptime monitors and crawlers resets the idle timer. If it does, the app never sleeps and the advertised saving is imaginary; the only visible symptom is the invoice.
Is it ever right to stay on Heroku?
Yes, and no vendor will tell you so. If your bill is modest, the platform does what you need, and nothing about your roadmap is blocked by it, migration is weeks of engineering time spent to arrive at roughly where you already are. The reasons to move are concrete: a cost curve that no longer works at your scale, a capability you cannot get — kernel-level access, specific regions, GPU workloads — or a database or process model you have outgrown. If you cannot name which of those applies to you, the migration will stall at eighty percent and become the thing nobody wants to pick up.
49ms p50 cold start. Fork, snapshot, and scale to zero.