Skip to main content
This page is a stub. A human will curate and expand it before publishing.
The Cyberwave platform uses MQTT for real-time communication between edge drivers, the cloud backend, and the frontend. This page lists every topic and payload schema so you can write compatible drivers, simulators, or integrations without reading source code.

Topic prefix

In non-production deployments the broker may be configured with an environment prefix (e.g. local for local dev). When a prefix is set, every topic below is written {prefix}cyberwave/.... The Python SDK’s topic_prefix parameter and the Edge Core environment variable CYBERWAVE_TOPIC_PREFIX handle this automatically. All topic patterns on this page omit the prefix for clarity.

Source types

Most payloads include a source_type field. The allowed values are:
ValueMeaning
edgePhysical edge device / driver
edge_leaderLeader arm (teleoperation)
edge_followerFollower arm (teleoperation)
teleFrontend teleoperation (real-world)
simSimulation state (e.g. MuJoCo)
sim_teleFrontend teleoperation in simulation
editFrontend editor
previewFrontend preview mode

Twin transform

cyberwave/twin/{twin_uuid}/position

Direction: publish (edge / sim) → subscribe (backend, frontend) Reports the 3D world position of the twin. Published by edge drivers and simulators; consumed by the backend (Vector) and the frontend.
{
  "source_type": "edge",
  "position": { "x": 1.0, "y": 2.0, "z": 0.0 },
  "timestamp": 1700000000.0
}
FieldTypeRequiredDescription
source_typestringyesSee source types
position.xnumberyesX coordinate (metres)
position.ynumberyesY coordinate (metres)
position.znumberyesZ coordinate (metres)
timestampnumbernoUnix timestamp (seconds)

cyberwave/twin/{twin_uuid}/rotation

Direction: publish (edge / sim) → subscribe (backend, frontend) Reports the orientation of the twin as a quaternion.
{
  "source_type": "edge",
  "rotation": { "w": 1.0, "x": 0.0, "y": 0.0, "z": 0.0 },
  "timestamp": 1700000000.0
}
FieldTypeRequiredDescription
source_typestringyesSee source types
rotation.wnumbernoW component (real part, default 1.0)
rotation.xnumbernoX component (default 0.0)
rotation.ynumbernoY component (default 0.0)
rotation.znumbernoZ component (default 0.0)
timestampnumbernoUnix timestamp (seconds)

cyberwave/twin/{twin_uuid}/scale

Direction: publish (edge / editor) → subscribe (backend, frontend) Sets the render scale of the twin’s 3D model.
{
  "source_type": "edit",
  "scale": { "x": 1.0, "y": 1.0, "z": 1.0 },
  "timestamp": 1700000000.0
}
FieldTypeRequiredDescription
source_typestringyesSee source types
scale.xnumberyesX scale factor
scale.ynumberyesY scale factor
scale.znumberyesZ scale factor
timestampnumbernoUnix timestamp (seconds)

Joint states

cyberwave/joint/{twin_uuid}/update

Direction: publish (edge / sim / tele) → subscribe (backend, frontend) Reports the state of one or more joints. Two payload formats are supported.

Single-joint format

Use this to report one joint at a time.
{
  "source_type": "edge",
  "type": "joint_state",
  "joint_name": "shoulder_pan_joint",
  "joint_state": {
    "position": 1.57,
    "velocity": 0.0,
    "effort": 0.0
  },
  "timestamp": 1700000000.0
}
FieldTypeRequiredDescription
source_typestringyesSee source types
typestringyesAlways "joint_state"
joint_namestringyesJoint name as defined in the asset schema
joint_state.positionnumbernoPosition in radians (revolute) or metres (prismatic)
joint_state.velocitynumbernoVelocity
joint_state.effortnumbernoEffort / torque
timestampnumbernoUnix timestamp (seconds)

Flat multi-joint format

Use this to report many joints efficiently. Joint positions become top-level keys.
{
  "source_type": "edge",
  "_1": 0.5,
  "_2": -0.3,
  "_3": 1.2
}
FieldTypeRequiredDescription
source_typestringyesSee source types
{joint_name}numberyesOne key per joint; value is position in radians or metres

Aggregated multi-joint format

Use this when you also want to send velocities, efforts, or telemetry metadata.
{
  "source_type": "edge_follower",
  "positions": { "_1": 0.5, "_2": -0.3 },
  "velocities": { "_1": 0.0, "_2": 0.0 },
  "efforts": { "_1": 0.0, "_2": 0.0 },
  "timestamp": 1709123456.789,
  "source_subtype": "openvla",
  "workload_uuid": "uuid-here"
}
FieldTypeRequiredDescription
source_typestringyesSee source types
positionsobjectyesMap of joint names to position values
velocitiesobjectnoMap of joint names to velocity values
effortsobjectnoMap of joint names to effort values
timestampnumberyes (when using this format)Unix timestamp (seconds)
source_subtypestringnoInference model name (e.g. "openvla")
workload_uuidstringnoUUID of the ML workload generating this update
session_idstringnoSession identifier for grouping related updates

cyberwave/twin/{twin_uuid}/navigate/command

Direction: publish (backend) → subscribe (edge driver) Sends a navigation command to the robot. Published by the backend in response to a REST API call.
{
  "action_id": "d0b0e8a7-7d6e-4e73-bf2d-9c420ff14c75",
  "command": "navigate_to_pose",
  "twin_uuid": "twin-uuid-here",
  "environment_uuid": "env-uuid-here",
  "controller_policy_uuid": "policy-uuid-here",
  "source_type": "tele",
  "nav_frame_coords": false,
  "position": [1.0, 2.0, 0.0],
  "rotation": [0.0, 0.0, 0.0, 1.0],
  "waypoints": [
    { "x": 0.5, "y": 1.0, "z": 0.0 }
  ],
  "constraints": {},
  "frame_id": "map",
  "reference_frame": "map",
  "timestamp": 1700000000.0
}
FieldTypeRequiredDescription
action_idstringyesUUID of the action (use to report status back)
commandstringyesNavigation command string (e.g. "navigate_to_pose", "cancel")
twin_uuidstringyesUUID of the twin to navigate
environment_uuidstringnoUUID of the environment
controller_policy_uuidstringnoUUID of the controller policy
source_typestringyesSee source types
nav_frame_coordsbooleanyesWhether coordinates are already in the navigation frame
positionarray[3]noTarget position [x, y, z] in metres
rotationarray[4]noTarget orientation as quaternion [x, y, z, w]
waypointsarraynoList of intermediate waypoints {x, y, z}
constraintsobjectnoNavigation constraints (planner-specific)
frame_idstringnoCoordinate frame for the target
reference_framestringnoSame as frame_id
metadataobjectnoExtra metadata forwarded to the driver
timestampnumberyesUnix timestamp (seconds)

cyberwave/twin/{twin_uuid}/navigate/status

Direction: publish (edge driver) → subscribe (backend) Reports the execution status of a navigation command. The action_id must match the one received in navigate/command.
{
  "action_id": "d0b0e8a7-7d6e-4e73-bf2d-9c420ff14c75",
  "status": "running",
  "progress": 45.0,
  "source_type": "edge",
  "timestamp": 1700000000.0
}
FieldTypeRequiredDescription
action_idstringyesAction UUID received in the command
statusstringyes"queued" | "running" | "blocked" | "completed" | "failed" | "cancelled"
messagestringnoHuman-readable status message
progressnumbernoCompletion percentage (0–100)
source_typestringnoSee source types
timestampnumbernoUnix timestamp (seconds)

Locomotion commands

cyberwave/twin/{twin_uuid}/command

Direction: publish (backend / frontend) → subscribe (edge driver) Sends a discrete command to an edge device. Used for locomotion (move/turn), video control, and robot-specific actions.

Locomotion commands

Sent by the Cyberwave platform when the user presses a keyboard binding.
{
  "source_type": "tele",
  "command": "move_forward",
  "data": { "linear_x": 1.5, "angular_z": 0.0 },
  "timestamp": 1700000000.0
}
Standard locomotion command strings:
commandDescriptiondata fields
move_forwardDrive forwardlinear_x (m/s or m), angular_z (rad/s or rad)
move_backwardDrive backwardlinear_x (negative), angular_z
turn_leftRotate leftlinear_x: 0, angular_z (positive)
turn_rightRotate rightlinear_x: 0, angular_z (negative)
strafe_leftStrafe left (drones/omni robots)linear_y (negative)
strafe_rightStrafe rightlinear_y (positive)
ascendIncrease altitude (drones)linear_z (positive)
descendDecrease altitudelinear_z (negative)
takeoffTake off
landLand
return_to_homeReturn to home position
emergency_stopImmediate stop
sit_downSit / crouch (quadruped)delta_z (negative)
stand_upStand (quadruped)delta_z (positive)
recovery_standRecovery stand (quadruped)
Robot-specific command strings used by bundled controllers:
commandRobotDescription
led_toggleQuadrupedToggle LEDs
chassis_light_toggleUGV BeastToggle chassis light
camera_light_toggleUGV BeastToggle camera light
camera_up / camera_downUGV BeastTilt camera
camera_left / camera_rightUGV BeastPan camera
camera_defaultUGV BeastReset camera position
take_photoUGV Beast, QuadrupedTrigger camera snapshot
battery_checkUGV BeastRequest battery status
lightsUGV BeastSet light PWM (pass pwm in data)
set_linear_velocityQuadrupedUpdate velocity setting (linear in data)
set_angular_velocityQuadrupedUpdate velocity setting (angular in data)
FieldTypeRequiredDescription
source_typestringyesSee source types
commandstringyesCommand name (see tables above)
dataobjectnoCommand parameters (driver-specific)
timestampnumberyesUnix timestamp (seconds)

Video control commands

Sent by the backend to start or stop video streaming on the edge device.
{
  "type": "start_video",
  "timestamp": 1700000000.0,
  "sensor_id": "front_camera",
  "recording": true
}
FieldTypeRequiredDescription
typestringyes"start_video" | "stop_video"
timestampnumberyesUnix timestamp (seconds)
sensor_idstringnoCamera identifier for multi-camera setups (defaults to primary camera)
recordingbooleannoWhether to record the stream (start_video only)

Telemetry lifecycle

cyberwave/twin/{twin_uuid}/telemetry

Direction: publish (edge driver) → subscribe (backend) Lifecycle events for the telemetry session. Send these to let the backend track driver connectivity.
{ "type": "connected", "timestamp": 1700000000.0 }
{ "type": "telemetry_start", "timestamp": 1700000000.0, "fps": 30.0 }
{ "type": "telemetry_end", "timestamp": 1700000000.0 }
{ "type": "disconnected", "timestamp": 1700000000.0 }
typeWhen to sendExtra fields
connectedOn MQTT connect
telemetry_startWhen the driver starts publishing datafps (optional), observations (optional)
telemetry_endWhen the driver stops publishing data
disconnectedOn MQTT disconnect
initial_observationFor teleoperation: send current joint state to the leaderobservations (object), fps (number)
Other type values used internally by edge drivers:
typeDescription
camera_storedCamera frame stored to recording
video_start_timestampTimestamp of first video frame
camera_sync_frameFrame used to synchronise camera playback
driver_logDriver log message (see driver log)
motor_statusMotor controller status

Sensor data

cyberwave/twin/{twin_uuid}/depth

Direction: publish (edge driver) → subscribe (backend / cloud nodes) Depth camera frame as a base64-encoded array.
{
  "type": "depth_data",
  "data": "base64EncodedDepthArray==",
  "width": 640,
  "height": 480,
  "timestamp": 1700000000.0
}
FieldTypeRequiredDescription
typestringyesAlways "depth_data"
datastringyesBase64-encoded uint16 depth array (millimetres)
widthnumbernoFrame width in pixels (default 640)
heightnumbernoFrame height in pixels (default 480)
timestampnumbernoUnix timestamp (seconds)

cyberwave/twin/{twin_uuid}/pointcloud

Direction: publish (backend / edge) → subscribe (frontend) Point cloud data as a base64-encoded array.
{
  "type": "pointcloud",
  "data": "base64EncodedPointCloud==",
  "timestamp": 1700000000.0
}
FieldTypeRequiredDescription
typestringyesAlways "pointcloud"
datastringyesBase64-encoded Nx3 float32 XYZ array
timestampnumbernoUnix timestamp (seconds)

cyberwave/twin/{twin_uuid}/metrics

Direction: publish (edge driver) → subscribe (backend) Periodic robot metrics snapshot (battery, navigation status, load, errors, etc.).
{
  "source_type": "edge",
  "metrics": {
    "power": {
      "battery_percent": 78,
      "charging": false,
      "voltage": 48.2,
      "estimated_runtime_minutes": 240
    },
    "navigation": {
      "status": "navigating",
      "distance_remaining_m": 23.5,
      "eta_seconds": 45
    },
    "errors": []
  }
}
FieldTypeRequiredDescription
source_typestringyesTypically "edge"
metricsobjectyesFree-form dict of metric categories and values

Edge health

cyberwave/twin/{twin_uuid}/edge_health

Direction: publish (edge driver) → subscribe (backend, frontend) Periodic health status published by the edge driver (every ~5 seconds).
{
  "type": "edge_health",
  "timestamp": 1700000000.0,
  "twin_uuid": "twin-uuid-here",
  "edge_id": "edge-device-id",
  "uptime_seconds": 3600.0,
  "streams": {
    "front_camera": {
      "camera_id": "front_camera",
      "connection_state": "connected",
      "ice_connection_state": "connected",
      "frames_sent": 12345,
      "last_frame_ts": 1700000000.0,
      "fps": 29.97,
      "uptime_seconds": 3600.0,
      "restart_count": 0,
      "is_stale": false,
      "is_healthy": true
    }
  },
  "stream_count": 1,
  "healthy_streams": 1
}
FieldTypeRequiredDescription
typestringyesAlways "edge_health"
timestampnumberyesUnix timestamp (seconds)
twin_uuidstringyesTwin UUID
edge_idstringyesEdge device identifier
uptime_secondsnumberyesSeconds since the driver started
streamsobjectnoMap of camera/stream IDs to stream health objects
stream_countnumbernoTotal number of streams
healthy_streamsnumbernoNumber of healthy streams

Driver log

cyberwave/twin/{twin_uuid}/driverlog

Direction: publish (edge core / driver) → subscribe (backend) Structured log messages from edge drivers. Displayed in the platform UI.
{
  "type": "driver_log",
  "message": "Camera initialised on /dev/video0",
  "level": "info",
  "container_name": "cyberwave-driver-so101",
  "source": "edge_core",
  "timestamp": 1700000000.0,
  "edge_core_version": "1.2.3",
  "sdk_version": "0.9.0",
  "driver_image": "ghcr.io/cyberwave-os/so101-driver:latest"
}
FieldTypeRequiredDescription
typestringyesAlways "driver_log"
messagestringyesLog message text
levelstringyes"debug" | "info" | "warning" | "error"
container_namestringnoDocker container name
sourcestringnoLog source identifier
timestampnumberyesUnix timestamp (seconds)
edge_core_versionstringnoEdge Core version string
sdk_versionstringnoSDK version string
driver_imagestringnoDocker image that produced the log

WebRTC signalling

These topics are used to establish peer-to-peer video streaming between the edge and the browser.

cyberwave/twin/{twin_uuid}/webrtc-offer

Direction: publish (edge) → subscribe (backend / media-service)
{
  "type": "offer",
  "sdp": "v=0\r\n...",
  "target": "backend",
  "sender": "edge",
  "color_track_id": "video-0",
  "depth_track_id": "video-1",
  "timestamp": 1700000000.0
}

cyberwave/twin/{twin_uuid}/webrtc-answer

Direction: publish (backend / media-service) → subscribe (edge)
{
  "type": "answer",
  "sdp": "v=0\r\n...",
  "target": "edge",
  "sender": "backend",
  "frontend_type": "rgb",
  "timestamp": 1700000000.0
}

cyberwave/twin/{twin_uuid}/webrtc-candidate

Direction: bidirectional ICE candidate exchange during WebRTC negotiation. Payload is the raw ICE candidate object.

Environment

cyberwave/environment/{environment_uuid}/{update_type}

Direction: publish (backend / edge) → subscribe (frontend, other services) Generic environment update channel. update_type is a free-form string (e.g. "twin_added", "twin_removed", "sensor_binding", "event").
{
  "type": "twin_added",
  "data": { "twin_uuid": "twin-uuid-here" },
  "timestamp": 1700000000.0,
  "source_type": "edit"
}
FieldTypeRequiredDescription
typestringyesSame as update_type in the topic
dataobjectyesUpdate payload (structure depends on type)
timestampnumberyesUnix timestamp (seconds)
source_typestringnoSee source types

Sensor binding update

{
  "type": "sensor_binding",
  "bindings": {
    "sensor-uuid-1": "target-uuid-1",
    "sensor-uuid-2": "target-uuid-2"
  },
  "timestamp": 1700000000.0
}

Health check

cyberwave/ping/{resource_uuid}/request

Direction: publish (any client) → subscribe (backend) Connectivity probe. The backend replies on the corresponding pong topic.
{ "type": "ping", "timestamp": 1700000000.0 }

cyberwave/pong/{resource_uuid}/response

Direction: publish (backend) → subscribe (client)
{ "type": "pong", "timestamp": 1700000000.0 }

Workflow run status

cyberwave/workflow-run/{run_uuid}/status

Direction: publish (backend) → subscribe (SDK clients) Status updates for a running workflow execution.
{ "status": "running", "timestamp": 1700000000.0 }
statusDescription
"pending"Queued, not yet started
"running"Currently executing
"completed"Finished successfully
"failed"Terminated with an error
"cancelled"Cancelled by the user