Caasi v0.1.0 Configuration: files, precedence, tool registry, environment variables

Configuration

Caasi is configured with layered YAML files. There is no database, no daemon and nothing hidden: caasi config show always prints exactly what the CLI will use, and every command reads the same merged result.

Config files & precedence

Four file locations are merged, lowest precedence first:

#SourceLocationPurpose
1Built-in defaultscompiled into CaasiSane starting point (see below).
2Global config~/.config/caasi/config.yaml
(or $XDG_CONFIG_HOME/caasi/config.yaml)
Your machine: tool registry, paths, remotes.
3Project config./caasi.yaml (current directory)Per-project overrides. Inside a project this is also the project marker file — see Projects.
4CAASI_CONFIGany path from the env varCI / experiment-specific config.
5--config <path>any path from the flagHighest precedence, one-shot override.

Merging is a recursive dict merge: a project file that sets one key under tools: does not wipe the rest of the global registry. After merging, the CAASI_LANG environment variable (if set) overrides language.

Malformed files

A config file that is unreadable, invalid YAML, or whose top level is not a mapping is silently treated as empty. If your settings seem ignored, run caasi config path and caasi config show.

Built-in defaults

language: en
defaults:
  output: table
paths:
  runs: ~/.caasi/runs          # where tracked runs live
  datasets: ~/.caasi/datasets  # where generated datasets go
tools: {}                      # the tool registry (see below)

A complete global config example

# ~/.config/caasi/config.yaml
language: en
paths:
  runs: /data/caasi-runs        # big disk for logs and artifacts
tools:
  isaacsim:
    default: "6.0"
    versions:
      "6.0": { path: /opt/isaac-sim-6.0 }
      "5.1": { path: /opt/isaac-sim-5.1 }
  isaaclab:
    versions:
      "2.0": { path: /opt/IsaacLab, python: /opt/IsaacLab/_isaac_sim/python.sh }
remotes:
  gpu-box:
    host: 10.0.0.5
    user: robot
    port: 2222
    identity: ~/.ssh/id_ed25519
    path: ~/experiments          # remote working directory

The tool registry

The registry is how you tell Caasi where your installs are — and which version to use when you have several side by side (very common with Isaac Sim). It lives under the top-level tools: key.

Multi-version form

tools:
  isaacsim:
    default: "6.0"              # which version commands resolve to
    versions:
      "6.0": { path: /opt/isaac-sim-6.0 }
      "5.1": { path: /opt/isaac-sim-5.1, python: /opt/isaac-sim-5.1/python.sh }

Single-install form

tools:
  isaaclab:
    path: /opt/IsaacLab
    python: /opt/IsaacLab/_isaac_sim/python.sh   # optional interpreter override

How a tool is resolved

  1. With the multi-version form, the requested version is used; without one, default; without a default, the first version key in file order.
  2. Version keys are compared as strings, so a float 6.0 default matches the key "6.0". Quoting version keys in YAML is recommended.
  3. Resolution produces {name, version, path, python}; commands then derive their launchers from path: Isaac Sim → <path>/python.sh, Isaac Lab → <path>/isaaclab.sh (unless python is set).

Set registry entries with dotted keys (quote version segments):

shellcaasi config set tools.isaacsim.versions."6.0".path /opt/isaac-sim-6.0
Set tools.isaacsim.versions."6.0".path = /opt/isaac-sim-6.0 (saved to /home/you/.config/caasi/config.yaml)
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

Registry vs. environment variables

If a tool is not in the registry, Caasi falls back to detection (ISAACSIM_PATH/ISAACLAB_PATH env vars, common install locations, pip metadata — see Architecture). The registry always wins when present, and is the only way to manage multiple versions.

Remotes

The remotes: section defines SSH machines for the remote commands:

remotes:
  <name>:
    host: 10.0.0.5            # required — entries without host are ignored
    user: robot               # optional
    port: 2222                # optional
    identity: ~/.ssh/id_ed25519  # optional, ~ is expanded
    path: ~/experiments       # optional remote working directory

Commands accept the exact name or any unique prefix (caasi remote run gpu nvidia-smi matches gpu-box when unambiguous). Caasi only builds ssh command lines — keys, agents and ~/.ssh/config are honored because the system ssh client does the work.

caasi config

Inspect and edit the configuration from the command line.

caasi config show

caasi config show [--json]

Prints the merged effective configuration (human mode renders YAML; --json emits the same object). This is the ground truth of what Caasi will do.

shellcaasi config show
language: en
defaults:
  output: table
paths:
  runs: ~/.caasi/runs
  datasets: ~/.caasi/datasets
tools:
  isaacsim:
    default: '6.0'
    versions:
      '6.0':
        path: /opt/isaac-sim-6.0

caasi config get

caasi config get KEY

Reads one dotted key. Dicts and lists are printed as YAML, scalars as plain text. A missing (or null) key exits 1 with Error: Key '<key>' is not set.

shellcaasi config get paths.runs
~/.caasi/runs
caasi config get tools.isaacsim.versions
'6.0':
  path: /opt/isaac-sim-6.0

caasi config set

caasi config set KEY VALUE

caasi config path

caasi config path

Shows the four possible sources, which of them are active, and the effective merge order — the fastest way to debug “why is my setting ignored?”.

shellcaasi config path
  ✓ --config                     (not set)
  ✓ CAASI_CONFIG                 (not set)
  ✓ Global config file           /home/you/.config/caasi/config.yaml
  • Project config file          ./caasi.yaml
Effective sources in merge order:
  /home/you/.config/caasi/config.yaml

caasi config tools

caasi config tools [--json]

Lists every registered tool with its default version, all versions, and the resolved {version, path, python} (or null when unresolvable). With no registry entries it prints a usage hint. Always exits 0.

shellcaasi config tools --json | jq '.isaacsim.resolved'
{
  "version": "6.0",
  "path": "/opt/isaac-sim-6.0",
  "python": null
}

Environment variables

Consumed by Caasi

VariableEffect
CAASI_CONFIGPath to an extra config file (merged above global/project).
CAASI_LANGOverrides language after merging (e.g. en).
XDG_CONFIG_HOMERelocates the global config dir ($XDG_CONFIG_HOME/caasi/config.yaml).
ISAACSIM_PATHFallback Isaac Sim location when the registry has none.
ISAACLAB_PATHFallback Isaac Lab location when the registry has none.
ROS_DISTROSelects the ROS 2 distro (otherwise /opt/ros is scanned).
RMW_IMPLEMENTATIONReported by caasi ros status (not modified).

Produced for child processes

Caasi sets these in the environment of everything it launches — your scripts can rely on them:

VariableSet byContent
CAASI_EXPERIMENTsim run, train, benchmark start, dataset generateAbsolute path of the experiment YAML.
ISAACSIM_PATH / ISAACLAB_PATHsim run, train, … (sim/lab backends)Resolved install path.
CAASI_DATASET_DIRdataset generateDataset directory the script should write into (also passed as --dataset-dir).
CAASI_RUN_DIRreplay, view attachRun directory for the viewer.
CAASI_REPLAY_SPEED, CAASI_REPLAY_EPISODEreplayReplay parameters exported to the viewer.
Tip — CI

Feed a per-job config without touching the machine setup: CAASI_CONFIG=ci/caasi-gpu.yaml caasi sim run exp.yaml, or caasi --config ci/caasi-gpu.yaml sim run exp.yaml for highest precedence.