Smoother GitHub setup on self-hosted
Self-hosted installations can now connect GitHub with clearer feedback at every step.
- Repository picker lists all repositories from GitHub and GitLab
- Connection errors surface clearly for easier troubleshooting
Stay up to date with new features and improvements.
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.
Control charts were limited to one measurement at a time. You can now overlay multiple compatible measurements on a single chart to spot correlations and trends across your process.
You can now upload runs, manage parts, and query test data directly from MATLAB -- no middleware, no CSV exports.
Teams running C++ test scripts can now upload runs, measurements, and attachments to TofuPilot directly from their codebase.
Process control gets smarter defaults, better filtering, and a new PDF export for sharing charts outside TofuPilot.