# Output formats

> The HDF5 and LeRobot layouts Rayform writes, and how to load them in PyTorch or JAX.

Source: https://rayform.world/docs/engine/output
Last updated: 2026-10-19
Status: Rayform is in private preview. The edge engine is in development with preview teams, and commands, formats and APIs described here may change before general availability.

`rayform export` resamples a run to one rate, applies your action definition, and writes either HDF5 or LeRobot. Alignment and resampling happen once, at export, not in your dataloader on every epoch.

```bash
rayform export RUN [RUN…] --format hdf5|lerobot --fps 15 \
  --action joints/position_delta --cameras wrist_left,front --only-usable --out PATH
```

## HDF5

The layout follows the robomimic convention also used by Isaac Lab, so existing loaders work unchanged.

```text
drawer.h5
  data/                         attrs: rayform_version, layout, fps, rig, calibration
    demo_0/                     attrs: task, operator, run, quality
      obs/
        wrist_left_rgb          (T, H, W, 3)  uint8
        front_depth             (T, H, W)     uint16, millimetres
        joint_position          (T, 14)       float32, radians
        gripper_position        (T, 2)        float32
      actions                   (T, 14)       float32
      timestamps_ns             (T,)          int64, run clock
    demo_1/ …
  mask/
    usable                      demo names that passed checks
```

## LeRobot

`--format lerobot` writes a LeRobot v3 dataset with even frame spacing, explicit joint names and camera videos. Before the command returns it loads the result with `LeRobotDataset`, so a dataset that LeRobot would reject is never written silently.

## Loading

```python title="PyTorch"
import rayform

ds = rayform.open("data/drawer.h5")
loader = ds.torch(cameras=["wrist_left_rgb"], horizon=16, batch_size=64, num_workers=8)
```

```python title="JAX"
import rayform

ds = rayform.open("data/drawer.h5")
for batch in ds.numpy(cameras=["wrist_left_rgb"], horizon=16, batch_size=64):
    batch = jax.device_put(batch)
```

`rayform.open` also accepts a LeRobot dataset folder. Plain `h5py` works too; the layout above is all there is.
