Skip to content

Changelog

Stay up to date with new features and improvements.

September 2, 2026CLI 1.5.0

Fix operators tabbing out of the Windows kiosk

On Windows the station kiosk launched Microsoft Edge with generic full-screen flags, which hide the toolbars but leave an ordinary browser session behind them, so pressing Ctrl+T opened a tab on the MSN start page.

  • Fixed the kiosk launch on Windows to use Edge's own kiosk mode, which serves a single site in a private session and blocks new tabs and new windows.
  • Pinned the kiosk idle timeout to zero, so the window can never be closed and reset under a running test.
  • Rewrote the message shown when the local UI cannot bind its port, which blamed privileged ports on every platform and sent Windows operators looking for administrator rights instead of the reserved port ranges that were the real cause.
September 2, 2026CLI 1.5.0

Report runs that stop at a failure as Failed

When a phase failed under the default stop-on-first-failure setting, the remaining phases were skipped and the whole run was reported as aborted, so a normal failing unit landed in the aborted bucket and a filter on Failed never found it.

  • Fixed the outcome of a run stopped by a failed phase, which now reports Failed, or Timeout when the phase timed out, instead of Aborted. The skipped phases after the failure are unchanged.
  • Kept Aborted for genuine interruptions: an operator stop or kill, and an explicit stop asked for by a phase. An operator kill during a passing phase used to report Error and now reports Aborted.
September 2, 2026CLI 1.5.0Dashboard 2.42.0Python SDK 2.19.0C# SDK 2.17.0Rust SDK 2.18.0C++ SDK 2.12.0MATLAB SDK 2.12.0

Stop lost responses duplicating your runs

A run upload whose response never made it back to the station was re-sent and stored a second time, so one test appeared twice on the dashboard.

  • Added an idempotency reference that the CLI mints and saves before its first upload attempt, so every retry of the same run returns the run already created instead of storing another one.
  • Removed a redundant retry loop inside the CLI upload queue, which had turned a single queued attempt into up to four uploads.
  • Extended the reference to the Python, C#, Rust, C++ and MATLAB clients, and to stations already in the field, which pick it up on upgrade with no re-login.
September 2, 2026Dashboard 2.41.4

Fix invitation re-sends and seat limit gaps

Re-inviting a pending user, or inviting through the authentication API rather than the dashboard, did not follow the same rules as a regular invitation.

  • Fixed re-inviting an already-invited user: the link already shared stays valid and its validity is extended; changing the role or access group now issues a fresh invitation instead
  • Fixed plan seat limits and the role ceiling not applying to invitations created through the authentication API
  • Unified invitation validity at 30 days across every invite path
September 2, 2026Dashboard 2.41.3

Fix invitations for Microsoft logins

Self-hosted instances using Microsoft Entra login could leave invited users locked out: Microsoft does not report emails as verified by default, so invitees never saw their pending invitation and, without an email server configured, administrators had to copy invitation links by hand.

  • Fixed invited users signing in with a company Microsoft account now landing directly on their pending invitation
  • Fixed previously blocked accounts recovering automatically on their next sign-in
August 28, 2026Dashboard 2.41.0CLI 1.5.0Python SDK 2.18.0C# SDK 2.16.0Rust SDK 2.17.0C++ SDK 2.11.0MATLAB SDK 2.11.0

Add metadata to stations, parts and revisions

Stations, parts and revisions now carry custom metadata, the same typed key/value pairs runs and units already had, so a station's location or a part's supplier lives in TofuPilot instead of a spreadsheet next to it.

  • Added a metadata editor to the station, part and revision pages: string, number and boolean values, up to 50 keys per entity, read-only for viewers.
  • Added metadata to the V2 create, get and update endpoints for stations, parts and revisions. Updates are a patch: keys you don't send are kept, a null value deletes a key.
  • Added a metadata filter and include_metadata to the station and part list endpoints, with per-key operators (in, contains, gte/lte/gt/lt/eq, boolean eq), so you can list every station in one building or every part from one supplier in a single call.
  • Added every metadata change to the entity's timeline with who made it and the old and new value. The station Activity section now shows without a CLI install, since these edits come from the dashboard or the API.
  • Shipped the new fields and list parameters in the Python, C#, Rust, C++ and MATLAB SDKs.
August 27, 2026Dashboard 2.40.7

Fix run duration filtering at any timescale

The duration histogram in the run filters bucketed every run shorter than ten seconds into a single column, so a fast test was drawn a full second away from its real duration and the slider could not select it.

  • Fixed the histogram collapsing short runs into one column — it now spans the real range of the runs you are filtering, down to milliseconds
  • Fixed the slider handles not lining up with the bars, and typed values like 0.4s being rounded away to no bound at all
  • Fixed the histogram failing to load when the run list was filtered by sample, procedure version or environment
August 26, 2026CLI 1.4.5Dashboard 2.40.6

Fix operator emails rejected in Operated By

Declaring operated_by at the procedure root prompts the operator on the identify-unit screen, where the field wrongly inherited the serial-number character check and rejected email addresses.

  • Fixed the Operated By field rejecting emails and other free-text operator names on the identify-unit screen
  • Fixed custom metadata values on the same screen being limited to the serial-number character set
  • Added regression tests locking the identify-form validation to unit-identity fields only
August 26, 2026CLI 1.4.4Dashboard 2.40.5

Attribute runs to operators without accounts

A run's operator no longer has to be a TofuPilot account, so a line running on a station key can attribute its runs to the operators who ran them.

  • Added free-text operator names to operated_by: an email matching a member of your organization still links the run to that account, any other value is recorded as a declared name.
  • Extended it to every surface that produces a run — the V2 API, the operated_by: key in procedure.yaml, an Operator UI badge scan, Python phases, OpenHTF, pytest, Robot, and CSV, STDF, ATDF, ATML, TestStand, WATS and WSXF imports.
  • Added declared names to the runs list, the Operated By filter and the operator analytics, so a declared operator gets its own row instead of falling into Unknown, and alert concentration can name them.
  • Added operated_by_names to the run, histogram, measurement and phase list endpoints, combined with operated_by_ids as OR.
  • Changed file imports to take the operator from the file rather than from whoever clicks Import.
August 26, 2026Dashboard 2.40.0

Automate InvenTree stock from your workflows

Workflows can write test results and stock movements straight into InvenTree, so your inventory reflects what happened on the line without anyone retyping it.

  • Added workflow actions that create stock items, upload test results, update stock status, transfer stock, complete build outputs and print labels on your InvenTree server, with an existing serial reused rather than rejected so a re-run stays idempotent.
  • Added serial-number matching, with an optional part IPN when several parts share a serial, so an action targets the item a run actually produced.
  • Added pickers for parts, stock locations, build orders, build outputs and label templates, so a resolved option shows its name rather than a raw ID.

Try these features today