Skip to main content
🛠 This page is for engineering teams self-hosting their own Lightdash instance. If you’re on Lightdash Cloud, upgrades are handled for you automatically.
Every Lightdash release publishes a machine-readable answer to the question: “is upgrading from version X to version Y safe to roll, and are there required stops on the way?” Two documents carry that answer: Both are public — no account or license required — and both are designed to be consumed by your own automation (CI checks, GitOps hooks) as well as by a human before an upgrade.

The one rule that matters

Only an explicit rollingUpdateSafe: true means a rolling update is advised. unknown means NOT safe.unknown is what the pipeline publishes when it could not prove safety — a degraded check, an unclassifiable change, an old release nobody vouched for. Treat every unknown exactly like false: use the Recreate strategy. Never write automation that treats “not false” as safe.
Everything else on this page is detail on top of that rule.

How to read the signal

  1. Verdicts compose by AND across a span. Upgrading across several releases (say 1.111.01.115.0) is rolling-safe only if every release in the span is rollingUpdateSafe: true. One false or unknown anywhere in the span means the whole upgrade needs Recreate. The cumulative index exists so you can evaluate a whole span in one fetch.
  2. Required stops are hard requirements. If any release in your span lists a version in requiredStops, you must upgrade to that version first, let it run its migrations, and then continue. Skipping a stop runs later migrations against a schema that’s missing the prerequisites they assume — which is how databases end up in states that need manual repair.
  3. minPreviousVersion floors direct jumps. Each release states the oldest version you may upgrade from directly. If you’re on something older, upgrade to an intermediate version first.
  4. Versions older than the index floor route through the floor. The index reaches back to 0.1893.0. If you’re running something older, first upgrade to 0.1893.0 (the floor entry is marked syntheticRequiredStop: true for exactly this reason), then evaluate the rest of your span normally. In practice: upgrading from 0.1050.0 to 1.121.0 means 0.1050.00.1893.0 → whatever the span check from there tells you.
  5. Backfilled entries are conservative. Entries marked backfilled: true were generated retroactively — nobody vouched for those releases at the time they shipped. Expect unknown verdicts there, and plan a Recreate upgrade for any span that crosses them.

Checking an upgrade span

The answer depends on exactly three inputs: the version you’re running, the version you’re targeting, and every release in between. The Lightdash CLI (version 1.126.0 or later) answers it in one command:
The command fetches the public index and applies the span rules from this page — AND-composition, required stops, minimum versions — locally. It needs no Lightdash login, token, or instance access, so it runs anywhere, including CI against an air-gapped production instance. Here the verdict is UNSAFE because the span crosses one release known not to be rolling-safe and several unproven ones — so deploy with Recreate: stop the old version, then start the new one.

Using it as a CI gate

The exit code carries the verdict: exit 0 only when the whole span is proven safe to roll. Any other outcome — an unknown or false release in the span, a required stop, a version the index doesn’t cover, a fetch failure — exits non-zero. That fail-closed contract means you can use the bare command as a pipeline gate:
For automation that needs the detail, --json prints a stable machine-readable object (fromVersion, toVersion, direction, safe, verdict, requiredStops, minPreviousVersion, coveredVersions, missingRanges):

What the verdict means for your deployment

Recreate means a short window of downtime, but it guarantees old and new code never run against the database at the same time. That matters because Lightdash runs its database migrations automatically at startup: with Recreate, every old replica has stopped before the new version boots and migrates; with a rolling update, old replicas keep serving against a schema that is changing underneath them — which is exactly what the verdict certifies as safe or not.

Worked example: reading a release artifact

This is the real artifact attached to release 1.121.0:
Reading it top to bottom:
  • No migrations ship in this release (migrations.present: false), so there is no schema change to coordinate.
  • rollingUpdateSafe: true — this is the explicit green verdict. Upgrading from 1.120.1 (the previousVersion) to 1.121.0 can be a rolling update.
  • All three change surfaces were checked and came back clean: no breaking REST API changes, no breaking MCP tool changes (not even non-breaking advisories on either), and no environment variable removals, renames, or default changes.
  • You may jump here directly from 1.111.0 or newer (upgrade.minPreviousVersion), with no required stops on the way — but remember the span rule: the jump is only rolling-safe if every release in between is, which you check against the index, not this single artifact.
  • No engineer declared a breaking change (declaredBreaks is empty).

Field reference: release-safety.json

Fields that can’t prove safety report the string "unknown" instead of a boolean — and per the rule above, you consume "unknown" as unsafe.

Top level

migrations

compatibility

api and config

upgrade and declaredBreaks

Field reference: release-safety-index.json

The index is a derived summary — one entry per release, oldest first. Per-release artifacts remain the source of truth.

Before you upgrade: checklist

  • Read the release notes for every release in your span.
  • Run the span check — note the verdict, required stops, and minPreviousVersion.
  • If the span verdict is anything other than true, plan a maintenance window and use Recreate.
  • If migrations are present, check their heaviness flags in the per-release artifacts — table rewrites and scans on large tables take time.
  • Scan config.changes for environment variables you set explicitly.
  • Confirm your database backup (and point-in-time recovery, if configured) is current.
  • After upgrading, update the Lightdash CLI to match.

Appendix: checking a span without the CLI

In environments where you can’t run the CLI (no Node.js, or a fully air-gapped pipeline that mirrors the index), you can evaluate a span directly from the index with curl and jq. Check every release between your current version (exclusive) and your target (inclusive):
Against the live index, that span answers:
Read it in order:
  1. requiredStops is empty — no mandatory intermediate version, so a direct jump is allowed…
  2. …provided your current version is at or above minPreviousVersionForTarget. Here 1.111.01.111.0, so the jump is permitted.
  3. rollingUpdateSafe is false — the span crosses at least one release that is not proven rolling-safe, so deploy with Recreate.
If your current version isn’t in the index at all, the command errors on purpose. That’s the fail-safe default: a version the index can’t see is a span it can’t vouch for — the same rule upgrade-check applies.