Environments
Last updated on May 21, 2026
Every Deployment carries one of three environment labels, and the label is fixed at build time. The environment determines where the build can run, how long it lives, and who can promote it.
The three environments
The table below summarizes how each environment is triggered, how long it sticks around, and which stations it can run on.
| Environment | Triggered by | Lifetime | Runs on |
|---|---|---|---|
| Production | Push to the production branch, or promotion of a preview deployment. | Permanent. | Production stations. |
| Preview | Push to a non-production branch, or manual trigger. | 90 days if unpinned, otherwise permanent. | Preview stations only. |
| Development | Local CLI build. | Session-bound. | Local CLI session only. |
Production
You create a production deployment in one of two ways:
- A commit lands on the Procedure's production branch. The build worker compiles the artifact, and if auto-push is on, it rolls out to every linked Station.
- An Admin or Owner clicks Promote to production on a preview deployment.
Production deployments are permanent. Replaced builds stay in the registry, so you can use Instant rollback to pin a station to any previous version.
Disable auto-push on a procedure when you want to keep building production artifacts without fanning them out automatically.
Preview
Preview deployments build the same way production deployments do and use the same artifact format. You cannot pin a preview to a production station without an explicit promote.
You can create a preview deployment in two ways:
- Pull-request preview: every push to a PR head builds a preview, which you can pin to a dev station to test against a Unit.
- Branch-tracked preview: assign a long-lived branch such as
stagingto a non-production station, and every push rolls out to that station.
Preview deployments age out 90 days after creation if no station is pinned to them. Pinned previews never expire.
Development
Development builds are session-bound and never leave the developer's laptop. CLI builds locally, runs against the Operator UI, and uploads the resulting Run, but the artifact itself is not uploaded.
When you want to share work-in-progress, push the branch and TofuPilot builds a preview deployment.
Environment-specific variables
TofuPilot does not inject environment-specific variables at build time. Configure MES endpoints and calibration data in the procedure YAML, then override per station in the station configuration.
How is this guide?