reachy-mini-sdk — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited reachy-mini-sdk (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Programming guide for Reachy Mini - an open-source desktop humanoid robot with 6-DOF head, expressive antennas, and AI integration.
Daemon: FastAPI on port 8000 (REST + WebSocket)
See references/installation.md for complete setup (uv/pip, platform-specific configs, permissions).
from reachy_mini import ReachyMini
# Local
with ReachyMini() as mini:
pass
# Remote (Wireless)
with ReachyMini(localhost_only=False) as mini:
passSee references/movement_control.md for complete guide (450+ lines with all patterns).
from reachy_mini.utils import create_head_pose
import numpy as np
# create_head_pose returns a 4x4 numpy ndarray (not a HeadPose object)
mini.goto_target(
head=create_head_pose(z=10, roll=15, degrees=True, mm=True),
antennas=np.deg2rad([45, 45]),
body_yaw=np.deg2rad(30),
duration=2.0,
method="minjerk" # linear | minjerk | ease_in_out | cartoon
)For high-frequency control (>30Hz):
mini.set_target(
head=create_head_pose(z=5, mm=True),
antennas=[0.5, -0.5]
)See references/sensors.md for camera, audio, IMU details.
# Camera (BGR numpy array)
frame = mini.media.get_frame()
# Audio (16kHz stereo)
samples = mini.media.get_audio_sample()
mini.media.push_audio_sample(samples) # Non-blocking
# IMU (Wireless only) - mini.imu is a property returning a dict, or None
data = mini.imu
if data is not None:
accel, gyro, quat = data["accelerometer"], data["gyroscope"], data["quaternion"]mini.start_recording()
# Move robot (e.g. by hand in gravity_compensation, or via goto_target)
frames = mini.stop_recording() # returns a list of timestamped joint framesstop_recording() returns a list of frame dicts (there is no Motion class on v1.8.0). Replay an authored move with mini.play_move(move) / mini.async_play_move(move), or play a saved dataset move over REST: POST /api/move/play/recorded-move-dataset/{dataset_name}/{move_name}.
See references/daemon_api.md for all 85 endpoints (v1.8.0). See references/openapi_usage.md for client generation.
import requests
# Move via API (head_pose: x,y,z in meters; roll,pitch,yaw in radians)
requests.post("http://localhost:8000/api/move/goto", json={
"head_pose": {"x": 0, "y": 0, "z": 0.01, "roll": 0, "pitch": 0, "yaw": 0},
"antennas": [0.5, -0.5],
"body_yaw": 0.2,
"duration": 2.0,
"interpolation": "minjerk"
})
# Get state
state = requests.get("http://localhost:8000/api/state/full").json()See references/openapi_schema.json for OpenAPI v3.1.0 spec.
# Python
openapi-generator-cli generate -i openapi_schema.json -g python -o client/
# TypeScript
openapi-typescript openapi_schema.json -o types.ts
# Go, Rust, Java, etc. (50+ languages supported)# Install app
requests.post("http://localhost:8000/api/apps/install", json={
"name": "hand_tracker",
"source": "hf_space",
"space_id": "pollen-robotics/hand_tracker_v2"
})
# Start app
requests.post("http://localhost:8000/api/apps/start-app/hand_tracker")The mode is a path segment (/api/motors/set_mode/{mode}), not a JSON body:
# Compliant (manual movement)
requests.post("http://localhost:8000/api/motors/set_mode/disabled")
# Active control
requests.post("http://localhost:8000/api/motors/set_mode/enabled")
# Gravity compensation
requests.post("http://localhost:8000/api/motors/set_mode/gravity_compensation")
# Current mode
requests.get("http://localhost:8000/api/motors/status").json() # {"mode": "..."}SDK equivalents: mini.enable_motors(), mini.disable_motors(), mini.enable_gravity_compensation(), mini.disable_gravity_compensation().
See references/ai_integration.md for LLM patterns, vision models, multimodal apps, and HuggingFace deployment.
from transformers import pipeline
detector = pipeline("object-detection")
frame = mini.media.get_frame()
results = detector(frame)
# React to detections
for obj in results:
if obj['label'] == 'person':
mini.goto_target(antennas=np.deg2rad([45, 45]), duration=0.5)def greet():
mini.goto_target(head=create_head_pose(z=5, mm=True), duration=0.5)
mini.goto_target(antennas=np.deg2rad([45, 45]), duration=0.5)
for _ in range(2):
mini.goto_target(head=create_head_pose(pitch=-10, degrees=True), duration=0.3)
mini.goto_target(head=create_head_pose(pitch=10, degrees=True), duration=0.3)for angle in [-60, -30, 0, 30, 60]:
mini.goto_target(
body_yaw=np.deg2rad(angle),
head=create_head_pose(z=5, mm=True),
duration=1.0
)localhost_only=False from PClocalhost_only=Truewith ReachyMini())SDK v1.8.0, OpenAPI v3.1.0
Source: https://github.com/pollen-robotics/reachy_mini/tree/1.8.0
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.