Developers

Developer quickstart

Use our RESTful API in your own stack, the CLI to set up locally, or the MerkleBot Agent on your robots. Here's how the pieces fit.

Step 1–3

Connect your first robot in minutes

Install the CLI, register a device and create a pipeline. The agent handles recording, compression, encryption, hashing and resumable uploads.

  • Works on Ubuntu 22.04/24.04, Debian, Yocto and any Docker host
  • ROS 2 Humble, Jazzy and newer; ROS 1 bridge for legacy robots
  • ARM64 and x86-64 builds for Jetson-class and industrial PCs

Examples on this page are illustrative. Full API reference and SDK credentials are available in your workspace after sign-up.

terminal
# 1. Install the CLI and log in
pip install merklebot-cli
mb login

# 2. Register a robot and install the agent
mb devices add --name ur5e-cell-03 --site warehouse-b
mb agent install --device ur5e-cell-03

# 3. Record ROS 2 topics to MCAP and sync to hybrid storage
mb pipelines create --device ur5e-cell-03 \
   --source ros2 --topics "/camera/.*,/joint_states,/tf" \
   --format mcap --compression zstd --storage hybrid
Agent configuration

Declarative recording policies

One YAML file describes sources, triggers and upload rules. Record continuously at low rate, and capture full-rate snapshots around events — before and after the error.

ros2mqttopc-uaspot-sdkmavlinkfiles
yaml
# /etc/merklebot/agent.yaml
device: ur5e-cell-03
site: warehouse-b
sources:
  - type: ros2
    topics: ["/camera/color/image_raw", "/joint_states", "/tf"]
    storage: mcap
    compression: zstd
    split: { max_size_mb: 1024, max_duration_s: 300 }
  - type: mqtt
    broker: tcp://gateway.local:1883
    topics: ["plant/line2/+/telemetry"]
triggers:
  - on: "/diagnostics level>=ERROR"
    snapshot: { before_s: 60, after_s: 30 }
upload:
  schedule: "idle_or_charging"
  max_bandwidth_mbps: 20
  encryption: client-side
  seal: merkle-root   # sign each batch with the device key
Webhooks

React to sealed recordings

Every batch is sealed with a Merkle root and signed by the device key. Subscribe to recording.sealed, extractor.completed or device.offline events and trigger your own workflows.

json
{
  "event": "recording.sealed",
  "device": "ur5e-cell-03",
  "recording_id": "rec_01J9X4N8T2",
  "cid": "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
  "merkle_root": "9f3ac1e04b7d2a58c6...",
  "signature": "ed25519:4k1Q...",
  "size_bytes": 734003200,
  "tags": ["gripper_stall", "shift-2"]
}
Custom extractors

Bring any Docker image

Package your processing code as a container and attach it to devices or events. Outputs are versioned and written back to the index.

bash
# Dockerfile for a custom extractor
FROM python:3.12-slim
RUN pip install --no-cache-dir mcap mcap-ros2-support pyarrow
COPY extract.py /app/extract.py
ENTRYPOINT ["python", "/app/extract.py"]

# register it
mb extractors register --name joints-to-parquet --image registry.example.com/joints:1.2
mb extractors attach --device ur5e-cell-03 --extractor joints-to-parquet --on recording.sealed
Developer workspace with a laptop running the MerkleBot CLI
SDKs & tools

Fits your existing stack

ToolUse it for
REST APIDevices, recordings, search, extractors, webhooks
CLILocal setup, scripting, CI pipelines
Python SDKNotebooks, data science, training pipelines
MerkleBot AgentOn-robot recording, buffering, encryption, upload
ExtractorsROSbag/MCAP → video, images, Parquet, enriched logs
Guides

Deep dives for engineers

Need API access?

Start on the free Starter plan or talk to an engineer about your stack.

Book a demo