Native-Windows SO-101 support matrix
Retrieval date: 2026-07-26
Target: native 64-bit Windows, x86-64, CPython 3.12 ABI
Current bundle terminal status: NATIVE_WINDOWS_BLOCKED
The status is narrow: the source implementation and offline cross-platform checks are complete, but the required Windows host, browsers, Android device, and robot were not available in the packaging environment. Nothing here establishes technical impossibility.
The machine-readable authority is bridge/windows_support_matrix.json; dependency enforcement remains centralized in bridge/pyproject.toml.
Selected runtime
| Component | Selected boundary | Native-Windows evidence and decision |
|---|---|---|
| CPython | 3.12.10, official 64-bit installer | Exact setup baseline. Python 3.12.10 is the final 3.12 bugfix release with official Windows binary installers. Detect with py -3.12-64 -c "import platform,struct,sys; print(platform.python_version(), 8*struct.calcsize('P'), sys.platform)"; expected 3.12.10 64 win32. |
| LeRobot | 0.6.1 at commit 8a74e0ac6d01706d67fddfed682a09d694d9c8c0 |
Install lerobot[core_scripts,feetech] from the immutable commit. The Placo extra is deliberately excluded. The adapter import is probed without enumerating/opening serial ports. Real Windows SO-101 I/O remains a qualification item. |
| Feetech | feetech-servo-sdk==1.0.0, pyserial==3.5 |
pyserial officially supports Windows. Feetech 1.0.0 is source-only; this means no prebuilt wheel, not impossibility. Native COM-port operation must be reproduced. |
| Phone protocol | teleop==0.1.5 |
Pure-Python wheel, source attestation commit 3a5249176dcd911a82b6fcba7faeef7094f08fc7; compatibility probe retained. |
| Cartesian IK | native_dls_v1, numpy==2.2.6 |
NumPy publishes cp312-win_amd64; wheel SHA-256 is recorded in the JSON matrix. The selected solver parses the pinned URDF, excludes the gripper, uses bounded DLS, and never silently falls back. |
| Placo | 0.9.15 reference boundary only | The compatible wheel workflow has no Windows target. The adapter remains opt-in as lerobot_placo_reference; it is not installed for Windows and is not a fallback. |
| HTTPS/QR server | uvicorn[standard]==0.51.0, qrcode[pil]==8.2, Pillow==12.3.0 |
Pure-Python/Windows-wheel path selected; exact installed versions are checked by the runtime probe. |
| Local certificate tool | mkcert 1.4.4 | Explicit external prerequisite. No executable is silently downloaded. The optional Chocolatey install requires an explicit switch and is followed by an exact version check. |
| Xbox browser | current stable Chrome and Edge | Capability-qualified rather than hard-pinned. Both must expose Gamepad API and report the chosen controller with mapping === "standard"; neutral/deadman/source-loss behavior is tested separately in each. |
| Android browser | current stable Chrome on an ARCore-supported physical device | Requires trusted HTTPS, a secure context, WebXR support, an ARCore-supported device, and Google Play Services for AR. Emulator qualification is not accepted. |
Kinematics decision
The required Windows backend is native_dls_v1:
- semantic order is exactly
shoulder_pan,shoulder_lift,elbow_flex,wrist_flex,wrist_roll; - the gripper never enters FK or IK;
- public joint units are degrees; internal solver units are radians;
- poses use
x, y, z, wquaternions; - the bundled URDF digest must be
5ea6695846d5f04416116e75894b8b10627ed4ec559b907ccc9cb47f7a753860and target frame must begripper_frame_link; - position is the hard numerical contract; orientation is ignored at zero weight or treated as weighted best effort;
- configured ceilings are 48 iterations and 20 ms, with classified fail-closed outcomes;
- the configured 1.5 mm position residual is software numerical tolerance, not physical positioning accuracy.
A standard-library URDF-chain oracle and immutable reference corpus independently check production FK. IK results are independently forward-transformed before acceptance tests.
Browser/device qualification boundary
Gamepad API availability does not prove the physical Xbox mapping. Qualification must be repeated in current Chrome and Edge with explicit controller selection, neutral-state qualification, RT deadman, Fine override, pair selection only while idle, X measured hold, B STOP, poll-gap retirement, and explicit re-arm after STOP.
The Android path must first load https://<private-ip>:8443/ without a certificate warning. Only then may QR pairing be attempted. Verify window.isSecureContext, navigator.xr, one authorized WebSocket, release-to-hold, tracking/background/focus/pointer/transport retirement, reconnect state reset, unreachable-target rejection, and global STOP.
Primary sources
- Python 3.12.10:
https://www.python.org/downloads/release/python-31210/ - Immutable LeRobot dependency catalog:
https://github.com/huggingface/lerobot/blob/8a74e0ac6d01706d67fddfed682a09d694d9c8c0/pyproject.toml - Current LeRobot catalog (comparison only):
https://github.com/huggingface/lerobot/blob/main/pyproject.toml - NumPy 2.2.6 artifacts:
https://pypi.org/project/numpy/2.2.6/ - Feetech SDK 1.0.0:
https://pypi.org/project/feetech-servo-sdk/1.0.0/ - pyserial 3.5:
https://pypi.org/project/pyserial/3.5/ - teleop 0.1.5:
https://pypi.org/project/teleop/0.1.5/ - Placo 0.9.15 wheel workflow:
https://github.com/Rhoban/placo/blob/v0.9.15/.github/workflows/wheels.yml - Gamepad API:
https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API - WebXR/ARCore requirements:
https://developers.google.com/ar/develop/webxr/requirements - mkcert 1.4.4:
https://github.com/FiloSottile/mkcert/tree/v1.4.4