tofupilot run

Last updated on August 14, 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

When the path is a directory, the entry point defaults to main.py (or the procedure.yaml inside it). When the path is a Python file, that file is the entry point, so a project with several procedures sharing one codebase can run any of them directly:

explicit entry point
tofupilot run ./procedure1.py

This is the local equivalent of the procedure's --entry-point setting, which deployed runs read from the deployment manifest.

--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