open source · MIT

Stop configuring.
Start shipping.

Deploy any Docker image to your own server with a single command. Automatic HTTPS, zero-downtime, preview deployments. No config files. No platform fees.

$ curl -fsSL https://shipzero.sh/install.sh | sudo bash
zero · ssh root@vps
$
 
✓ Deploying ghcr.io/shipzero/demo:latest
✓ Pulling image done
✓ Detected port: 3000
✓ Starting container done
✓ Health check passed
🚀 Your app is live: https://demo.example.com
$
1 command to deploy
0 config files
0 downtime
$0 platform fees
$ sudo apt install nginx certbot
$ vim /etc/nginx/sites-available/app
$ sudo certbot --nginx -d app.example.com
$ scp deploy.sh [email protected]:~
$ sudo ufw allow 443/tcp
$ tail -f /var/log/nginx/error.log
# total: ≈ 3 hours. and that's when nothing breaks

Or just type zero deploy.

# live in ~40 seconds. every time.

# features

Every feature is a command.

No config files, no web UI, no YAML. Pick a command and watch it run.

zero deploy
$ zero deploy ghcr.io/shipzero/demo:latest
✓ Deploying ghcr.io/shipzero/demo:latest
✓ Pulling image done
✓ Detected port: 3000
✓ Starting container done
✓ Health check passed
🚀 Your app is live: https://demo.example.com
$ zero deploy demo --preview pr-21
✓ Deploying ghcr.io/shipzero/demo:pr-21
✓ Pulling image done
✓ Starting container done
✓ Health check passed
✓ Preview is live: https://preview-pr-21.demo.example.com
$ zero rollback demo
✓ Deploying ghcr.io/shipzero/demo:v1.2.0
✓ Pulling image done
✓ Starting container done
✓ Health check passed
🚀 Your app is live: https://demo.example.com
$ zero metrics demo
demo

  cpu     ██████░░░░░░░░░░░░░░  28.3%
  memory  ████████████░░░░░░░░  312 MB / 512 MB (60.9%)
  net ↓   1.2 MB/s
  net ↑   340 KB/s
$ zero webhook url demo
URL: https://example.com/webhooks/demo
Secret: a1b2c3d4e5f6...
# Configure both in GitHub/Docker Hub.
# Push an image → zero deploys it.
$ zero deploy \
   --compose docker-compose.yml \
   --service web --name mystack
✓ Deploying compose
✓ Pulling images done
✓ Starting services done
✓ Health check passed
🚀 Your app is live: https://mystack.example.com

$ zero --help

The whole CLI fits in your head. Everything else it does, at a glance:

zero list
Every app with status, URL, and image.
zero logs
Stream app or server logs, live.
zero env
Set, list, and remove environment variables.
zero domain
Multiple domains per app, primary drives previews.
zero history
Full deployment history per app.
zero registry
Private registries: ghcr.io, Docker Hub, any OCI.
zero stop · start
Lifecycle controls, health-checked on start.
zero upgrade
Upgrade CLI and server with one command.
--volume
Persistent volumes for stateful apps.
--host-port
Skip the domain. Run databases and queues.
--health-path
HTTP health checks with configurable timeout.
zero ls · rm
Short aliases for everything you type daily.

# claude · mcp

Deploy from a conversation.

zero ships an MCP server. Connect it to Claude and your server becomes something you can talk to.

One command registers zero with Claude Code and Claude Desktop. Any MCP-aware client works. List apps, deploy, stream logs, manage env vars, roll back: all from a chat prompt.

$ zero mcp add

Built with guardrails: every state-changing tool requires an explicit confirm parameter, enforced at the schema level. Claude can't deploy, stop, or remove anything by accident.

claude · connected to zero
List my zero apps
api running https://api.example.com
demo running https://demo.example.com
postgres running :5432
 
Show me the last 50 log lines from api
✓ get_logs api --tail 50
 
Roll back api
# rollback_app is state-changing: confirm required
✓ Rolled back to v1.2.3 · healthy

# how it works

Every deploy. Same four steps.

Predictable, atomic, safe. If anything fails, traffic stays on the previous version.

T+0.0s

pull

Image pulled from the registry with stored credentials

T+1.2s

start

New container on an ephemeral port. Old one keeps serving.

T+3.8s

health check

TCP or HTTP check. Fails? New container is discarded.

T+3.9s

swap

Route updated atomically. Old container removed. Done.

# under the hood

No nginx. No certbot. No YAML.

The installer puts two things on your server: Docker and the zero agent. The agent brings its own reverse proxy and TLS.

your machine
zero CLI
login · deploy · logs
auth via your SSH key
ssh
your server
zero agent
built-in reverse proxy :80/:443
TLS via Let's Encrypt · webhooks
lives in /opt/zero
routes
your containers
any Docker image
api.example.com
demo.example.com · postgres :5432

$ the built-in proxy

  • Host-based routing with automatic TLS termination (SNI)
  • Certificates provisioned on first deploy, renewed automatically
  • WebSocket support with automatic upgrade detection
  • Security headers, HTTP→HTTPS redirects, connection limits

$ leaves no trace

Everything zero touches lives in /opt/zero. Config is a single .env file. The install script is public; read it before you run it. And if zero isn't for you, uninstalling is two commands:

$ docker compose -f /opt/zero/docker-compose.yml down
$ rm -rf /opt/zero /var/lib/zero

# quickstart

Five minutes. Not five hours.

A Linux VPS and a domain. That's the entire requirements list.

quickstart · 4 steps
# 1. set up the server · on your VPS
$ curl -fsSL https://shipzero.sh/install.sh | sudo bash
 
# 2. install the CLI · on your machine
$ curl -fsSL https://shipzero.sh/cli/install.sh | bash
 
# 3. connect via SSH
$ zero login [email protected]
 
# 4. deploy
$ zero deploy ghcr.io/shipzero/demo:latest
✓ Your app is live: https://demo.example.com

# why zero

Platform DX.
Self-hosting price.

You own the server. zero handles everything else.

the old wayPaaS the hard wayDIY the right wayzero
setupMinutesHoursMinutes
httpsAutomaticManualAutomatic
previewsYesBuild itOne flag
lock-inYesNoNone
any imageLimitedYesYes
configRequiredLotsNone
cost$$$$Free + your VPS
# vs. kamal · dokku · coolify
kamal Orchestrates server fleets from a YAML config.
dokku A git-push PaaS you install and maintain yourself.
coolify A full platform with a web dashboard.
zero One server, one command, no config file, no UI.

Plain Docker underneath: if you outgrow zero, your containers move with you.

# faq

Fair questions.

What does curl | sudo bash actually install?
Docker (if it's missing) and the zero agent, which runs as a container in /opt/zero. The script asks for your domain and email (for TLS), then starts zero. It's public. Read it at shipzero.sh/install.sh before you run it.
Can I run a database?
Yes. Host-port mode skips domains and TLS for non-HTTP services: zero deploy postgres:16 --name db --port 5432 --host-port 5432. Add --volume pgdata:/var/lib/postgresql/data and your data survives every deploy.
How many apps fit on one server?
As many as your server can handle. zero doesn't limit you. Each app gets its own subdomain and its own containers; the built-in proxy routes by hostname. A $5 VPS comfortably runs a handful of side projects.
Do I need a domain?
No. Point DOMAIN at your server's IP and zero runs in IP-only mode: apps are exposed via host ports, HTTP only. A domain unlocks the good parts: HTTPS, automatic subdomains, and preview deployments.
What happens when a deploy goes wrong?
The new container is health-checked before any traffic reaches it. If the check fails, the container is discarded and traffic never leaves the previous version. Already live and something's off? zero rollback swaps back to the previous image.
Is there an account or cloud dependency?
No accounts, no third-party cloud. Authentication is your SSH key. If you can SSH into the server, you can use zero. The CLI talks directly to your server, and login is per directory, so different projects can target different servers.
How do I upgrade or uninstall?
Upgrades: zero upgrade --all updates CLI and server in one go. Uninstall: stop the agent with docker compose -f /opt/zero/docker-compose.yml down, then rm -rf /opt/zero /var/lib/zero. That's the whole footprint.
# NOTE
# zero is a single-server deployment engine.
# One server, any number of apps.
# Need multi-node orchestration, team RBAC, a web dashboard?
# zero is not the right tool. And that's by design.

Your server.
Your rules.

Install zero and ship your first app in minutes. Open source and MIT licensed.

$ curl -fsSL https://shipzero.sh/install.sh | sudo bash
zero on Product Hunt