zendo-sdk (Python)
Python client for the Zendo motion-tracking WebSocket stream. Connect to a running Zendo instance and get typed quaternion and landmark events — no byte-parsing, no port hunting.
The package is a thin layer over the Rust zendo-sdk
crate (via PyO3), so decoding and the connection lifecycle are handled in Rust.
It imports as zendo.
Install
pip install zendo-sdk
Wheels are published for Linux (x86_64, aarch64), macOS (Apple Silicon and Intel), and Windows (x86_64), on CPython 3.10 and newer.
Quickstart
The client is synchronous and blocking: iterating it waits for the next frame. This keeps it ergonomic in notebooks and scripts.
import zendo
with zendo.connect() as client: # auto-discovers the port (5432-5435)
print(f"connected on port {client.port}")
for event in client:
match event:
case zendo.BodyQuaternions(frame):
print("hips:", frame.hips.w, frame.hips.x, frame.hips.y, frame.hips.z)
case zendo.BodyLandmarks(frame):
print("nose:", frame.nose.x, frame.nose.y, frame.nose.z)
case zendo.HandQuaternions(side, frame):
print(side, "wrist:", frame.wrist.w)
case zendo.HandLandmarks(side, frame):
print(side, "thumb tip:", frame.thumb_tip.x, frame.thumb_tip.confidence)
case zendo.BodyIsbAngles(frame):
print("right elbow flexion:", frame.right_elbow_flexion)
Without structural pattern matching:
import zendo
with zendo.connect() as client:
for event in client:
if isinstance(event, zendo.BodyQuaternions):
print(event.frame.hips)
Connecting
| Function | Behaviour |
|---|---|
zendo.connect() |
Scans ports 5432-5435 on 127.0.0.1, connects to the first Zendo found. |
zendo.connect_at(port) |
Connects to an explicit port on 127.0.0.1. |
zendo.connect_url(url) |
Connects to an explicit ws://host:port URL. |
To reach a Zendo on another machine, copy the address from Zendo's Settings:
zendo.connect_url("ws://192.168.1.42:5432"). The stream is plain ws:// —
unencrypted and unauthenticated — so only use it on a trusted network.
All three accept reconnect=True to transparently re-establish a dropped
connection with exponential backoff:
client = zendo.connect(reconnect=True, base_delay_ms=250, max_retries=10)
Types
Events are immutable dataclasses. Frames expose one attribute per joint or
landmark — frame.hips, frame.left_wrist, frame.thumb_tip — each a
Quaternion (w, x, y, z) or Landmark (x, y, z, confidence). Frames are
also iterable: for name, value in frame: ....
BodyIsbAnglesFrame instead exposes 21 scalar float attributes (in radians) —
frame.neck_flexion, frame.right_elbow_flexion, etc. The shoulder
plane_of_elevation fields are float('nan') when the shoulder is near
neutral (gimbal singularity).
The package ships type information (py.typed) and is checked with
ty and linted with
ruff.
Offline decoding
zendo.decode_frame(data: bytes) decodes a single raw protocol frame into a
typed event — handy for replaying captures or testing.
License
Licensed under either of Apache-2.0 or MIT at your option.
Metadata
Release files for zendo-sdk 0.4.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zendo_sdk-0.4.3.tar.gz | 78.5 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| zendo_sdk-0.4.3-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| zendo_sdk-0.4.3-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| zendo_sdk-0.4.3-cp310-abi3-manylinux_2_28_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| zendo_sdk-0.4.3-cp310-abi3-manylinux_2_28_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| zendo_sdk-0.4.3-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| zendo_sdk-0.4.3-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 3.4 MB
Release files / zendo_sdk-0.4.3.tar.gz
| Download URL | zendo_sdk-0.4.3.tar.gz |
|---|---|
| Size | 78.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7cd3606a338bc917d89c92da8320c237df1a4a74445ebf7d0f537ee7f9551091
|
|
BLAKE2b-256 checksum How to use checksums |
c2cad27ecdc999568b0ff264bb96def6298de7b11339cd0034c195e9a72c3f78
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency logRelease files / zendo_sdk-0.4.3-cp310-abi3-win_amd64.whl
| Download URL | zendo_sdk-0.4.3-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 392.4 kB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
bb383d05f4dd47cd5cbad9ad871bd98d5c293313918d50bc01b44852e4fa57bc
|
|
BLAKE2b-256 checksum How to use checksums |
f32d08d3abd785c43c63592d9c2779b09b7bbd4f4d11a4ad9707d80d9b5e5632
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency logRelease files / zendo_sdk-0.4.3-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | zendo_sdk-0.4.3-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 762.9 kB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
5fa6f138f77fe0a2444e9d066c1152630485b285c8451864b86dc76b63c319ce
|
|
BLAKE2b-256 checksum How to use checksums |
d122c1255ffbb23593d9ec8dcbadebaacf017dad68e639a44ae7318fdbcd7b63
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency logRelease files / zendo_sdk-0.4.3-cp310-abi3-manylinux_2_28_x86_64.whl
| Download URL | zendo_sdk-0.4.3-cp310-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 555.1 kB |
| Tags | CPython 3.10 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
af7ad3370726b9a960a71018304763d595f2ca04ebfb0f20446ce010d6bd5b45
|
|
BLAKE2b-256 checksum How to use checksums |
a061084e86694f7c0618a572edd5673d1d071b3960d864bbb68772abcdc934f1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency logRelease files / zendo_sdk-0.4.3-cp310-abi3-manylinux_2_28_aarch64.whl
| Download URL | zendo_sdk-0.4.3-cp310-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 556.9 kB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
0abb1781013e11ffe6150ac3f2771d68bdca51ddebdba353aab0cae34203928c
|
|
BLAKE2b-256 checksum How to use checksums |
0ca76727a1827a7f9cfabd27104ec525f589d7ee8260cb66bef718c4c5a6daa7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency logRelease files / zendo_sdk-0.4.3-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | zendo_sdk-0.4.3-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 502.5 kB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
5c364b483c2c81c71333ac8a1d8429625660950c26191e3d561c195866391f3a
|
|
BLAKE2b-256 checksum How to use checksums |
a439d28b8b279141b0abe27358503f6c58549937a8179b5ed121ee1c94db13a5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency logRelease files / zendo_sdk-0.4.3-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | zendo_sdk-0.4.3-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 508.3 kB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
7fb6333ae598e8894da740611a81cb9a584e41eb9a6fdb3d469c7748ca1c24c9
|
|
BLAKE2b-256 checksum How to use checksums |
51ee000fd88c661b725c0c7ca7382b4725bc8c8f2ae61ad74b71eca2dbc7bff7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
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 Jul 16, 2026.
Transparency log