> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tryreflex.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# SO-101 quickstart

> Fastest path to a working demo on a physical SO-101 arm.

<Info>
  This guide assumes you have a physical SO-101 arm connected over USB serial.
  For a no-hardware run, see the [simulation guide](/guides/simulation).
</Info>

## 1. Setup (one-time)

From the repo root:

```bash theme={null}
bash scripts/setup-from-source.sh
```

## 2. Check environment and ports

```bash theme={null}
cli/rfx.sh doctor-so101
```

Verifies:

* Python / uv availability
* Detected serial ports
* `torch`, `yaml`, `rfx`, and native `rfx._rfx` extension imports

## 3. Setup motor IDs and baud (first time)

<Steps>
  <Step title="Normalize IDs and set baud">
    ```bash theme={null}
    cli/rfx.sh so101-setup --normalize-ids --set-baud-1m
    ```
  </Step>

  <Step title="Fallback if uv is unstable">
    ```bash theme={null}
    .venv/bin/python scripts/so101-setup.py --normalize-ids --set-baud-1m
    ```
  </Step>
</Steps>

## 4. Run the demo

<CodeGroup>
  ```bash auto-detect theme={null}
  cli/rfx.sh so101-demo --port auto
  ```

  ```bash explicit port theme={null}
  cli/rfx.sh so101-demo --port /dev/ttyACM0
  ```

  ```bash direct script theme={null}
  uv run --python 3.13 python rfx/examples/so101_quickstart.py --port auto
  ```
</CodeGroup>

The demo connects to the SO-101 through the core robot primitive, resets to
home, runs a gentle sinusoidal motion, and returns home on exit.

## Bimanual setup (two arms)

Default bimanual config: `rfx/configs/so101_bimanual.yaml`.

```bash theme={null}
cli/rfx.sh so101-bimanual
```

Override the config directly:

```bash theme={null}
uv run --python 3.13 rfx/examples/teleop_record.py \
  --config rfx/configs/so101_bimanual.yaml
```

### Export formats during teleop

<CodeGroup>
  ```bash lerobot theme={null}
  uv run --python 3.13 rfx/examples/teleop_record.py \
    --config rfx/configs/so101_bimanual.yaml \
    --export-format lerobot \
    --lerobot-repo-id your/repo
  ```

  ```bash mcap theme={null}
  uv run --python 3.13 rfx/examples/teleop_record.py \
    --config rfx/configs/so101_bimanual.yaml \
    --export-format mcap
  ```

  ```bash both theme={null}
  uv run --python 3.13 rfx/examples/teleop_record.py \
    --config rfx/configs/so101_bimanual.yaml \
    --export-format both \
    --lerobot-repo-id your/repo
  ```
</CodeGroup>

## Minimal Python API

```python theme={null}
from rfx.robot import lerobot

robot = lerobot.so101(port="/dev/ttyACM0")
robot.reset()
obs = robot.observe()
robot.disconnect()
```

## Dataset collection

Collect directly into a LeRobot dataset:

```bash theme={null}
rfx record \
  --repo-id your-org/so101-demos \
  --robot so101 \
  --episodes 5 \
  --duration 30
```
