Remove console banner and version check
The Python SDK no longer prints a banner or checks PyPI on every client init — cleaner output, faster startup, no network call at import time.
Stay up to date with new features and improvements.
The Python SDK no longer prints a banner or checks PyPI on every client init — cleaner output, faster startup, no network call at import time.
All SDK clients now automatically append /api to custom server URLs, so self-hosted servers no longer need to include it manually — passing https://demo.tofupilot.sh now works out of the box without getting redirected to the signin page.
All SDK clients now expose typed validator objects instead of untyped JSON, making it easier to build and validate measurement validators with IDE autocomplete and compile-time checks.
Connect your GitLab repositories to automatically deploy test procedures to your stations and trace every test run back to its source code.
You can now push test runs to TofuPilot from Rust. The SDK covers the full V2 API with async builders, typed errors, retries, and file upload helpers.
let client = TofuPilot::new("your-api-key");
client.runs().create()
.procedure_id("FVT-001")
.serial_number("SN-042")
.part_number("PART-001")
.outcome(Outcome::Pass)
.send()
.await?;Self-hosted instances can now enable automatic deployments by installing the TofuPilot GitHub App. The setup process is documented in the self-hosting guide. Cloud users already have this built in.
Fixed an issue where some dashboard filters could return incorrect options after an internal infrastructure upgrade.
Our compatibility audit caught the regression, and we've added preventive checks to our release process for future dependency upgrades.
You can now push test runs to TofuPilot from C# and .NET. The SDK covers the full V2 API with typed responses and errors.
var client = new TofuPilot(apiKey: "your-api-key");
await client.Runs.CreateAsync(new RunCreateRequest
{
ProcedureId = "FVT-001",
SerialNumber = "SN-042",
PartNumber = "PART-001",
Outcome = RunCreateOutcome.Pass,
});API docs now show C# examples next to Python. Source on GitHub, package on NuGet.
Thanks to community member @Hylaean for building the original 1.x client that got this started.
You can now pass datetime objects to date filters on units.list() and batches.list(). Previously these only accepted strings, while runs.list() already handled datetime. All list endpoints are now consistent.
We also cleaned up attachments.finalize(). It no longer asks for an empty request_body parameter. If you were passing request_body={}, you can drop it.
All dashboard documentation pages now include working Python V2 SDK code examples. V1 client syntax has been removed and replaced with tofupilot.v2 throughout.