Skip to content

Changelog

Stay up to date with new features and improvements.

August 6, 2026CLI 1.1.0Docs 2.4.8Python SDK 2.14.1

Run OpenHTF 1.3.0 through 1.6.1

Tests running an older pinned OpenHTF could not use the CLI at all. Every release from 1.3.0 onward now works the same way.

  • Added support for OpenHTF 1.3.0 through 1.6.1, with the same measurements, validators, attachments and phase outcomes on every release.
  • Fixed attachments being dropped on releases below 1.5.2.
August 6, 2026CLI 0.26.27Docs 2.4.7

Keep instruments connected between runs

Reconnecting to instruments between units costs time on every run — slow VISA sessions, TCP links, or serial handshakes were re-established for each unit tested on a station.

  • Added scope: station for plugs: the connection opens once, is shared by every run on the station, and closes when the station stops
  • Health-checked the held instance before each run, respawning it if the process died, the plug definition changed, or a new deployment was applied
  • Renamed plug and phase scopes to slot / execution / station; the legacy each / all spellings still parse
August 5, 2026CLI 0.26.26Docs

Fix phases timing out at 60s during plug calls

Long-running hardware operations — thermal soaks, firmware flashes, slow measurements — were killed after exactly one minute, even when the phase allowed more time.

  • Fixed plug method calls dying at 60 seconds: they now run for as long as their phase allows, with no time limit when the phase has none
  • Improved timeout errors to name the interrupted plug method instead of a bare "timed out"
  • Documented the phase timeout field: duration syntax, bounds, and how the deadline covers plug calls and operator prompts
August 5, 2026Docs 2.4.5

Document procedure entry points and run_if

Teams that run several procedures from one codebase no longer have to rename files to main.py or guess which file a station executes.

  • Added a full reference for the procedure entry point and root directory settings: accepted values, defaults for each framework, when a change takes effect, and how imports resolve for entry points in subdirectories.
  • Added a monorepo guide for deploying several procedures from one repository, including procedure files with custom names.
  • Documented how to run a subset of phases with OpenHTF's run_if option, and how skipped phases appear on the dashboard.
August 3, 2026Dashboard 2.37.23

Upload and view attachments behind a firewall

Factory networks behind strict proxies had to whitelist third-party storage domains to use run attachments; every attachment URL now stays on TofuPilot domains.

  • Added attachments.tofupilot.app: uploads and downloads from SDKs, stations, and the dashboard no longer touch external storage hosts
  • Added a 95 MB per-attachment limit with a clear error message, replacing an undocumented unlimited behavior
  • Improved attachment serving with video seeking support and stricter content-type protections
August 3, 2026Dashboard 2.37.21

Fix cut-off labels on the measurement chart

The Y axis on a measurement control chart could cut the leading digits off its own labels, so the scale read as non-linear and the same number appeared twice at two different heights.

  • Fixed axis labels being clipped, which hid the most significant digits of every long value and made limit lines look misplaced
  • Rounded the axis values so they stay short and readable whatever the measurement scale
  • Kept enough decimals on narrow ranges, where every label used to collapse to 0
August 3, 2026Dashboard

Connect Bitbucket Data Center repositories

Teams hosting their code on a self-managed Bitbucket Data Center instance can now link it to TofuPilot, alongside GitHub and GitLab.

  • Added Bitbucket Data Center as a git provider, connected with your instance URL and an HTTP access token
  • Added automatic repository sync and webhooks so procedures deploy on push, with commit details shown in deploy views
  • Added a Bitbucket settings page to manage the connection and replace tokens
August 3, 2026CLI 0.26.25

Continue between phases with the keyboard

Operators work with their hands on a barcode scanner, not a mouse, but only phases starting with a text input kept the keyboard alive — an acknowledge prompt, a switch, a radio group or a bare Continue step forced a reach for the mouse once per phase.

  • Added keyboard focus on every prompt shape, so Enter — including the trailing Enter a barcode scanner sends — acknowledges a phase and moves to the next one.
  • Added Cmd/Ctrl+Enter to confirm a prompt from anywhere, including inside a multi-line text field where Enter must stay a newline.
  • Fixed a held Enter skipping a prompt the operator never saw, and restored focus to the form automatically after a failed send so a retry needs no mouse.
  • Added a ⏎ hint on the Continue button, shown only when Enter really confirms.
August 3, 2026CLI 0.26.24

Deploy and run behind a strict firewall

Stations on locked-down networks could not reach the third-party hosts used to download the Python runtime and to transfer deployment archives, so setup failed where IT could not allowlist them.

  • Added a TofuPilot-hosted mirror for Python interpreter downloads, so station networks now only need *.tofupilot.app, tofupilot.sh and dl.tofupilot.sh (plus PyPI).
  • Moved deployment uploads and downloads to artifacts.tofupilot.app, with no change to how stations work — they follow whatever address the API returns.
  • Added a clear error when a project's sources exceed the 95 MB upload limit, instead of an opaque failure part-way through.
  • Added overrides for air-gapped setups: point the mirror at your own host, or turn it off to use the upstream source.
August 3, 2026CLI 0.26.24Docs

Run a specific Python file with tofupilot run

Projects with several test stages sharing one codebase could not validate a stage locally: local runs always fell back to main.py, so the only workarounds were renaming files or keeping separate checkouts.

  • Added support for naming the entry file directly, so tofupilot run ./stage1_entry.py runs that stage instead of main.py, with a warning when the framework expects a directory rather than a file.
  • Fixed ID columns in tofupilot ls being cut to eight characters, so IDs can now be copy-pasted straight into get, update, rm and link.
  • Improved the logged-out and "no procedure found" messages to show the direct-file form, annotated as needing no account.

Try these features today