Skip to content

Dashboard

The operator's console: fleet cards with live joints, camera tiles, run a policy, record, replay, one E-STOP.

python3 -m pip install "strands-robots[sim,dashboard]"
STRANDS_DASH_DEV_AUTH=1 strands-robots dashboard --dashboard-port 8080   # localhost, no passkey

Open http://127.0.0.1:8080, type so101, pick sim, tick confirm, press connect: a card with six joints appears. Without STRANDS_DASH_DEV_AUTH=1 the first visit enrolls a WebAuthn passkey and the first key enrolled wins.

route does
GET /api/fleet local robots and mesh peers, with is_connected and joints
POST /api/robot/{name}/connect .../move .../disconnect through the same Robot facade as everything else
GET /api/robot/{name}/observe one observation
POST /api/run /api/record /api/replay jobs; GET /api/jobs, POST /api/jobs/{id}/stop
POST /api/estop /api/resume the fleet e-stop; resume needs STRANDS_MESH_OVERRIDE_CODE
GET /api/safety latched, by whom, why
WS /ws camera tiles and joint state

Every write carries confirm: true or answers 428. move is dry_run: true unless told otherwise. While the e-stop is latched every move and run is refused ESTOP_LATCHED. Reads never touch hardware.