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
| Field | Type | Default | Description |
|---|---|---|---|
scan_project | bool | false | Scan user project on startup, auto-register custom stereotypes |
root_paths | dict[str, str] | {} | Asset root path map; key is the prefix used in root_key:// protocol |
cache_dir | str | null | Asset cache directory (for remote / platform assets); null = use JOYSIM_CACHE_DIR env var, fallback to ~/.joysim_cache |
silenced_loggers | list[str] | ["isaaclab", "omni", "carb", "curobo"] | List of third-party logger names to silence |
log_to_terminal | bool | true | Whether to output logs to the terminal |
log_terminal_level | str | DEBUG | Terminal log level (DEBUG / INFO / WARNING / ERROR / CRITICAL) |
log_output_dir | str | null | Log file output directory; null disables file logging |
log_output_name | str | null | Log file name (without extension); null = auto-generated |
log_file_level | str | DEBUG | File log level |
log_file_format | str | text | Log file format: text / json |
log_file_max_size_mb | float | 10.0 | Max single log file size in MB |
log_file_backup_count | int | 5 | Number of rotated log file backups to retain |
enable_profiling | bool | false | Enable per-step profiling |
profiling_outlier_threshold_ms | float | 500.0 | Profiling 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:
| Format | Example | Description |
|---|---|---|
| Absolute path | /data/robots/ur5.usd | Used as-is |
| Relative path | ./assets/cube.usd | Relative to current working directory |
root_key:// protocol | assets://robots/ur5.usd | assets maps to root_paths["assets"], then concatenated |
| Remote URL | https://example.com/ur5.usd | Auto-downloaded and cached under cache_dir |
platform:// protocol | platform://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:
| Form | Format | Example |
|---|---|---|
| Asset form | platform://<category>/<asset_ref>[/<subpath>] | platform://objects/can_016/Aligned.usd |
| Path form | platform://<cfs_relative_path> | platform://objects/omni6DPose/can/can_016/Aligned.usd |
<category>: asset category — must be one ofobject/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)
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)
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 var | Default | Description |
|---|---|---|
FASTSIM_TOKEN | — | Bearer token to use directly |
JOYSIM_PLATFORM_USERNAME | — | Username for auto-login |
JOYSIM_PLATFORM_PASSWORD | — | Password for auto-login |
JOYSIM_PLATFORM_BASE_URL | https://assets.fastsim.hofee.cn/api | Custom platform host (for private deployments) |
JOYSIM_PLATFORM_CFS_ROOT | cfs://cfs-1205-dongjiang-bt/simstudio/assets/ | Custom CFS root path |
JOYSIM_CACHE_DIR | ~/.joysim_cache | Asset 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:
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
- 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 viaGET /files/tar?uri=<cfs_uri>and extracts it into the local cache. - Cache hit: subsequent loads of the same asset read from local cache — zero network requests.
- Integrity check: a
.joysim_completesentinel file marks complete downloads, and.joysim_meta.jsonrecords metadata. Interrupted downloads are detected on next start and re-fetched. - 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
~/.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
| Issue | Cause / Resolution |
|---|---|
PlatformAuthError: Missing FASTSIM_TOKEN ... | Auth env vars not set; configure token or username/password as above |
Persistent 401 Unauthorized | Token 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 downloads | Check that JOYSIM_CACHE_DIR is on a fast disk; concurrent requests for the same asset share a single download |
| Force re-download | Delete ~/.joysim_cache/platform/<category>/<uuid>/ |
Configuration example
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:
# 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.