Global configuration

The general block controls FastSim's global behavior: project scanning (auto-register user-defined stereotypes), asset root path mapping (resolves root_key:// paths), cache directory (remote / platform asset cache), logging system (terminal output, file logging, rotation), and profiling.

Source: fastsim/configs/general_cfg.py (GeneralConfig)

Field reference

FieldTypeDefaultDescription
scan_projectboolfalseScan user project on startup, auto-register custom stereotypes
root_pathsdict[str, str]{}Asset root path map; key is the prefix used in root_key:// protocol
cache_dirstrnullAsset cache directory (for remote / platform assets); null = use JOYSIM_CACHE_DIR env var, fallback to ~/.joysim_cache
silenced_loggerslist[str]["isaaclab", "omni", "carb", "curobo"]List of third-party logger names to silence
log_to_terminalbooltrueWhether to output logs to the terminal
log_terminal_levelstrDEBUGTerminal log level (DEBUG / INFO / WARNING / ERROR / CRITICAL)
log_output_dirstrnullLog file output directory; null disables file logging
log_output_namestrnullLog file name (without extension); null = auto-generated
log_file_levelstrDEBUGFile log level
log_file_formatstrtextLog file format: text / json
log_file_max_size_mbfloat10.0Max single log file size in MB
log_file_backup_countint5Number of rotated log file backups to retain
enable_profilingboolfalseEnable per-step profiling
profiling_outlier_threshold_msfloat500.0Profiling outlier threshold in ms

Validation rule: Each path in root_paths must be an existing local directory; validate_root_paths() raises on startup otherwise.

Asset path resolution

Path fields in configs (asset_path, hdf5_path, backend_root_path, etc.) are resolved through Asset.resolve_url_path() (source: fastsim/utils/asset.py). Five formats are supported:

FormatExampleDescription
Absolute path/data/robots/ur5.usdUsed as-is
Relative path./assets/cube.usdRelative to current working directory
root_key:// protocolassets://robots/ur5.usdassets maps to root_paths["assets"], then concatenated
Remote URLhttps://example.com/ur5.usdAuto-downloaded and cached under cache_dir
platform:// protocolplatform://object/<asset_name> or platform://<cfs_path>Pulled from the FastSim asset platform and cached

root_key:// is the most recommended pattern — it centralizes machine-specific paths in general.root_paths, leaving the rest of the config purely logical and easy to share across machines and users.

platform:// provides a unified entry point for cross-team asset sharing, with auth and on-demand download handled by joysim/utils/platform/. See the dedicated section below.

Asset platform remote access (platform://)

The FastSim asset platform (default https://assets.fastsim.hofee.cn) is a centralized remote asset repository with version-managed storage of five asset categories: objects, robots, scenes, workspaces, and materials. The platform:// protocol is the unified entry point — at runtime it handles authentication, streaming download, and local caching automatically.

Source: joysim/utils/platform/ (PlatformClient + PlatformFetcher)

URL format

platform:// supports two reference forms:

FormFormatExample
Asset formplatform://<category>/<asset_ref>[/<subpath>]platform://objects/can_016/Aligned.usd
Path formplatform://<cfs_relative_path>platform://objects/omni6DPose/can/can_016/Aligned.usd
  • <category>: asset category — must be one of object / robot / scene / workspace / material
  • <asset_ref>: asset name (e.g. can_016) or UUID
  • <subpath>: file inside the asset directory; if omitted, the whole asset folder is returned
  • For path form, <cfs_relative_path> is the full path under the platform CFS root (default: cfs://cfs-1205-dongjiang-bt/simstudio/assets/)

Authentication

Configure auth via env vars (choose one):

Option 1: direct Token (recommended)

bash
export FASTSIM_TOKEN=<your-token>

Suitable for CI/CD and Docker images. Get the token from the platform's "Profile" page.

Option 2: username + password (auto-renewing)

bash
export JOYSIM_PLATFORM_USERNAME=<your-username>
export JOYSIM_PLATFORM_PASSWORD=<your-password>

Auto-logs in on each simulation start; on token expiry (401 response), automatically re-authenticates.

Optional environment variables

Env varDefaultDescription
FASTSIM_TOKENBearer token to use directly
JOYSIM_PLATFORM_USERNAMEUsername for auto-login
JOYSIM_PLATFORM_PASSWORDPassword for auto-login
JOYSIM_PLATFORM_BASE_URLhttps://assets.fastsim.hofee.cn/apiCustom platform host (for private deployments)
JOYSIM_PLATFORM_CFS_ROOTcfs://cfs-1205-dongjiang-bt/simstudio/assets/Custom CFS root path
JOYSIM_CACHE_DIR~/.joysim_cacheAsset cache directory (also configurable via general.cache_dir)

Env var takes precedence over general.cache_dir.

YAML usage

To load an entity from the asset platform, set its source to platform and asset_path to a platform:// URL:

yaml
scene:
  name: pick_and_place
  base_config:
    name: workspace
    stereotype: usd
    source: platform
    asset_path: platform://scenes/kujiale/827310_home/workspace_00.usd

  object_cfg_dict:
    can_016:
      stereotype: rigid
      source: platform
      asset_path: platform://objects/omni6DPose/can/can_016/Aligned.usd
      scale: [0.001, 0.001, 0.001]
      position: [0.0, -3.79, 0.5]

    plug_001:
      stereotype: rigid
      source: platform
      asset_path: platform://objects/omni6DPose/plug/plug_001/Aligned.usd

How it works

  1. First request: calls GET /assets/{category}/{asset_id} to fetch metadata (uuid / cfs_uri / size), then streams the entire asset directory as a zstd-compressed tar via GET /files/tar?uri=<cfs_uri> and extracts it into the local cache.
  2. Cache hit: subsequent loads of the same asset read from local cache — zero network requests.
  3. Integrity check: a .joysim_complete sentinel file marks complete downloads, and .joysim_meta.json records metadata. Interrupted downloads are detected on next start and re-fetched.
  4. Concurrency-safe: when multiple processes request the same asset, only one downloads it; others wait for completion and read from cache — no duplicate downloads.

Cache directory layout

text
~/.joysim_cache/
└── platform/
    ├── object/
    │   └── <uuid>/
    │       ├── .joysim_complete         # download-complete sentinel
    │       ├── .joysim_meta.json        # metadata (asset_id / cfs_uri / mtime)
    │       ├── Aligned.usd
    │       ├── textures/
    │       └── materials/
    ├── robot/
    │   └── <uuid>/...
    ├── scene/
    └── files/                            # path-form URL cache
        └── <md5(folder_uri)>/...

Asset-form URLs are indexed by UUID; path-form URLs by MD5 of the folder URI. Each asset directory is downloaded as one tar, so USD relative-path references resolve naturally inside.

Troubleshooting

IssueCause / Resolution
PlatformAuthError: Missing FASTSIM_TOKEN ...Auth env vars not set; configure token or username/password as above
Persistent 401 UnauthorizedToken expired or wrong password; log in via browser and refresh FASTSIM_TOKEN
404 for <category>/<asset_id>Asset name/UUID does not exist; check that the asset is in the expected category on the platform
Slow downloadsCheck that JOYSIM_CACHE_DIR is on a fast disk; concurrent requests for the same asset share a single download
Force re-downloadDelete ~/.joysim_cache/platform/<category>/<uuid>/

Configuration example

yaml
general:
  scan_project: true
  root_paths:
    assets: /home/user/robot_assets
    datasets: /home/user/datasets
  cache_dir: /var/cache/joysim
  log_to_terminal: true
  log_terminal_level: INFO
  log_output_dir: ./logs
  enable_profiling: false

Resolution effect:

yaml
# assets://robots/ur5.usd → /home/user/robot_assets/robots/ur5.usd
# datasets://runs/run001  → /home/user/datasets/runs/run001
robot_cfg_dict:
  arm:
    asset_path: assets://robots/ur5.usd

extension:
  extension_cfg_dict:
    record:
      backend_root_path: datasets://runs/run001

Profiling

When enable_profiling is true, FastSim records per-step time consumption (command execution, physics step, post-process callbacks, etc.) and prints a summary at simulation end, including average step time and any frame exceeding profiling_outlier_threshold_ms.