tofupilot run

Last updated on June 26, 2026

The run command executes a procedure. It takes an optional positional path to a procedure .yaml file, a directory, or a Python entry point, and when you pass a path, the procedure runs locally without contacting the dashboard. Without a path, run picks from pulled deployments.

run a local procedure
tofupilot run ./procedures/pcb-fvt

<PATH>

A positional argument that points to a procedure .yaml file, a directory, or a Python entry point. This conflicts with --deployment.

local path
tofupilot run ./procedures/pcb-fvt

--deployment <ID>

To run a specific pulled deployment by ID, pass --deployment. This conflicts with a positional path.

run by deployment
tofupilot run --deployment dep_abc123

--ui-values <FILE>

When you want to drive runs without an operator, pass a JSON file with pre-baked Operator UI values keyed by { phase_key: { component_key: value } }.

ui-values
tofupilot run --ui-values phases.json

--ui-timeout <SECONDS>

To time out phases waiting on required UI input, pass a number of seconds. The default is to wait forever.

ui-timeout
tofupilot run --ui-timeout 600

--tui

The --tui flag force-enables the in-terminal operator UI for this run, overriding the terminal_ui station config. It conflicts with --no-tui.

tui
tofupilot run ./procedure.yaml --tui

--no-tui

The --no-tui flag force-disables the in-terminal operator UI for this run, overriding the terminal_ui station config.

no-tui
tofupilot run ./procedure.yaml --no-tui

--kiosk

The --kiosk flag force-enables the local browser kiosk UI for this run, and it spins up an in-process WebSocket and static-file server on loopback. It overrides the kiosk_ui station config and conflicts with --no-kiosk.

kiosk
tofupilot run --kiosk

--no-kiosk

The --no-kiosk flag force-disables the local browser kiosk UI for this run, overriding the kiosk_ui station config.

no-kiosk
tofupilot run --no-kiosk

--no-bootstrap

The --no-bootstrap flag skips the auto-bootstrap prompt for missing Python virtualenvs on local-path runs, so the run fails with the original Python resolution error instead of offering to provision a venv with uv venv and install dependencies.

no-bootstrap
tofupilot run ./procedure.yaml --no-bootstrap

--upload

The --upload flag syncs a local-path run to the dashboard under the procedure it is linked to. It requires a tofupilot.json in the procedure directory (written by tofupilot link) or the TOFUPILOT_PROCEDURE_ID environment variable, which takes precedence. Without --upload, a local-path run stays local and never contacts the dashboard. The flag is ignored for --deployment runs, which always upload.

upload a linked local run
tofupilot run ./procedures/pcb-fvt --upload

Studio, the desktop app, invokes the same engine as tofupilot run, so running from the terminal gives the same execution and dashboard sync as running from Studio.

How is this guide?

On this page