Fix SPC sidebar filters with multiple values
Fixed a bug that could cause SPC sidebar filters to silently ignore selections when more than one value was picked. Multi-value filters now narrow the chart as expected.
Stay up to date with new features and improvements.
Fixed a bug that could cause SPC sidebar filters to silently ignore selections when more than one value was picked. Multi-value filters now narrow the chart as expected.
A headless-first rewrite of TofuPilot Stations: more hardware architectures supported, real-time control from the web, isolated artifacts, and push-to-deploy with environments.
Creating a unit from a part with ., :, or + in its number used to fail with a raw validation blob. Validation now matches what part creation allows, and errors are readable.
., :, or +Self-hosted installations can now connect GitHub with clearer feedback at every step.
Multi-dimensional measurements now support named data series with independent units, enabling richer time-series visualizations.
name field to data series, allowing each axis to carry a label (e.g. "Frequency", "Voltage")units from measurement level to individual data series for per-axis unit controlWorkflows could incorrectly trigger from unrelated events.
Uploading files to test runs and units used to require three API calls (initialize, PUT, finalize) plus a fourth to link the attachment. Now it's one call across all five SDK clients.
runs.attachments.upload() and units.attachments.upload() helpers that handle the full upload flow in a single call across Python, C#, Rust, C++, and MATLABunits.attachments.delete() to remove attachments from units by IDruns.attachments.download() and units.attachments.download() to download attachments to local filesfrom tofupilot.v2 import TofuPilot
client = TofuPilot()
# Upload a file to a run
client.runs.attachments.upload(id=run.id, file="data/test-report.pdf")
# Upload a file to a unit
client.units.attachments.upload(serial_number="SN-0001", file="data/calibration.pdf")
# Download
client.runs.attachments.download(attachment, dest="local-report.pdf")
# Delete (units only)
client.units.attachments.delete(serial_number="SN-0001", ids=[attachment_id])Timestamps with timezone offsets like +02:00 or +05:30 now work across all API endpoints. You no longer need to convert to UTC before uploading.
Z suffix), no changes needed on the read sidefrom datetime import datetime, timezone, timedelta
# UTC (always worked)
client.runs.create(
started_at=datetime.now(timezone.utc),
ended_at=datetime.now(timezone.utc),
...
)
# Local timezone (now works too)
cet = timezone(timedelta(hours=2))
client.runs.create(
started_at=datetime.now(cet),
ended_at=datetime.now(cet),
...
)Trigger automated actions when test events occur. Connect your test data to the tools your team already uses, without writing glue code.