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

> ## Agent Instructions
> Treat the Dreamscale CLI and Python SDK as the supported public integration surfaces.
> Prefer `dreamscale run <robot>` for supported robots and `dreamscale.connect()` with a context manager in Python.
> Do not infer or recommend internal control-plane APIs.

# SO-101

> Set up an SO-101 arm with two cameras, then run a cloud model on it from the CLI.

Allow about 20 minutes.

## What you need

* An SO-101 follower arm, connected by USB.
* Two USB cameras: a **side** camera on a fixed mount and a **wrist** camera on
  the arm.
* A computer for the arm and both cameras. A Raspberry Pi 5 works.
* The Dreamscale CLI, signed in. See [Quick start](/quickstart).

## 1. Place the side camera

Put the side camera 60–80 cm from the arm, side-on, with the whole arm and
workspace in frame. Use even lighting and a plain background. Lock exposure and
white balance if your camera allows it.

<Frame caption="Side camera placement">
  <img src="https://mintcdn.com/dreamtimelabs/oICbMoLlyNHOIg7j/images/so101-camera-reference.svg?fit=max&auto=format&n=oICbMoLlyNHOIg7j&q=85&s=3c0eaddadd841a7590e07911dd2835fd" alt="Top and side views showing the side camera 60 to 80 cm from the SO-101, side-on, with the whole arm and workspace in frame" width="960" height="540" data-path="images/so101-camera-reference.svg" />
</Frame>

Mount the wrist camera so it sees the gripper. Route its cable so no joint can
pull it.

## 2. Set up the arm and cameras

```bash theme={null}
dreamscale robots so101 setup
```

The first run installs SO-101 support. Then it finds the arm's serial port and
shows a preview of each camera so you can pick the side and wrist cameras.

<Tip>
  On Linux, if the port is not found, add yourself to the `dialout` group:
  `sudo usermod -aG dialout $USER`, then log out and back in.
</Tip>

## 3. Calibrate

```bash theme={null}
dreamscale robots so101 calibrate
```

Clear the table and follow the prompts to move each joint through its range.

## 4. Check everything

```bash theme={null}
dreamscale doctor so101
```

This checks the port, calibration, and both cameras, and shows your side camera
next to the reference framing.

<Check>
  The command ends with a `✓` line.
</Check>

Optional: pose the arm where each task should start, then save it as home:

```bash theme={null}
dreamscale robots so101 home --set
```

## 5. Run a model

<Warning>
  The arm will move. Clear the workspace, keep people and cables out of reach,
  and keep the power switch within reach.
</Warning>

```bash theme={null}
dreamscale run so101 --model molmoact2-so101
```

1. Press **Enter** to connect the arm.
2. Type an instruction, for example `pick up the red block and put it in the box`.
3. The arm moves to home and shows a preview of the first actions. Nothing
   moves yet.
4. Press **Enter** to run. Press **Ctrl+C** to stop.
5. The arm holds, returns home, and asks for the next instruction. Press
   **Ctrl+C** again to disconnect.

The arm keeps holding its pose after the command exits. Support it, then
release the motors:

```bash theme={null}
dreamscale robots so101 release
```

## Models

| Model | Notes |
| - | - |
| `molmoact2-so101` | MolmoAct2, the default SO-101 policy |
| `fable`, `opus`, `astra`, `sol`, `argon` | Language models that plan with bounded arm tools. Add `--effort low\|medium\|high` |
| `perceptron-isaac05-so101` | Your own Isaac 0.5 fine-tune, with `--deployment ckpt_...`. See [Deploy your fine-tune](/fine-tuning/deployments) |

Run `dreamscale models` to see every model your organization can use.

## Useful options

| Option | What it does |
| - | - |
| `--instruction TEXT` | Run one task, then exit |
| `--max-actions N` | Stop each task after `N` actions |
| `--max-joint-velocity` | Joint speed cap in degrees per second (default 150) |
| `--keep-warm SECONDS` | Keep the GPU reserved after each task (default 300, billed). `0` releases it |
| `--hud` | Record each task on [HUD](/integrations/hud) |
| `--inspect-robots` | Record the run as an [Inspect Robots](/integrations/inspect-robots) eval log |

See the [CLI reference](/reference/cli#run) for every option. Stuck? See
[Troubleshooting](/reference/troubleshooting).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.