Nuuduu
Python SDK and CLI for Nuuduu Atlas — search, request, and sync robotics training datasets (LeRobot, MCAP, HEVC) to your local machine for PyTorch / LeRobot workflows.
| URL | |
|---|---|
| Atlas web app | https://nuuduu.ai/atlas |
| Atlas API (default) | https://nuuduu.com |
The CLI talks to the API at nuuduu.com. Browse episodes and manage downloads in the Atlas web app. v1 may still send you to the web app for some payments; the destination is fully in-CLI purchase via nuuduu request (see Roadmap).
Source repository: bitbucket.org/nuuduu/nuuduu
Installation
# Library only
pip install nuuduu
# Library + CLI command (quote brackets so the shell does not treat them as globs)
pip install 'nuuduu[cli]'
Development install:
git clone git@bitbucket.org:nuuduu/nuuduu.git
cd nuuduu
uv sync --all-extras
Quick start (CLI)
# Authenticate (saves token to ~/.config/nuuduu/config.toml, mode 0600)
nuuduu auth login
# Search episodes
nuuduu episodes search --text "pick up cup"
# Request a LeRobot bundle
nuuduu episodes download --format lerobot --uuids "<uuid-1>,<uuid-2>"
# Request new training data (quote + confirm — API coming soon)
nuuduu request "pick and place red blocks" --episodes 1000
# Sync ready bundles to your local dataset directory
nuuduu sync
# Load in LeRobot (after sync)
python -c "
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset
dataset = LeRobotDataset('local', root='~/.cache/huggingface/lerobot/nuuduu-atlas/<download-uuid>')
print(len(dataset))
"
Quick start (library)
from nuuduu import NuuduuAtlas
atlas = NuuduuAtlas.from_config()
episodes = atlas.search_episodes(text="fold laundry", limit=10)
job = atlas.request_download(
format="lerobot",
uuids=[ep.uuid for ep in episodes if ep.uuid],
)
result = atlas.sync(format="lerobot")
for bundle in result.synced:
print(bundle.path)
Authentication
Use the same email and password as your Atlas web app account. The CLI authenticates against the API at https://nuuduu.com.
Credentials are stored at ~/.config/nuuduu/config.toml with 0600 permissions. The CLI refuses to read config files that are group- or world-readable.
| Method | Usage |
|---|---|
| Config file | api_token = "..." in ~/.config/nuuduu/config.toml |
| Environment | export NUUDUU_API_TOKEN="..." |
| Programmatic | NuuduuAtlas(token="...") |
nuuduu auth login # email + password → saves token
nuuduu auth token set TOKEN # set token manually
nuuduu auth status # show masked token status
Tokens expire after 24 hours in production. On HTTP 401, run nuuduu auth login again.
Dataset directory
Resolved automatically via priority chain:
--dataset-dirCLI flagNUUDUU_DATASET_DIRenvironment variabledataset_dirin config fileHF_LEROBOT_HOME/nuuduu-atlas(LeRobot ecosystem default)- Project
.env, training configs, or./datasets/nuuduu-atlas - Fallback:
~/.cache/huggingface/lerobot/nuuduu-atlas
nuuduu config show # shows resolved path and source
Local layout:
{dataset_dir}/
.nuuduu/manifest.json
lerobot/{download_uuid}/ # LeRobot v2.1 dataset
mcap/{download_uuid}/ # per-episode .mcap files
hevc/{download_uuid}/ # per-episode .mp4 files
CLI reference
nuuduu --help
nuuduu --version
nuuduu auth login
nuuduu auth token set TOKEN
nuuduu auth status
nuuduu config show
nuuduu config set KEY VALUE
nuuduu sync [--dataset-dir PATH] [--format lerobot|mcap|hevc|all] [--dry-run] [--verify]
nuuduu downloads list
nuuduu downloads status [ID]
nuuduu downloads cancel ID
nuuduu episodes search [--text QUERY] [--country CODE] [--assignment UUID] [--limit N]
nuuduu episodes latest [--limit N]
nuuduu episodes download --format FORMAT --uuids UUID[,UUID...] [--wait]
nuuduu request "TASK DESCRIPTION" --episodes N [--yes]
nuuduu request list
Add --json to any command for machine-readable output.
Roadmap
v1 (today): Search episodes, request download bundles, sync locally. Some paid downloads still require completing payment in the Atlas web app before nuuduu sync.
Destination UX — order new data entirely from the terminal:
nuuduu request "pick and place red blocks" --episodes 1000
Estimated price: €742
Available immediately: 681 episodes
To collect: 319 episodes
Purchase using Acme Robotics account? [Y/n]
After confirmation, Atlas fulfills the order and nuuduu sync materializes bundles locally. No browser step.
Download formats
| Format | Contents | Best for |
|---|---|---|
lerobot |
LeRobot v2.1 dataset (meta/, data/, videos/) | PyTorch / LeRobot training |
mcap |
Per-episode MCAP files | ROS 2 / MCAP tooling |
hevc |
Per-episode HEVC MP4 files | Video analysis pipelines |
Integrity verification
When the Atlas API provides a hash field (SHA256 of the bundle zip), nuuduu sync:
- Verifies the downloaded zip before extracting
- Stores the hash in
.nuuduu/manifest.json - Skips re-download when the local hash matches
nuuduu sync --verify # re-check local bundles without downloading
Library API
| Class / function | Purpose |
|---|---|
NuuduuAtlas |
High-level facade (recommended) |
AtlasClient |
Low-level HTTP API client |
SyncEngine |
Sync and verify engine |
NuuduuConfig |
Config load/save |
resolve_dataset_dir() |
Dataset path resolution |
Exceptions: AuthError, ApiError, IntegrityError, ConfigError, NotFoundError
Progress callbacks for sync:
from nuuduu.types import SyncProgressEvent
def on_progress(event: SyncProgressEvent) -> None:
print(event.phase, event.bytes_done, event.bytes_total)
atlas.sync(on_progress=on_progress)
Troubleshooting
| Problem | Solution |
|---|---|
| HTTP 401 | Run nuuduu auth login — token may have expired |
| Config permission error | Run chmod 600 ~/.config/nuuduu/config.toml |
| Payment required (v1) | Complete payment at https://nuuduu.ai/atlas, then nuuduu sync. Future: in-CLI via nuuduu request |
| SHA256 mismatch | Re-run nuuduu sync to re-download the bundle |
| Request API 404 | nuuduu request API not live yet — CLI shows the destination UX preview |
Development
uv sync --all-extras
uv run pytest
uv build
See CONTRIBUTING.md for release and contribution guidelines.
CI runs on Bitbucket Pipelines for every push and pull request.
Publishing
# Bump version in pyproject.toml and CHANGELOG.md
uv build
git tag v0.1.0 && git push origin v0.1.0 # triggers Bitbucket Pipeline PyPI publish
One-time setup: add a secured PYPI_TOKEN repository variable in
Bitbucket → Repository settings → Pipelines → Repository variables.
Legal
Copyright © 2026 Nuuduu UAB. Licensed under the MIT License.
Nuuduu® is a registered trademark of Nuuduu UAB. All rights reserved. The Nuuduu name and logo may not be used to imply endorsement or affiliation without prior written permission from Nuuduu UAB.
Metadata
Release files for nuuduu 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nuuduu-0.2.0.tar.gz | 19.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nuuduu-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 47.4 kB
Release files / nuuduu-0.2.0.tar.gz
| Download URL | nuuduu-0.2.0.tar.gz |
|---|---|
| Size | 19.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fcb8e74709baa61ce65eb87879ec4f1687f858fa926869532e79c7013c9d1e6b
|
|
BLAKE2b-256 checksum How to use checksums |
f76cd095d25df1c726423dcf96e53fefa6181cc5be3b61ff92f6af1c39d29f16
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / nuuduu-0.2.0-py3-none-any.whl
| Download URL | nuuduu-0.2.0-py3-none-any.whl |
|---|---|
| Size | 28.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
10ff234e38c269b66ec6f10b08bb2df12304d9f4e51f069e28876e8e917550d4
|
|
BLAKE2b-256 checksum How to use checksums |
8ddc8d0c35c8725ff1c311373776c865a1e4c673f0dfdb9ffb101c673deb0913
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|