daisylab
Python library for controlling Daisy laboratory instruments over USB serial.
daisylab discovers Daisy hardware on your serial ports, validates the
connected instruments against what your code expects, and gives you a clean,
per-instrument API for pumps, valves, and motion stages — with background
threads handling the serial protocol for you.
Installation
pip install daisylab
Requires Python 3.9+ and pyserial 3.5+.
Quick start
import daisylab
with daisylab.connect() as lab:
print("Found ports:", lab.ports)
print("Instrument types:", lab.instruments_list)
# Declare the instruments on a port, in physical order, by type code.
group = daisylab.InstrumentGroup([10, 2]) # Peri T + Multi-Valve
lab.add_group(group)
pump = group.inst[0] # DaisyPeriT
valve = group.inst[1] # DaisyMultiValve
valve.home()
pump.run(speed=50.0, volume=10.0, wait=True) # 50 ml/min, 10 ml
valve.select_port(3, wait=True)
connect() returns a DaisyInterface (usable as a context manager). Each
InstrumentGroup is bound to a serial port in the order you call
add_group().
Supported instruments
Instruments are declared by integer type code (the value the firmware
reports during roll-call) or by a case-insensitive name substring such as
"Peri T" or "gantry".
| Code | Class | Hardware |
|---|---|---|
| 1 | DaisyPeriS |
Peri pump S |
| 2 | DaisyMultiValve |
12-port rotary valve |
| 3 | DaisySolVal |
Solenoid valve array (≤8) |
| 4 | DaisyPistonPump |
Piston pump (1 ml) |
| 5 | DaisyPeriPumpXL |
Peri pump XL |
| 6 | DaisyMultiValveXL |
Rotary valve XL |
| 7 | DaisySolValXL |
Solenoid valve array XL |
| 8 | DaisyGantry |
XY Cartesian stage |
| 9 | DaisyZStage |
Z linear stage |
| 10 | DaisyPeriT |
Peri pump T |
| 11 | DaisyPeriP |
Peri pump P |
| 12 | DaisyPistonPump |
Piston pump (5 ml) |
| 13 | DaisyProcess |
Multi-channel pH/sensor |
| 14 | DaisyMasterflow |
Dual-channel mass flow controller |
Peristaltic pump speed limits
Peri pumps enforce a per-model maximum motor speed. run(speed, volume)
converts the requested flow (ml/min) to RPM using the current calibration and
raises ValueError before sending anything if it would exceed the cap:
| Model | Max RPM |
|---|---|
| Peri S / Peri P | 150 |
| Peri T / Peri Pump XL | 300 |
The cap is calibration-aware: recalibrating the tubing shifts the ml/min ceiling but the motor is always held to its rated RPM.
Examples
Standalone, runnable scripts live in daisylab/examples/:
daisy_controller.py— universal interactive controller for any instrumentz_stage_controller.py— interactive Z-stage controllerz_stage_peri_t_sequence.py— automated dispense sequence (home → lower → pump → raise)
Each supports a --demo flag that runs against simulated hardware (no serial
I/O required):
python daisylab/examples/daisy_controller.py --demo
A sample Jupyter notebook is also included in the package at
daisylab/jupyter/sample.ipynb. After installing, you can find it at
<site-packages>/daisylab/jupyter/sample.ipynb.
Exceptions
Every error the library raises derives from DaisyError, so a single
except daisylab.DaisyError is a complete catch-all for any instrument:
DaisyTimeoutError— noOK/ aBADreply within the timeoutDaisyConnectionError— no devices found / connection failureDaisyInstrumentMismatchError— software list ≠ hardware roll-callDaisyValueError— invalid argument or value (e.g. speed above a pump'sMAX_RPM, unknown type code, malformed device response). Also subclasses the built-inValueError, so existingexcept ValueErrorhandlers keep working.
Stopping safely
stop_all() halts every instrument across all groups (best-effort — one
instrument's failure won't block the others); ports stay open so you can
recover. safe_session() wraps a command sequence and stops everything if any
exception propagates:
with lab.safe_session():
pump.run(speed=50, volume=10, wait=True)
gantry.run(100, 150, wait=True) # if this raises, the pump is stopped
# the original exception is re-raised after the stop
lab.stop_all() # or halt everything manually (alias: lab.emergency_stop())
group.stop_all() # or just one group
Development
git clone https://github.com/ScalablesLab/daisy-python-library
cd daisy-python-library
pip install -e ".[test]"
pytest
The test suite is hardware-free — tests/fakes.py provides a synchronous
FakeSerialManager that synthesises device replies, so the real drivers run
end to end without any instruments attached.
License
Apache License 2.0 — see LICENSE. Copyright Scalables, LLC.
Release files for daisylab 0.3.16
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distributions (wheels)
Total release size: 13.0 MB
Release files / daisylab-0.3.16-cp314-cp314-win_amd64.whl
| Download URL | daisylab-0.3.16-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 630.5 kB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
3bb053331842da42094fea8c2dbc481ee8a95466b281525b35535c52311bfe04
|
|
BLAKE2b-256 checksum How to use checksums |
5cc76ca44741bde376ac1e7526ec3e2a5fb69dfe0d14e90257a24db6473e19c8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp314-cp314-macosx_11_0_x86_64.whl
| Download URL | daisylab-0.3.16-cp314-cp314-macosx_11_0_x86_64.whl |
|---|---|
| Size | 819.6 kB |
| Tags | CPython 3.14 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
fc5117d5454b2096a000df160ecf74b570335902a84438a2d40e49f397241270
|
|
BLAKE2b-256 checksum How to use checksums |
4525ae4fef7a0f4267c44ce693ef4dfca8c7c82e4acbc7901f3e672c9eaa836b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp314-cp314-macosx_11_0_arm64.whl
| Download URL | daisylab-0.3.16-cp314-cp314-macosx_11_0_arm64.whl |
|---|---|
| Size | 788.5 kB |
| Tags | CPython 3.14 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
ac55c93abbe3b379d27d64c68113f5a9fa7169684b7ee3eb133696e96086c3c2
|
|
BLAKE2b-256 checksum How to use checksums |
a61e1fb4e9b85cd8e9593c28071d20ef8181ee5d285db1eaf1a659b8d1bd2ccb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp313-cp313-win_amd64.whl
| Download URL | daisylab-0.3.16-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 614.9 kB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
ef8d973def869a89657cb0ee947f452b4a4a0bfb0efb639d2d2eab3e79dfa4a0
|
|
BLAKE2b-256 checksum How to use checksums |
36cbd7665452cc893f0e8c400cb2d3fe65ec1df7bf724ec52c2f6db0e3a2c2a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp313-cp313-macosx_11_0_x86_64.whl
| Download URL | daisylab-0.3.16-cp313-cp313-macosx_11_0_x86_64.whl |
|---|---|
| Size | 821.5 kB |
| Tags | CPython 3.13 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
da8ccfddf57c96a572914295ccc45e4d01c83b23c857afac18013a2fc12c5e21
|
|
BLAKE2b-256 checksum How to use checksums |
cf24481b75f92c817851da28cc4e005006c6a477cdcb7438d3a11604d0ed6d92
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp313-cp313-macosx_11_0_arm64.whl
| Download URL | daisylab-0.3.16-cp313-cp313-macosx_11_0_arm64.whl |
|---|---|
| Size | 790.5 kB |
| Tags | CPython 3.13 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
3c4a60ab3bceceafdbbeae7a7b9666c7a7cccf12e875332d376d550029c31fc1
|
|
BLAKE2b-256 checksum How to use checksums |
f4c2f048136e53620b7b437658eb92fee406299a9f086aa5ad812ea3a1686ca4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp312-cp312-win_amd64.whl
| Download URL | daisylab-0.3.16-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 621.3 kB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
346846718a0b204ac43770ad20a007d79c8ec1c8189bef719a8adb48bc3b2b4f
|
|
BLAKE2b-256 checksum How to use checksums |
9b816e4e06c682a6ebb99a924a02b99087b60f71d704cee63b5cb4e3656e1c13
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp312-cp312-macosx_11_0_x86_64.whl
| Download URL | daisylab-0.3.16-cp312-cp312-macosx_11_0_x86_64.whl |
|---|---|
| Size | 826.3 kB |
| Tags | CPython 3.12 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
d2a6f50ef096b874e9b2eb13471842e016db06302de23197c892a3f39c4d80dc
|
|
BLAKE2b-256 checksum How to use checksums |
b224fcfa256dde3c840fb6e73f40a346bec112036f1b5318ed89a605e4d3c25d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | daisylab-0.3.16-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 794.1 kB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
382a91afbb9430c2600ce1c9cfb99dcd70e62d99a11db817e9fba986d05283d5
|
|
BLAKE2b-256 checksum How to use checksums |
a6d3d60e7bbd63cac233ce5dad2c05ec64cb6d83dde3c6519700b1bd3aace442
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp311-cp311-win_amd64.whl
| Download URL | daisylab-0.3.16-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 620.6 kB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
ede56cbd9a3c3fffae65f326d34708c5ae85a6f285000c5545b2f9b5569ad269
|
|
BLAKE2b-256 checksum How to use checksums |
87fdcfc6960e81b180bc888b977a2ef1c8bc928e3fb6775658701566664a4e61
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp311-cp311-macosx_11_0_x86_64.whl
| Download URL | daisylab-0.3.16-cp311-cp311-macosx_11_0_x86_64.whl |
|---|---|
| Size | 736.4 kB |
| Tags | CPython 3.11 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
235b49025903ed4eb49e728491a9619102ebf9ba01a942120ac5e7e9cf23d40f
|
|
BLAKE2b-256 checksum How to use checksums |
d05c43b0300919ae27cf94cf5b9c948814a50ecfbccfd42daf5be463abbf7e10
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp311-cp311-macosx_11_0_arm64.whl
| Download URL | daisylab-0.3.16-cp311-cp311-macosx_11_0_arm64.whl |
|---|---|
| Size | 710.2 kB |
| Tags | CPython 3.11 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
99800f40e454dd9782a7db328307faa951ac53df26507604f514af800fcc514e
|
|
BLAKE2b-256 checksum How to use checksums |
cbb8135352e2142bb33015f6d02592eecbbf80395783dad68c0bc680760ad42b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp310-cp310-win_amd64.whl
| Download URL | daisylab-0.3.16-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 618.7 kB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
bbe830f87e84e4ebe6c471d0c3d737ccd3a37bdd275fd71ee8b6e0fbe95219b0
|
|
BLAKE2b-256 checksum How to use checksums |
22214fda505fc0b663c8aaf20e6694101a7e0d05a8f01594cb20d3eef14e2ea0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp310-cp310-macosx_11_0_x86_64.whl
| Download URL | daisylab-0.3.16-cp310-cp310-macosx_11_0_x86_64.whl |
|---|---|
| Size | 748.5 kB |
| Tags | CPython 3.10 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
85dc679be3cfbefb818ecbc0960de39b6df84cadc306ebe133f2d1c73cd7704b
|
|
BLAKE2b-256 checksum How to use checksums |
68e9d871949110d81fc95bb0da61b03f6b2f290512ba689202253754b58009c6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp310-cp310-macosx_11_0_arm64.whl
| Download URL | daisylab-0.3.16-cp310-cp310-macosx_11_0_arm64.whl |
|---|---|
| Size | 716.6 kB |
| Tags | CPython 3.10 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
b7eb03d67a51bb57753a14be477cf6130420414843082bdbd0d76aabb392c0d7
|
|
BLAKE2b-256 checksum How to use checksums |
b22b3482cb20436dcdfc541ca33e8818653ccc850027c670559cdba0578d15df
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp39-cp39-win_amd64.whl
| Download URL | daisylab-0.3.16-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 622.0 kB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
d0b16e7043a99a5cf332feed55b66d14c8f568a0b31c9ea03f53501bf26f1371
|
|
BLAKE2b-256 checksum How to use checksums |
118a9e0ccb1631a3f4056fc0d9ba1268621c4920ca2e0d23f4be95bb541b838b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp39-cp39-macosx_11_0_x86_64.whl
| Download URL | daisylab-0.3.16-cp39-cp39-macosx_11_0_x86_64.whl |
|---|---|
| Size | 752.9 kB |
| Tags | CPython 3.9 macOS 11.0+ x86-64 |
|
SHA-256 checksum How to use checksums |
e871ab46851acad897647fc4ca05c1494e385f4387f2a35876c35a60e4ece098
|
|
BLAKE2b-256 checksum How to use checksums |
cd313bcd3513fd91c7992153916a6655fb53b6403a28a988ff6da32f0b1a0426
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency logRelease files / daisylab-0.3.16-cp39-cp39-macosx_11_0_arm64.whl
| Download URL | daisylab-0.3.16-cp39-cp39-macosx_11_0_arm64.whl |
|---|---|
| Size | 720.9 kB |
| Tags | CPython 3.9 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c036d3120c15e6cf7625de748c456ffd0a75b22cde6d4afc97b432338cf2c867
|
|
BLAKE2b-256 checksum How to use checksums |
396f3c628609feb231d1827085d014599b89d2c52a34e2115b6206f714864b8d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 20, 2026.
Transparency log