@nori/sdk
Robot-local teleoperation SDK for the Nori daemon. Connect to a robot over WebRTC, receive its video + telemetry, and drive it — from the browser, in ~20 lines.
┌ your app ┐ ┌ @nori/sdk ┐ WebRTC ┌robot bridge┐ NDJSON ┌ nori daemon ┐
│ video el │ ◄───► │RemoteTeleop│ ◄────────► │webrtc_robot│ ◄─────► │ 50Hz control │
│ keyboard │ └───────────┘ data chan └────────────┘ :7777 │ safety stack │
└──────────┘ signaling ▲ └──────────────┘
(Supabase or BYO)Safety
The daemon defends itself — clamping, watchdog, E-STOP, rate-limits and the motor torque lifecycle are all on the robot. No message this SDK can send makes the robot unsafe. That invariant is what makes a client SDK safe to hand out.
Targets nori-protocol v1 (NORI_PROTOCOL_VERSION); a daemon on a different major rejects the connection. Read the safety contract before you ship.
The SDK is not model-specific: the same client drives a Nori L2 or a Nori A3 — including the one model-dependent wire quirk (the frozen L2 fleet's base-angular sign), which the SDK resolves internally so your code never learns it exists (see Driving → Base). If you have an A3, see Nori A3 — including a published robot description you can load into a simulator today.
Two clients speak the protocol: @nori/sdk (TypeScript — the browser client these pages document, source at Nori-Robotics/Nori-SDK) and nori-sdk for Python — headless scripts, policy and agent drivers, dataset tooling, CI. The Python client is on PyPI (source); the TypeScript package is not on npm yet. The wire dialect both implement is specified in Nori-Robotics/Nori-Protocol — JSON Schemas plus validated fixtures for every message.
Need lower-level than an operator SDK — your own control loops on the robot itself, nothing through Nori's cloud? That's the planned developer posture.
Where to start
- Install — from the release tarball we send you.
- Quick start — a connected, driving robot in one code block, and a mock robot for building with zero hardware.
- Telemetry — every field the robot streams back, and what
nullmeans in each. - The safety contract — the part you must read.
Status
The core teleop + VR surface is stable. The two-way call API (joinCall / leaveCall / mic / camera on RemoteTeleop) is present but experimental and may change.
Note the robot-side consent gate: joinCall() rings an accept prompt at the robot, and room audio stays silent until a person there accepts. Audio clips sent via sendClipAudio are exempt — see Audio.
Where an SDK surface exists but the robot-side half isn't live yet, the page says so in a callout. Read those before building on the feature.
License and lineage
Apache-2.0. Developed within Nori's fork of huggingface/leLab (Apache-2.0); the SDK package files are Nori-original additions.
