A native CLI that ships your containers to any Linux box — Podman Quadlets for supervision, kamal-proxy for zero-downtime cutovers, and no registry required.
curl -fsSL meridian-deploy.dev/install.sh | shNo Kubernetes. No Docker Swarm. No CI/CD rebuild loop. Meridian is an imperative CLI that does what you tell it, when you tell it.
Meridian scans your project, picks up Marten, Rails, Elixir, Node or Go, and writes a working deploy.yml you can read and edit.
Send the image you've already built to each host — registry pull, SSH stream, or rsync'd OCI layout. systemd takes over through a Quadlet unit. No Docker daemon on the target.
$ meridian deploykamal-proxy routes traffic from the old container to the new one only after health checks pass. Rollback is a single command.
Most deploy stacks ask you to adopt a worldview. Declarative reconciliation loops, control planes, custom resource definitions — a full philosophy for managing fleets you do not have.
Meridian is smaller on purpose. It does one job: take a container from your laptop and run it on a Linux server you rent, own, or colocate. When you push again, it cuts over cleanly. When something breaks, you read a systemd log.
No orchestrator. No registry tax. No daemon. A tool, not a platform.
Rootless-first is the right default in 2026. Quadlets let systemd supervise containers natively — the same system that already supervises your SSH daemon and cron jobs.
Use one if you have one. When you'd rather skip it, Meridian ships the image straight over SSH — piped with zstd, or rsync'd as an OCI layout so later deploys send only what changed.
meridian init recognizes Marten, Rails, Elixir, Go, and Node — sets the right *_ENV default, reuses your health route where it can find one, and writes a deploy.yml you can edit on the first try.
One compiled executable. No Ruby, no Python, no Node runtime on the server. Official Linux release builds can ship as a single file; local Crystal builds may still link shared libraries.
Meridian ships a small, sharp feature surface aimed at the 80% deploy path — the remaining 20% is where you'd want Kubernetes anyway.
Your containers run under systemd. Restart policies, journald logs, and dependency ordering you already understand.
Zero-downtime cutovers with health checks. If the new container fails, traffic stays on the old one. No drama.
Keep pulling from a registry, or flip transfer.mode to stream or incremental and Meridian ships images over your existing SSH connection — no Docker Hub bill, no ECR setup, no CI upload step.
meridian init recognizes Marten, Rails, Elixir, Node, and Go and writes a working config you can actually read.
meridian secret set manages encrypted secrets on every host. Names listed under env.secret reach the container through the Quadlet's Secret= directive — nothing plaintext on disk, nothing baked into the image.
Eight phases from before_transfer to after_deploy run arbitrary commands on each host. Migrations, cache warms, smoke tests — declare them in deploy.yml and Meridian fires them in order.
If you're happy with Kamal or Dokku, you should probably stay there — both are mature. Meridian makes different trade-offs. Here's what you're buying into:
| Meridian | Kamal 2 | Dokku | |
|---|---|---|---|
| Runtime | Podman + systemd | Docker daemon | Docker daemon |
| Supervision | Quadlets (systemd) | Docker restart | Docker restart |
| Image transfer | Direct over SSH | Registry required | Local build on host |
| Zero-downtime | kamal-proxy | kamal-proxy | nginx / Traefik |
| Rootless by default | Yes | No | No |
| Install | Native executable | Ruby gem | Bash bootstrap + apt |
| Config | YAML | YAML | Imperative CLI |
Three reasons:
systemd as first-class units, including restart policies, dependency ordering, and journald logging.transfer.mode: stream pipes podman save | zstd over SSH to podman load on the host — simple, no extra infrastructure. transfer.mode: incremental syncs an OCI layout via rsync, so repeat deploys typically send only the bytes that changed. If you already have SSH to the server, you have everything Meridian needs. deploy.yml and they deploy alongside your app. Meridian treats them as Quadlet units too, which means systemd handles their lifecycle consistently with everything else. Meridian is open source and MIT-licensed. Try it on a staging box this weekend — the install is a single command.