all posts

The Best Kamal Alternatives in 2026

Ajay Kumar··9 min read

Kamal made a genuinely good argument: you do not need Kubernetes to run a web application, and you do not need a PaaS either. You need a machine, a container image, and something that SSHes in and swaps the running container for the new one. That's the whole product — a YAML file in your repo, a proxy on the box, and no control plane anywhere.

I'm Ajay, I build PandaStack. Kamal's minimalism is its best feature and, predictably, the source of every reason people look elsewhere. Nobody leaves Kamal because deploys are unreliable. They leave because they wanted one of the things it deliberately doesn't do. So this post is organised by which missing thing you're chasing.

What Kamal deliberately doesn't do

  • It doesn't manage your servers. Provisioning, patching, disk, firewall and monitoring are yours. Kamal assumes a machine exists and can be SSHed into.
  • It has no UI or state. Nothing to look at, nothing that tells a teammate what's running where — the repo is the source of truth and the servers are the only record.
  • It doesn't do preview environments. There's no per-branch anything; you'd script it against separate hosts yourself.
  • It doesn't manage databases. Accessories run containers next to your app, but the backup, restore and upgrade story is entirely yours.
  • It doesn't schedule. If a machine dies, nothing moves your app. You notice, and you fix it.
None of these are bugs. Every one of them is a deliberate scope decision, and it's why Kamal is comprehensible in an afternoon. The question is only whether the things it left out are things you need.

If you want a UI and previews

Coolify

The most common destination. Same fundamental model — your servers, your Docker — with a web interface, per-pull-request preview deployments, one-click databases and services, automatic TLS and multi-server support. You trade Kamal's legibility for a real application running on your box that has its own upgrades and its own failure modes. For most teams that's a good trade the moment a second person needs to see what's deployed.

Dokploy and CapRover

Same category, different weights. Dokploy is newer and lighter, built on Docker Swarm for multi-node. CapRover is the long-stable one with a one-click app catalogue and years of unchanged behaviour. Both give you the dashboard and the managed-services catalogue that Kamal doesn't have.

If you want real scheduling

Nomad

The most underrated option on this list. Nomad gives you declarative desired state and health-based rescheduling — if a machine dies, your workload moves — with a fraction of Kubernetes' conceptual load. A single binary that runs as both server and client, jobs described in HCL, and no CRDs or operators to learn. If your reason for leaving Kamal is 'a node failure should not require me', Nomad is the smallest thing that solves it properly.

k3s and the Kubernetes ecosystem

k3s is a real, conformant Kubernetes in one binary with sane defaults, so 'Kubernetes is too heavy' is a much weaker objection than it was. The genuine cost is not the control plane any more; it's the ecosystem you have to assemble around it — ingress, cert management, secrets, an operator per stateful service. Take this step when you want the ecosystem, not when you want failover. If you want failover, Nomad is less work.

If you want the whole machine managed

Ansible

A different axis rather than a competitor. Kamal deploys an app; Ansible configures a machine. If your actual pain is that Kamal assumes a correctly configured server and you're the one configuring it by hand, Ansible is the missing half — and plenty of teams run both, with Ansible building the host and Kamal deploying onto it. If you'd rather have one tool, Ansible can do the deploy too, less elegantly.

Docker Compose plus a script

Worth naming honestly because a lot of teams end up here and it's fine. A compose file, a git pull on the server, and docker compose up -d gets you most of what Kamal does for a single machine. What you lose is the zero-downtime swap — compose stops the old container before starting the new one, so there's a gap. If a few seconds of downtime per deploy is acceptable, this is a legitimate and very simple answer.

If you don't want to own servers at all

Kamal's core assumption is that you have machines. If that assumption is what's wearing you down — the patching, the disk filling, the 'is the firewall right' — no deploy tool fixes it. The alternatives are managed platforms.

The property to shop for is the one Kamal gave you: your app, your image or your repo, deployed without a platform imposing a runtime model. Fly.io is the closest in spirit among managed options — you're still thinking about machines and regions, just not owning them. Render and Railway are more opinionated and more automatic.

PandaStack

Mine, so read this as a pitch. The relevant overlap with Kamal is that we do the blue-green swap you'd otherwise configure: a deploy provisions a new microVM, builds and starts your app there, health-checks it on its real port, and only then flips traffic and tears down the old one. If it never gets healthy, the old version keeps serving and the deployment is marked failed. That's the part of Kamal's job we're doing for you.

The differences worth naming. You don't need a Dockerfile — framework detection reads the repo, and there's a fallback ladder through your own manifest, Dockerfile hints and a build-pack pass. Each app gets its own Firecracker microVM rather than a container sharing your host kernel. And apps scale to zero when idle and wake in about a second, so idle costs almost nothing — which is a different economic model from a VPS that bills whether or not anyone visited.

# The Kamal-shaped bit, without the servers.
pandastack apps create \
  --git-url https://github.com/you/your-app \
  --branch main \
  --auto-deploy

# Roll back to the previous deployment if the new one misbehaves.
pandastack apps rollback <app-id>

Where Kamal is still better: you own the machines and can touch them, there's no vendor in the path, and the entire deploy mechanism is a YAML file you can read. Those are real advantages and for some teams they settle it.

The case for staying on Kamal

Worth stating plainly, because a lot of alternative-shopping is driven by a feeling that a small tool must be an unserious one. Kamal deploys production applications reliably. There is no control plane to go down, no platform version to be stuck on, and no vendor. When something breaks you can read the entire system. If your setup is a handful of servers running a handful of apps and nobody is asking for a dashboard, the correct move is often to add the one missing piece — Ansible for host configuration, a monitoring agent, a backup cron — rather than to replace a working thing.

The summary

Coolify if you want a dashboard and per-PR previews on your own servers. Nomad if you want a dead node to heal itself without you. k3s if you want the Kubernetes ecosystem specifically. Ansible alongside Kamal if the real gap is host configuration. Docker Compose if a few seconds of deploy downtime is fine and you want the simplest possible thing. And a managed platform if owning machines is the part you're done with — in which case look for one that does the blue-green health-checked swap for you, because that's the piece of Kamal you'd miss first.

Frequently asked questions

Is Kamal only for Rails applications?

No. Kamal comes out of the Rails world and its documentation uses Rails examples, but it deploys any container image to any Linux host over SSH. Go binaries, Python services, Node apps and static sites all work identically — what Kamal cares about is that you have a Dockerfile and a machine, not what's inside the image. The Rails association is cultural rather than technical.

What does Kamal not do that a PaaS does?

Five things, all deliberate: it doesn't provision or maintain your servers, it has no UI or persistent state showing what's deployed, it has no preview environments, it doesn't manage database lifecycle beyond running a container next to your app, and it doesn't reschedule anything when a machine dies. Every one of those is a scope decision that keeps Kamal comprehensible in an afternoon. Which of them you actually need determines whether you should switch and to what.

Should I move from Kamal to Kubernetes?

Only if you want the ecosystem, not if you want failover. k3s makes running Kubernetes on a small cluster genuinely reasonable, so the old 'too heavy' objection is weak now — but the real cost was never the control plane, it's the surrounding assembly of ingress controllers, cert management, secrets and an operator per stateful service. If your motivation is that a dead node should heal itself, Nomad delivers that with a fraction of the concepts. Go to Kubernetes when you specifically want what only its ecosystem has.

Can I get zero-downtime deploys with plain Docker Compose?

Not straightforwardly. Compose stops the old container before starting the new one, so there is a gap on every deploy — usually a few seconds, longer if your app boots slowly. You can approximate a proper swap by running two services behind a proxy and switching upstreams manually, but at that point you've hand-rolled the thing Kamal already does correctly. If a short gap per deploy is acceptable, Compose is a legitimately simple answer; if it isn't, use something that does health-checked blue-green.

Do I still need Ansible if I use Kamal?

Often yes, and they aren't competitors. Kamal deploys an application onto a machine it assumes is already correctly configured — the right Docker version, the right firewall rules, the right users, log rotation, a monitoring agent. Ansible is what builds that machine reproducibly. Running both is a common and sensible setup: Ansible owns the host, Kamal owns the app. If you're configuring servers by hand and finding that the tedious part, the missing tool is Ansible rather than a different deploy tool.

Keep reading

Run code in a microVM in one API call.

49ms p50 cold start. Fork, snapshot, and scale to zero.

Start free
Written by Ajay Kumar, Founder, PandaStack.