Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,11 @@ jobs:
cache: npm
cache-dependency-path: frontend/package-lock.json

- name: Verify committed frontend bundle
- name: Verify frontend tests and committed bundle
working-directory: frontend
run: |
npm ci
npm test
npm run build
if [[ -n "$(git status --porcelain -- dist)" ]]; then
git diff --stat -- dist
Expand Down
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ Run the Python tests with `pytest` (config in [pyproject.toml](pyproject.toml);
- [teleoperate.py](lelab/teleoperate.py) — leader→follower teleoperation (wraps `lerobot.teleoperate`).
- [calibrate.py](lelab/calibrate.py) — step-by-step web calibration with a `CalibrationManager` singleton and `_step_complete` threading.Event.
- [train.py](lelab/train.py) — wraps the LeRobot training CLI as a subprocess (psutil for lifecycle, queue for log streaming).
- [datasets.py](lelab/datasets.py) — dataset listing (local cache + Hub, merged under a `source` field) plus the episode-browsing handlers behind `/dataset-episodes`, `/dataset-episode`, `/dataset-frame`, `/dataset-thumbnails`, `/dataset-motion` and `/dataset-video`.
- [episode_media.py](lelab/episode_media.py) — reads the LeRobot v3.0 on-disk layout (`meta/episodes/*.parquet` + `videos/`) and decodes frames with PyAV. Deliberately does **not** go through `LeRobotDataset`, so browsing a dataset never builds a robot config or imports torch. Several episodes share one mp4, so locating an episode resolves both the file and the `from_/to_timestamp` window inside it — which is why `/dataset-video` is addressed by chunk/file rather than by episode.
- [dataset_repair.py](lelab/dataset_repair.py) — rebuilds `meta/episodes/` for a recording interrupted before `LeRobotDataset.finalize()` ran. Without an episode index LeRobot reads a local dataset as "not downloaded yet" and fetches it from the Hub, which 404s for a dataset that was never pushed. Call `repair_local_dataset(repo_id)` before opening a recorded dataset with `LeRobotDataset`.
- [utils/config.py](lelab/utils/config.py) — shared paths and persistence: calibration JSON, saved ports, saved config selections. **Import shared constants from here, do not hardcode paths in feature modules.**

Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ A page will automatically open in your browser and you are ready to go.
<td>📹 <b>Record</b></td>
<td>Capture episodes into a LeRobotDataset, with cameras.</td>
</tr>
<tr>
<td>🔎 <b>Browse</b></td>
<td>Watch the episodes of a dataset on disk — every camera, frame by frame, with a joint-motion trace. No upload required.</td>
</tr>
<tr>
<td>🧠 <b>Train</b></td>
<td>Kick off a LeRobot training job, watch logs live.</td>
Expand Down
1 change: 0 additions & 1 deletion frontend/dist/assets/index-1vZ-UTJX.css

This file was deleted.

3,958 changes: 3,958 additions & 0 deletions frontend/dist/assets/index-BX9JKcmw.js

Large diffs are not rendered by default.

3,958 changes: 0 additions & 3,958 deletions frontend/dist/assets/index-Cl3yeJ80.js

This file was deleted.

1 change: 1 addition & 0 deletions frontend/dist/assets/index-DJuBJMLM.css

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions frontend/dist/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
<meta property="og:title" content="LeLab" />
<meta property="og:description" content="LeRobot but on your browser." />
<meta property="og:type" content="website" />
<script type="module" crossorigin src="/assets/index-Cl3yeJ80.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-1vZ-UTJX.css">
<script type="module" crossorigin src="/assets/index-BX9JKcmw.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DJuBJMLM.css">
</head>

<body>
Expand Down
Loading
Loading