🛠 This page is for engineering teams self-hosting their own Lightdash instance. If you’re on Lightdash Cloud, upgrades are handled for you automatically.
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
Everything else on this page is detail on top of that rule.How to read the signal
- Verdicts compose by AND across a span. Upgrading across several releases (say
1.111.0→1.115.0) is rolling-safe only if every release in the span isrollingUpdateSafe: true. Onefalseorunknownanywhere in the span means the whole upgrade needsRecreate. The cumulative index exists so you can evaluate a whole span in one fetch. - 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. minPreviousVersionfloors 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.- 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 to0.1893.0(the floor entry is markedsyntheticRequiredStop: truefor exactly this reason), then evaluate the rest of your span normally. In practice: upgrading from0.1050.0to1.121.0means0.1050.0→0.1893.0→ whatever the span check from there tells you. - Backfilled entries are conservative. Entries marked
backfilled: truewere generated retroactively — nobody vouched for those releases at the time they shipped. Expectunknownverdicts there, and plan aRecreateupgrade 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 (version1.126.0 or later) answers it in one command:
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: exit0 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:
--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 release1.121.0:
- 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 from1.120.1(thepreviousVersion) to1.121.0can 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.0or 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 (
declaredBreaksis 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 useRecreate. - If migrations are present, check their
heavinessflags in the per-release artifacts — table rewrites and scans on large tables take time. - Scan
config.changesfor 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 withcurl and jq. Check every release between your current version (exclusive) and your target (inclusive):
requiredStopsis empty — no mandatory intermediate version, so a direct jump is allowed…- …provided your current version is at or above
minPreviousVersionForTarget. Here1.111.0≥1.111.0, so the jump is permitted. rollingUpdateSafeisfalse— the span crosses at least one release that is not proven rolling-safe, so deploy withRecreate.
upgrade-check applies.