Caasi CLI
Caasi is a lightweight, CLI-first orchestration layer for NVIDIA Isaac Sim, Isaac Lab and the wider robotics ecosystem (ROS 2, Nav2, MoveIt 2, ros2_control, …). It discovers the tools you already have, launches them headlessly, tracks every long-running process as a first-class run, and gives you uniform, scriptable output for all of it.
Caasi is an independent open-source project. It is not affiliated with, endorsed by, or an official product of NVIDIA.
Philosophy
- Use existing software. Don't reinvent it. Caasi discovers, configures, launches, connects, monitors and manages tools that already exist. It never reimplements a simulator, a trainer, or a ROS middleware.
- Simulation is not visualization. Everything runs headless by default;
a viewer (
rviz2, Foxglove, Open3D) is attached only when you ask for it. - Minimum required stack. The CLI process never imports Isaac Sim,
Isaac Lab, PyTorch or rclpy. It stays fast and installs with three small dependencies
(
typer,rich,pyyaml). - Don't become another ROS. ROS orchestration delegates to the real
ros2binary of the distro you already have installed. - Unix-friendly. Small commands,
--jsonoutput everywhere it matters, meaningful exit codes, errors on stderr.
Architecture: delegation, not reimplementation
Caasi is an orchestrator. Every heavy operation is delegated to the real tool, located through a layered discovery process:
┌────────────────────────────────────────────────┐
│ caasi │
│ (typer + rich + yaml — nothing else imported) │
└───────┬──────────────┬──────────────┬──────────┘
│ │ │
discover │ launch │ inspect │
▼ ▼ ▼
┌──────────────────┐ ┌──────────────┐ ┌──────────────────┐
│ tool registry │ │ run manager │ │ real binaries │
│ ~/.config/caasi │ │ ~/.caasi/runs│ │ python.sh │
│ env vars │ │ detached + │ │ isaaclab.sh │
│ common paths │ │ tracked │ │ ros2 · ssh · │
│ pip metadata │ │ processes │ │ docker · nvidia- │
└──────────────────┘ └──────────────┘ │ smi … │
└──────────────────┘
How tools are found
Each ecosystem component is located in a fixed priority order — no imports, no daemons:
| Component | Discovery order |
|---|---|
| Isaac Sim | tool registry (tools.isaacsim) → ISAACSIM_PATH env → common install locations (/opt/isaac-sim*, ~/isaacsim, Omniverse launcher paths) → pip metadata isaacsim |
| Isaac Lab | tool registry (tools.isaaclab) → ISAACLAB_PATH env → ~/isaaclab, ~/IsaacLab, ~/workspace/* → pip metadata isaaclab |
| ROS 2 | ROS_DISTRO env → scan /opt/ros for setup.bash → ros2 on PATH |
| Python packages (torch, cv2, …) | pip metadata only (importlib.metadata) — never imported |
| GPUs | nvidia-smi queries |
| Containers | docker on PATH, else podman; daemon probed with <tool> info |
| Remote machines | the remotes: section of your config; executed via the system ssh client |
Runs: every long process is tracked
Simulations, training jobs, ROS launches, SSH batch jobs and container runs are all
started detached and recorded under ~/.caasi/runs/. The CLI returns
immediately; the run keeps going after you close the terminal. See
Runs & Logs for the full model. The short version:
terminalcaasi sim run experiments/wave.yaml
Run 20260905-142301-wave started in the background.
Follow it with: caasi logs 20260905-142301-wave -f
caasi run list
ID Name Backend Status Created PID
20260905-142301-wave wave sim running 2026-09-05 14:23:01 48213
caasi logs latest -f
[14:23:04] stage loaded, 4096 envs
[14:23:11] step 1000/100000 …
Installation
Requirements: Python 3.10+ on Linux. Nothing else — the Isaac stack, ROS 2, PyTorch etc. are discovered, not installed, by Caasi.
shellgit clone <this repository> caasi && cd caasi
pip install -e .
# development (adds pytest):
pip install -e ".[dev]"
caasi version
caasi 0.1.0
This installs the caasi console command. Shell completion is available:
shellcaasi --install-completion
bash completion installed in /home/you/.bashrc
Quickstart: a first project, end to end
The typical Caasi workflow — diagnose, scaffold, run, follow, review:
1. Check what your machine has
shellcaasi doctor
Environment Diagnostics
── system ──────────────
✓ OS — Ubuntu 24.04.1 LTS
✓ Kernel — 6.8.0-45-generic
── nvidia ──────────────
✓ nvidia-smi — 550.107.02
✓ GPU 0 — NVIDIA GeForce RTX 4090 (24564 MiB)
✓ CUDA — 12.4
── isaac ───────────────
! Isaac Sim — not detected
── ros ─────────────────
✓ ROS 2 distro — jazzy at /opt/ros/jazzy
2 warning(s)
caasi setup
# shows which components are missing and how to install them
2. Scaffold a project
shellcaasi init ~/experiments/demo --name demo
Created project 'demo' at /home/you/experiments/demo
caasi.yaml
robots/ scenes/ tasks/ experiments/ datasets/ runs/
cd ~/experiments/demo && caasi robot create agv -d "Warehouse AGV"
Created robot 'agv' at /home/you/experiments/demo/robots/agv.yaml.
3. Register your Isaac install once
shellcaasi config set tools.isaacsim.versions."6.0".path /opt/isaac-sim-6.0
caasi config set tools.isaacsim.default "6.0"
caasi config tools
Tool Default Versions Resolved path
isaacsim 6.0 6.0 /opt/isaac-sim-6.0
4. Describe an experiment and run it headless
experiments/wave.yamlname: wave
backend: sim # sim | lab | python
script: scripts/wave.py # resolved relative to this YAML
headless: true
args: ["--steps", "10000"]
shellcaasi sim run experiments/wave.yaml
Run 20260905-142301-wave started in the background.
caasi logs latest -f
# Ctrl+C stops following — the run keeps going
caasi run status latest
wave (20260905-142301-wave)
Status succeeded
Backend sim
5. Train, benchmark, collect data, review
shellcaasi train experiments/ant.yaml --steps 500000 --envs 4096
caasi benchmark start experiments/fps.yaml --steps 20000
caasi benchmark report latest
caasi dataset generate experiments/collect.yaml --episodes 100 --record-images
caasi replay latest --viewer rviz
Global options & output conventions
Global options
These belong to the root command and must come before the subcommand
(caasi --json gpu status, not caasi gpu --json status).
| Option | Short | Effect |
|---|---|---|
--verbose | -v | Enable verbose output. |
--quiet | -q | Suppress human output (JSON still prints). |
--json | — | Force JSON output for every command that supports it. |
--config <path> | — | Merge an additional config file (highest precedence). |
--lang <code> | — | Language for messages (only en is bundled). |
--version | — | Print caasi <version> and exit. |
--help | -h | Show help for any command or subcommand. |
Output conventions
- JSON mode — most data commands accept
--json(locally or globally). JSON always goes to stdout, pretty-printed with 2-space indent, and prints even under--quiet. It is safe to pipe intojq. - Errors — handled failures print
Error: <message>in red to stderr and exit1. Errors never emit JSON. - Exit codes —
0success ·1handled failure or a failing readiness check ·2usage error (bad flag, missing argument — Click convention). Readiness commands (doctor,nav test,container check, …) deliberately use the exit code so you can script them:if caasi doctor -q; then …; fi. - Bare groups — invoking a group with no subcommand (
caasi gpu) prints its help and exits 0.
Command map
Environment
Diagnose the machine and the ecosystem; inspect GPUs, OS and versions.
doctor · gpu · system · info · versionConfiguration
Layered YAML config, tool registry with multiple versions, remotes, env vars.
config show|get|set|path|toolsProjects
Scaffold a project, guide installation of missing components, manage robot/scene/task definitions.
init · setup · project · robot · scene · taskRuns & Logs
Every long process is a tracked, detached run with logs, status and lifecycle control.
run list|status|logs|stop|pause|resume|delete|inspect · logsSimulation
Run experiment YAMLs headless on Isaac Sim / Isaac Lab / plain Python; pre-flight checks.
sim run|status|check|stop|pause|resume · lab statusTraining
Launch headless training and benchmark physics throughput; parse metrics from logs.
train · benchmark start|reportData & Sensors
Generate, inspect, convert and validate datasets; discover sensors; diagnose the vision stack.
dataset · sensor · visionReview
Replay recorded data and attach viewers (RViz 2, Foxglove, Open3D) without rerunning anything.
replay · view rviz|foxglove|open3d|attachROS Ecosystem
Orchestrate ROS 2, Nav2, MoveIt 2 and ros2_control by delegating to the real ros2 CLI.
ros · nav · moveit · controlNative & Shell
Escape hatches: run raw python.sh / isaaclab.sh / ros2 commands or open a shell with the environment wired up.
native run|sim|lab|ros · shellRemote & Containers
Run experiments on remote GPU machines over SSH and inside official Isaac container images.
remote list|connect|run · container list|check|runEvery readiness check is designed for pipelines:
caasi doctor -q && caasi nav test --json | jq '.ok' && caasi sim run exp.yaml --name ci-1.