Skip to main content

Overview

By default, every snapshot build is a full build — it starts from a clean base image, clones all repositories, and runs every blueprint from scratch. This ensures a completely reproducible environment, but can be slow when you only changed one blueprint out of many. Differential builds optimize this by reusing the previous successful build’s snapshot as a starting point. Only workspaces whose blueprints actually changed are rebuilt; unchanged workspaces are inherited as-is from the parent build. This can significantly reduce build times, especially for organizations with many repositories.

Enabling differential builds

1

Navigate to environment settings

Go to Settings > Environment > Snapshots.
2

Enable the toggle

Turn on the Differential builds toggle. The description reads: “Faster builds by reusing unchanged workspaces.”
3

Trigger a build

Save a blueprint change or click Build snapshot. The next build will attempt to run as a differential build if a valid parent build exists.
The first build after enabling differential builds will always be a full build — the system needs a successful baseline snapshot to compare against. Subsequent builds will be differential as long as a valid parent exists.

How it works

When a build is triggered with differential builds enabled, the system follows this process:

1. Find a parent build

The system looks for the most recent successful build (status success or partial) to use as a parent. If no qualifying parent exists, the build falls back to a full build automatically.

2. Compare blueprints

Each workspace’s configuration is compared against the parent build. The system computes a digest of each workspace’s inputs — including blueprint contents, attached files, secrets, and repository order — and checks what changed.

3. Assign workspace actions

Based on the comparison, each workspace gets one of three actions:
ActionWhat happensWhen it’s used
RebuildClone the repo and run all blueprint steps (initialize + maintenance) from scratchBlueprint changed since the parent build
InheritPull the latest code and run only maintenance stepsBlueprint is unchanged — reuse the parent’s setup
RemoveDelete the workspace from the snapshotWorkspace was removed from the configuration
For inherited workspaces, initialize does not run again. Write maintenance so it is self-contained and can run independently after the latest code is pulled. It can use tools and runtimes already installed in the parent snapshot, but it must not require initialize to run immediately beforehand or rely on environment variables that initialize previously wrote to $ENVRC.

4. Execute the build

The build starts from the parent build’s snapshot image instead of a clean base. This means:
  • Inherited workspaces already have their tools, runtimes, and dependencies installed. The system pulls the latest code (git pull) and runs maintenance commands to update dependencies.
  • Rebuilt workspaces are set up from scratch — cloned fresh and run through the full initialize + maintenance sequence.
  • Removed workspaces have their directories cleaned up.
Organization and enterprise blueprints skip initialize during differential builds (since those tools are already present in the parent image) and run only maintenance.
$ENVRC is reset at the start of every build, including differential builds. Environment variables and PATH entries written to $ENVRC by a previous build are not inherited. If maintenance needs them, it must configure them itself.

When a full build runs instead

Even with differential builds enabled, the system falls back to a full build in certain situations:
  • No parent build exists — first build, or all previous builds failed
  • Organization or enterprise blueprint changed — global changes affect all workspaces, so a clean rebuild is safer
  • Repository ordering changed — since repos can depend on each other’s setup, reordering triggers a full rebuild
  • Parent build is too old or incompatible — the system validates that the parent is suitable
When a fallback happens, the build detail page shows the reason under the build kind badge.

Viewing build kind

After a build completes, you can see whether it ran as a differential or full build:
  1. Go to Settings > Environment > Snapshots
  2. Click on a build in the history
  3. The Build kind badge shows either Differential (blue) or Full build (default)
Hover over the badge for a tooltip explaining what each kind means:
  • Differential: “Only changed workspaces are rebuilt; unchanged ones are inherited from the last successful build with the same configuration”
  • Full build: “All workspaces are built from scratch”

Benefits

BenefitDescription
Faster buildsOnly changed workspaces go through the full setup process. Inherited workspaces skip initialize entirely.
Less network usageUnchanged workspaces don’t re-download tools, runtimes, or large dependencies.
Quicker iterationWhen iterating on a single repo’s blueprint, other repos don’t slow down the build.
Same reliabilityIf anything looks wrong, the system automatically falls back to a full build. You can also manually trigger a full build at any time.

Manually triggering a full build

Even with differential builds enabled, you can force a full build from the Build snapshot button. Use the dropdown to select Full build instead of the default differential option. We recommend running a full build periodically to discard inherited state and verify that your blueprints can still create the environment from scratch. Also run one after removing or replacing setup that may have left stale files, tools, or dependencies in the snapshot. A full build reruns all initialize and maintenance steps.

FAQ

No. Sessions always boot from the final snapshot regardless of how it was built. The only difference is build speed.
Pin a previous known-good build from Settings > Environment > Snapshots, then trigger a full build to get a clean snapshot. You can also disable differential builds entirely to go back to full builds.
Yes. A build with status partial (some workspaces succeeded, some failed) can serve as a parent. The system inherits only from workspaces that succeeded in the parent.