Guides

Zero-downtime releases without writing a deploy script

Why "the build passed" is not "the app works", and how verify-then-promote keeps users on a working release at every moment.

Concept6 min readUpdated September 2026

The gap between built and working

A green build proves the code compiles. It says nothing about a missing environment variable, a failed migration or a route that 500s on first request. Most outages start in that gap.

Build → provision → verify → promote

ShipSanely keeps the previous release serving while the new one is built and provisioned alongside it. Probes then hit the new release directly. Only when they pass does routing move.

What the probes check

The health endpoint, connectivity to PostgreSQL and Redis, one request against each detected route family, and — if a worker exists — that it consumes from its queue.

Migrations

Schema changes run against a snapshot first. A failed migration blocks promotion with the exact error, and the old release never notices.

Rollback is just re-promotion

Because previous releases are kept warm for a short window, rolling back is a routing change measured in seconds, not a rebuild.

What this means for you

No deploy script, no blue/green configuration, no "deploy on Friday" fear. Push, and either it works or nothing changed.

Early access. Behaviour described here reflects the current agent and may improve between releases. See the changelog.

Ready to connect a repository?

Early access is open for a limited number of teams. Tell us about your stack and we will reply with next steps.

Request early access