Caasi v0.3.0 CLI-first orchestration for Isaac Sim, Isaac Lab & the ROS 2 ecosystem

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.

Note

Caasi is an independent open-source project. It is not affiliated with, endorsed by, or an official product of NVIDIA.

Philosophy

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 …            │
                                             └──────────────────┘

The 0.3.0 ecosystem surface sits on the same three verbs. Layers, top to bottom:

┌──────────────────────────────────────┐
│               CAASI CLI              │
│  Commands / Help / Completion / JSON │
└───────────────────┬──────────────────┘
                    │
┌───────────────────▼──────────────────┐
│         Orchestration Layer          │
│  Detect / Configure / Launch         │
│  Connect / Monitor / Stop            │
│  (capability catalog + adapters)     │
└───────────────────┬──────────────────┘
                    │
      ┌─────────────┼─────────────┐
      │             │             │
┌─────▼─────┐ ┌─────▼─────┐ ┌─────▼─────┐
│Simulation │ │ Robotics  │ │   AI/ML   │
└─────┬─────┘ └─────┬─────┘ └─────┬─────┘
      │             │             │
 Isaac Sim        ROS 2       Isaac Lab
 PhysX · Newton   Nav2        PyTorch · Warp
 Replicator       MoveIt 2    GR00T · Cosmos
                  ros2_control TensorRT
                  Isaac ROS · NITROS
                  nvblox · cuMotion

Nothing in the bottom two rows is implemented by Caasi. Each box is reached through a capability — a declarative list of packages, binaries, Python modules, env vars and paths to probe — and an adapter that turns a resolved capability into the command line of the real tool. A new upstream release is a config change, not a code change:

shellcaasi config catalog slam
caasi config set catalog.slam.toolbox.packages '["slam_toolbox"]'

How tools are found

Each ecosystem component is located in a fixed priority order — no imports, no daemons:

ComponentDiscovery order
Isaac Simtool registry (tools.isaacsim) → ISAACSIM_PATH env → common install locations (/opt/isaac-sim*, ~/isaacsim, Omniverse launcher paths) → pip metadata isaacsim
Isaac Labtool registry (tools.isaaclab) → ISAACLAB_PATH env → ~/isaaclab, ~/IsaacLab, ~/workspace/* → pip metadata isaaclab
ROS 2ROS_DISTRO env → scan /opt/ros for setup.bash → ros2 on PATH
Python packages (torch, cv2, …)pip metadata only (importlib.metadata) — never imported
Isaac ROS & accelerated stacksros2 pkg prefix <package> in the registered workspace (ISAAC_ROS_WS env → common workspace paths), then the launch file inside that prefix — details
Physics enginesPhysX: extension globs under the Isaac Sim root (extsPhysics/*physx*, exts/omni.physx*) · Newton: isaac-sim.newton.sh, else pip metadata newton-physics · Warp / MuJoCo: pip metadata · Gazebo: gz / gazebo on PATH
GR00TGR00T_PATH env → ~/Isaac-GR00T, ~/gr00t, ~/workspaces/Isaac-GR00T → pip metadata gr00t; training goes through the repo's own scripts/finetune.py / eval.py / data.py
Cosmos · NuRec · USD toolsbinaries on PATH (cosmos, ngc, nurec, usdcat, usdchecker, check_urdf) → pip metadata (cosmos_predict1) → Replicator extensions under the Isaac Sim root
Teleopthe ROS 2 packages behind the device (teleop_twist_keyboard, teleop_twist_joy / joy, rosbag2) → isaac-sim.xr.vr.sh for XR
GPUsnvidia-smi queries
Containersdocker on PATH, else podman; daemon probed with <tool> info
Remote machinesthe 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-05T14:23:01+08:00  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.

shell# recommended: isolated env, command linked into ~/.local/bin
pipx install caasi
# or into the active environment:
pip install caasi
caasi version
caasi 0.3.0

Both install the caasi console script into the environment's bin/; pipx additionally links it into ~/.local/bin so it is available system-wide for your user (pipx ensurepath if that is not on your PATH). On PEP 668 distros (Ubuntu 23.04+, Debian 12+, Fedora) a bare system-wide pip install is refused — use pipx or a dedicated venv:

shellpython3 -m venv ~/.venvs/caasi && ~/.venvs/caasi/bin/pip install caasi

From source:

shellgit clone https://github.com/7a6172/caasi.git && cd caasi
pip install -e .
# development (adds pytest):
pip install -e ".[dev]"

Upgrade with pipx upgrade caasi or pip install -U caasi. 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/
  artifacts/  logs/  .caasi/
cd ~/experiments/demo && caasi project 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).

OptionShortEffect
--verbose-vEnable verbose output.
--quiet-qSuppress human output (JSON still prints).
--json—Force JSON output for every command that supports it.
--color <mode>—auto (default), always or never; honors NO_COLOR.
--layout <mode>—rich (default, bordered tables) or plain (space-aligned columns); honors CAASI_LAYOUT and layout: in config.yaml.
--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-hShow help for any command or subcommand; caasi help gpu status does the same. The root listing is grouped by topic — CAASI_HELP_ORDER=alpha (or help_order: in config.yaml) gives a flat a–z list, core pins the entry points above it.

Output conventions

The five verbs

One organising principle runs through the whole CLI: every diagnostic-ish command is one of five verbs, each with exactly one job. doctor never absorbs check or audit — they answer different questions. Full walkthrough in Observability.

VerbQuestion it answersScope
doctorWhat's wrong with my environment? (is the machine capable?)machine / toolchain
checkCan this work here? (preflight / compatibility)project ↔ machine, per-domain
testDoes it actually work when executed? (live smoke)per-domain
validateIs this config / data / resource structurally valid?per-domain
auditCan I account for and reproduce what happened?project + runs + environment

inspect is the per-domain deep-dive (env inspect, project inspect, run inspect); setup provisions the machine/toolchain; project manages the robotics project.

The check contract

One check architecture, multiple entry points. Root caasi check orchestrates only the checkers relevant to the project's registered components; domain specialists (sim check, container check, control check) call the same engine for one scope. There is deliberately no caasi check sim alias — root aggregates, a domain specialises. Every entry point emits the same CheckReport (full detail in Environment):

FieldTypeValues / meaning
CheckItem.compatibilityenumcompatible · untested · missing · incompatible
CheckReport.resultenumready · warning · incompatible
CheckReport.scopestringproject / run for the orchestrator; the domain for a specialist
missing / warningsstring[]required-but-absent names · untested-or-needs-attention names

The human report renders each item's compatibility as a rung of a confidence ladder, then collapses to one Result: line — and check exits 3 when that result is incompatible, so it drops straight into CI as a gate:

Ladder rungcompatibilityMeaning
VERIFIEDcompatible (required)A required component is present and known to work.
COMPATIBLEcompatiblePresent and known to work (not strictly required).
UNVERIFIEDuntestedPresent, but this exact version has not been validated against the project.
WARNINGmissingA component was not detected.
INCOMPATIBLEincompatiblePresent, but known not to work here — blocks the launch.

Command map

Environment

Diagnose the machine, pre-flight compatibility, and capture the environment fingerprint; inspect GPUs, OS and versions.

doctor · check · env inspect|fingerprint|lock|compare|show · gpu status|info|memory|doctor|monitor|test · system status|doctor|memory|processes · info · version

Configuration

Layered YAML config, tool registry with multiple versions, remotes, env vars.

config show|get|set|path|tools|catalog

Projects

Scaffold a project, guide installation of missing components, manage robot/scene/task definitions, project config and the lockfile.

init (alias) · setup · project info|validate|add|remove|list|inspect|add-file|config · project robot|scene|task list|create|inspect|validate · project scene capture|reconstruct

Runs & Logs

Every long process is a tracked, detached run with logs, status, a provenance bundle and lifecycle control.

run start|restart|list|status|logs|attach|stop|pause|resume|delete|inspect · start (alias) · logs (alias)

Observability

Watch live runs, aggregate logs, account for the environment with the five verbs, and inspect the provenance bundle every run writes.

monitor --once|--json · logs · audit --fix · run inspect (provenance)

Simulation

Run experiment YAMLs headless on Isaac Sim / Isaac Lab / plain Python; pre-flight checks. Sim lifecycle and logs are now run … --backend sim.

sim run|headless|check|extensions · lab status|run|play|evaluate

Training

Launch headless training and benchmark physics throughput; parse metrics from logs.

train · benchmark start|report

Data & Sensors

Generate, inspect, convert and validate datasets; discover sensors; diagnose the vision stack.

dataset list|generate|inspect|convert|validate|download · sensor · vision

Review

Replay recorded data and attach viewers (RViz 2, Foxglove, Open3D) without rerunning anything.

replay · view rviz|foxglove|open3d|attach|run

ROS Ecosystem

Orchestrate ROS 2, Nav2, MoveIt 2 and ros2_control by delegating to the real ros2 CLI.

ros status|doctor|list|launch|topic|node|graph|service · nav · moveit · control — each with its own doctor

GPU-Accelerated Robotics

Isaac ROS plus functional groups for perception, SLAM, mapping, motion planning and NITROS transport — detected, launched and inspected, never reimplemented.

isaac-ros status|list|doctor|launch · perception · slam · mapping · motion · nitros · pipeline inspect

Synthetic Data & Teleop

Generate synthetic data with Isaac Sim Replicator (the root synth group was folded into dataset generate), drive a robot from keyboard/joystick/XR, record demonstrations and replay the bags.

dataset generate (Replicator via the sdg catalog) · teleop start|record|stop|replay

Physics & Foundation Models

Detect and pick a physics engine launcher, test Warp devices, delegate to the GR00T repo's own scripts, pass through to Cosmos.

physics status|list|run|benchmark · warp status|test|benchmark · groot status|setup|run|train|evaluate · cosmos status|run|dataset

Native & 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 · shell

Remote & Containers

Run experiments on remote GPU machines over SSH and inside official Isaac container images.

remote list|connect|run · container list|status|check|doctor|run
Tip — scripting

Every readiness check is designed for pipelines: caasi doctor -q && caasi nav test --json | jq '.ok' && caasi sim run exp.yaml --name ci-1.