The SO-100 and the LeRobot dataset format

LeRobot is the de facto interchange format for low-cost manipulation data. If your SO-100 recordings are in it, most of the open-source training ecosystem will accept them. This page covers the structure, the version split, and the one compatibility trap that costs people an afternoon.

Last updated 2026-08-07

Why the format matters more than it sounds

Every research group used to invent its own recording layout, which meant every dataset needed a bespoke loader. LeRobot, maintained by Hugging Face, ended most of that. Recording into it means you can hand your data to a policy trainer you did not write, and it will load.

What the layout looks like

A LeRobot dataset is a directory of Parquet files for the numeric streams, encoded video for the camera streams, and JSON metadata describing what the columns mean. The client writes this directly, so there is no conversion step.

text
my_so100_pick/
├── meta/
│   ├── info.json          # fps, robot type, feature schema
│   ├── episodes.jsonl     # one line per episode, with its task string
│   └── stats.json         # per-feature mean/std, used for normalisation
├── data/
│   └── chunk-000/
│       └── episode_000000.parquet   # joint states + actions per frame
└── videos/
    └── chunk-000/
        ├── observation.images.wrist/episode_000000.mp4
        └── observation.images.scene/episode_000000.mp4
Layout of a LeRobot v2.1 dataset recorded from an SO-100.

Version 2.1 versus 3.0

LeRobot v3.0 reorganised how episodes are chunked and how metadata is stored, mainly to handle datasets far larger than a single workstation records. It is the better format going forward. The catch is that the training ecosystem moved more slowly than the format did.

v2.1v3.0
Episode filesOne Parquet file per episodeEpisodes batched into larger chunks
Metadataepisodes.jsonlRestructured, with additional index files
Large datasetsSlows down past a few thousand episodesDesigned for it
Trainer supportAccepted nearly everywhereStill patchy in third-party trainers
GR00T only accepts v2.1

NVIDIA GR00T will not load a v3.0 dataset. If you plan to fine-tune GR00T, record or export as v2.1. This is the single most common reason a training job fails immediately after upload, and the error message is not obvious about the cause.

The platform reads both versions for dataset preview and archiving, so you can inspect either. The constraint is on the training side, not on ingest.

Exporting and moving datasets

The client writes LeRobot directly during recording. If you already have recordings elsewhere, the CLI can package a local directory and upload it as an archive.

bash
# Inspect what you have locally
ay-robots datasets list --local

# Upload an existing LeRobot directory
ay-robots datasets upload ./my_so100_pick --name "SO-100 pick v1"

# Pull one back down
ay-robots datasets download <dataset-id> --out ./restored

Frequently asked questions

Which version should I record in?

v2.1 unless you have a specific reason not to. It is accepted by more trainers, including GR00T, and the scaling advantages of v3.0 only start to matter well past the dataset size a single SO-100 produces.

Can I convert v3.0 back to v2.1?

Yes, the LeRobot tooling ships conversion scripts in both directions. Expect it to take a few minutes for a mid-sized dataset since the video files get re-chunked.

Does my dataset have to be public on the Hugging Face Hub?

No. The format and the hub are separate things. Datasets recorded with the client stay in your account unless you publish them yourself.