Stream any robot signal with one line of Python.
A log_* call for every one of 14 first-class modalities, durable, synchronized, and resilient to crashes and flaky networks. One pip install neuracore and every joint angle, camera frame, and spoken instruction lands in the cloud as a typed, timestamped sample.
14 first-class modalities, one function each.
Every log call accepts an optional robot_name, instance, timestamp, and a dry_run validation flag, so heterogeneous sensors logged in one frame share an exact capture time.
Proprioception & commands
Joint positions, velocities, torques, and target positions, plus visual-only joints for URDF rendering, excluded from training.
Poses and grippers
7-vector EE poses validated as unit quaternions, generic 6-DoF object poses, and normalized parallel-gripper open amounts vs. targets.
Cameras, words, anything
RGB with optional intrinsics/extrinsics, metric depth, point clouds, free-text instructions, and arbitrary 1-D custom signals.
Connect, record, and it uploads itself.
The canonical loop is start_recording() → per-frame log_* → stop_recording(), once per demonstration. Stopping auto-uploads the episode to the cloud.
Omit robot_name and the last-connected robot is targeted. Pass dry_run=True to type-check a pipeline without emitting data.
import neuracore as nc, time
nc.login()
nc.connect_robot(robot_name="Mujoco VX300s", urdf_path=URDF_PATH)
nc.create_dataset(name="Cube Handover")
nc.start_recording() # begin an episode
t = time.time()
nc.log_joint_positions(positions=obs.qpos, timestamp=t)
nc.log_rgb("wrist_cam", obs.rgb, timestamp=t)
nc.log_language(name="instruction",
language="Pick up the cube", timestamp=t)
nc.log_custom_1d("force_torque", ft_reading, timestamp=t)
nc.stop_recording() # auto-uploads to the cloudBuilt to never lose a demonstration.
A dropped network or a crashed training script never costs you data. Collection is engineered end to end, from the wire protocol to the on-disk spool.
Live monitoring + durable recording
Every log_* call fans out to two paths: real-time P2P WebRTC video and data channels for live dashboards, and durable recording via the local data daemon.
Resilient Rust data daemon
A native Rust binary buffers, encodes, and uploads with shared-memory transport, disk spooling, backpressure, offline mode, and a WAL SQLite state store that survives restarts.
Dual H.264 encoding
Each camera trace is encoded losslessly (libx264rgb, CRF 0) for training fidelity and lossy (QP 23) for fast playback, plus resumable, chunked GCS uploads that resume on failure.
Distributed & teleoperated collection
Fuse cameras on one machine with arms on another over WebRTC into one SynchronizedPoint, gated until all expected streaming nodes are connected.