Neo vs Kamal vs Coolify vs Dokku: Choosing a Self-Hosted Deploy Tool

Four different answers to "how do I deploy Docker apps to my own server without a cloud platform" — and which shape fits which workflow.

7 min read

The shared goal, four different shapes

All four exist to answer the same question — "deploy Docker apps to a VPS I control, without a managed PaaS" — but they get there differently, and the differences matter more than any feature checklist.

Neo and Kamal: SSH-native, no server-side agent

Neo and Kamal are architecturally the closest to each other. Both run entirely from your machine (or CI), connect over SSH, and drive Docker directly on the remote box — nothing persistent runs on the server except Docker and a reverse proxy. There's no dashboard to keep patched, no control-plane database to back up, no agent that can itself become an attack surface.

Kamal comes from the Rails/37signals world and is proxy-agnostic (kamal-proxy by default). Neo standardizes on Caddy specifically for automatic Let's Encrypt certificate provisioning with zero manual DNS-challenge setup in the common case, and layers on things like encrypted env files in Laravel's own format and deploy version tracking as first-class features rather than conventions you assemble yourself.

Coolify: a self-hosted PaaS with a UI

Coolify runs a persistent application on your server (or a dedicated management server) that you interact with through a web dashboard — closer to a self-hosted Heroku or Vercel than to Kamal or Neo. That's a genuine advantage if a web UI is how your team prefers to work, or if non-CLI-comfortable teammates need to trigger deploys. The tradeoff is the dashboard itself: it's software you now operate, secure, and keep updated, on top of the apps it's deploying.

Dokku: git-push deploys, buildpacks

Dokku is the oldest of the four in spirit — a self-hosted Heroku clone, git push dokku main triggers a build and deploy, historically buildpack-based though Dockerfile support exists. If your workflow is already "push to deploy" and you don't need much beyond that, Dokku's simplicity is real. It's less suited to teams wanting explicit, reviewable deploy configuration as a file in the repo (Neo's .neo.yml, checked into git) versus configuration that lives in the Dokku server's own state.

Picking one

Kamal or Neo — you want SSH-only, no persistent server-side software, and you're comfortable with a CLI and a config file in your repo. Between the two, it's largely ecosystem fit: Neo if you want Laravel-format encrypted secrets and built-in deploy tracking without assembling them yourself; Kamal if you're already deep in the Rails/Kamal ecosystem.

Coolify — you want a dashboard, possibly for non-CLI teammates, and you're fine running (and maintaining) that dashboard as part of your infrastructure.

Dokku — you want the simplest possible git push deploy story and don't need much configuration flexibility beyond that.

None of these are wrong choices — they're different tradeoffs between "nothing runs on the server but Docker" and "a dashboard runs the server for you."

Try it yourself — Neo is free, with every feature unlocked.

Get started free