Skip to content

Projects

A .botrail file is the whole cell in one artifact: robots, joint state, obstacles, frames, motions, sequences, signals, sensors, devices, scenarios, the I/O map, and the parts pinned to all of them.

scene.save_project("cell.botrail")
scene = bt.Scene.load_project("cell.botrail")

scene.simulate_sequence("cycle")     # sequences load ready to bake

The format

Plain JSON when everything is self-contained — it diffs in git like any other text. When mesh files are referenced, the project becomes a zip archive (project.json + assets/) with the meshes bundled, so the file stays portable across machines. You don't choose; the saver does.

Robots round-trip by the right mechanism for their source: URDF robots rebuild from the embedded XML (the file is self-contained), USD robots re-import from the referenced stage path (a 100 MB Isaac asset is not copied into every save).

Project or script?

Both capture the cell; they serve different moments.

.botrail project generate_python()
Nature Data — load it back as-is Code — read it, edit it, review it
Meshes Bundled when needed Referenced by path
Best for Handing a cell to someone, save-and-resume Turning studio work into a maintained source file

A comfortable workflow is: build interactively, save_project as you go, and when the cell settles, generate_python() once and make the script the source of truth — with the bake numbers pinned by a regression test.

The studio's Save / Load buttons read and write the same .botrail format, and Export .py is generate_python — the file formats and the UI are the same feature.