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 … │
└──────────────────┘
The 0.2.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:
| 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 |
| Isaac ROS & accelerated stacks | ros2 pkg prefix <package> in the registered workspace (ISAAC_ROS_WS env → common workspace paths), then the launch file inside that prefix — details |
| Physics engines | PhysX: 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 |
| GR00T | GR00T_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 tools | binaries on PATH (cosmos, ngc, nurec, usdcat, usdchecker, check_urdf) → pip metadata (cosmos_predict1) → Replicator extensions under the Isaac Sim root |
| Teleop | the ROS 2 packages behind the device (teleop_twist_keyboard, teleop_twist_joy / joy, rosbag2) → isaac-sim.xr.vr.sh for XR |
| 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-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.2.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/a6y3ap/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/
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. |
--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 | -h | Show 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
- 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 status|info|memory|doctor|monitor|test · system status|doctor|memory|processes · info · versionConfiguration
Layered YAML config, tool registry with multiple versions, remotes, env vars.
config show|get|set|path|tools|catalogProjects
Scaffold a project, guide installation of missing components, manage robot/scene/task definitions.
init · setup · project · robot|scene list|create|inspect|import|validate · scene capture|reconstruct · taskRuns & Logs
Every long process is a tracked, detached run with logs, status and lifecycle control.
run list|status|logs|attach|stop|pause|resume|delete|inspect · logsSimulation
Run experiment YAMLs headless on Isaac Sim / Isaac Lab / plain Python; pre-flight checks.
sim run|headless|status|check|logs|extensions|stop|pause|resume · lab status|run|train|play|evaluateTraining
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 list|generate|inspect|convert|validate|download · sensor · visionReview
Replay recorded data and attach viewers (RViz 2, Foxglove, Open3D) without rerunning anything.
replay · view rviz|foxglove|open3d|attach|runROS 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 doctorGPU-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 inspectSynthetic Data & Teleop
Generate synthetic data with Isaac Sim Replicator, drive a robot from keyboard/joystick/XR, record demonstrations and replay the bags.
synth status|generate|preview|validate · teleop start|record|stop|replayPhysics & 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|datasetNative & 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|status|check|doctor|runEvery readiness check is designed for pipelines:
caasi doctor -q && caasi nav test --json | jq '.ok' && caasi sim run exp.yaml --name ci-1.