riggen
The blazingly fast, lightweight robot assembler for RL researchers. Drop meshes in, get a simulation-ready MJCF or URDF out — in a window, or from ten lines of Python.
Install
uv tool install riggen # or: uvx riggen / pip install riggen
riggen --example arm # the bundled sample robot
One wheel per platform (Linux x86_64 / aarch64, macOS arm64 / x86_64,
Windows x86_64), Python 3.10 or later, nothing else to install — the
riggen command is a native executable, import riggen the SDK over the
same core, and there is no Rust toolchain on this path. On a platform
without a wheel, pip install builds the SDK from source with cargo on
PATH and tells you how to get the app (see Python).
The first minute
-
riggen --example armopens a four-part arm: link tree on the left, the viewport in the middle, Properties on the right. Orbit with the middle mouse button, zoom with the wheel,Hometo frame everything. -
Drag the sliders in Window › Joints — the arm moves; that is the kinematic tree you will build for your own robot.
-
File › Export…, pick MJCF, choose a directory. The dialog lists anything that would stop the export (a link with no mass, a joint with no axis) and writes
arm.xmlbesidemeshes/*.stlwhen there is nothing. -
Load it:
python -c "import mujoco; m = mujoco.MjModel.from_xml_path('out/arm.xml'); print(m.nbody, 'bodies')"
or
python -m mujoco.viewer --mjcf out/arm.xml.
Then your robot: riggen base.stl upper.stl fore.stl drops each mesh as a
link under the root (meters or millimetres — the import units are in the
status bar). Reparent by dragging rows in the tree; Place joint puts a
revolute joint on a bore by clicking its edge; Align snaps a part's
bore concentric with its parent's; Properties computes the inertial from
the mesh and a material, and fits a hull or primitives for collision.
What it does
- Assembles: STL and OBJ meshes into a kinematic tree — fixed, revolute and prismatic joints, placed by clicking geometry, with limits.
- Computes: mass, centre of mass and the inertia tensor from the mesh and a material density, or from a spec you type; convex hulls and fitted boxes / cylinders / spheres for collision.
- Exports: MJCF and URDF from the same document, meshes baked to meters as STL, so MuJoCo loads it with zero warnings and its forward kinematics agree with riggen's (that is a CI job, not a hope).
- Imports: an existing URDF,
package://paths resolved beside the file, to fix and convert it. - Stays out of the way: a native window through wgpu, a document that
is plain JSON (
.riggen), undo for everything, and a headless CLI.
Command line
usage:
riggen [FILE...] open a .riggen document, or drop meshes (.stl, .obj) as links
riggen --example arm open the bundled sample arm
riggen --export mjcf|urdf|both --out DIR [--fk-samples] INPUT
write INPUT's export to DIR without opening a window
options:
--example NAME open a bundled example: arm (the five-link sample robot)
--export FORMAT headless export of INPUT (.riggen or .urdf): mjcf, urdf or both
--out DIR where --export writes; created if missing
--fk-samples with --export: also write <name>.fk.json, five sampled joint configurations
--timing print the time from launch to the first frame on stderr
-h, --help print this help
-V, --version print the version and the git commit it was built from
riggen --export needs no display, so it runs in CI and in scripts: give
it a .riggen or a .urdf and it writes the model, the meshes and, with
--fk-samples, five joint configurations with every body's world pose —
the file python/tests/test_mjcf_load.py checks MuJoCo against.
python -m riggen is the same executable, for an environment whose
bin/ is not on PATH.
Python
The same document, the same rules, from a script or a notebook:
uv add riggen # or: pip install riggen — the wheel that has the app has the SDK
import riggen
robot = riggen.Robot("pendulum")
robot.root.add_mesh("base.stl", scale=0.001) # your STL, in millimetres
robot.root.material = "aluminium"
arm = robot.root.add_link(
"arm",
riggen.Revolute("y", origin=(0, 0, 0.5), limits=(-90, 90), degrees=True),
mesh="arm.stl", scale=0.001, material="PLA", # and the part it moves
)
arm.geoms[0].pose = (0, 0, 0.5) # the mesh half a unit above the hinge
robot.export("out", format="mjcf") # out/pendulum.xml + out/meshes/*.stl
Every call is one document edit, checked the way the window checks it: a
duplicate name, a hinge without limits or a link hung under its own child
raises a riggen.EditError subclass and changes nothing. Meters and
radians, Z-up; degrees=True wherever an angle is typed.
robot.fk({"arm_joint": 0.3})["arm"] # Pose((0.0, 0.0, 0.5), rpy=(0.0, 0.3, 0.0))
arm.inertial # Inertial(mass=…, com=…, inertia=…) from the mesh
robot.link("arm").joint.limits = (-1.0, 1.0) # radians; one edit
robot.save("pendulum.riggen") # the window opens this file
Place the joint by hand, keep scripting:
viewer = riggen.show(robot) # the riggen window on a copy; click the bore, Ctrl+S
robot = viewer.wait() # the document as the window saved it
Then MuJoCo:
import mujoco
model = mujoco.MjModel.from_xml_path("out/pendulum.xml")
riggen.load(path) reads a .riggen, riggen.load_urdf(path) an existing
URDF (with packages={"name": "dir"} for package:// paths); export writes
format="urdf" or "both" too, and fk_samples=True adds the five joint
configurations CI compares against MuJoCo. examples/pendulum.py
is the snippet above as a file; examples/arm.py builds
the bundled arm from its four STLs with typed joints — its export is
byte-identical to the app's. Everything is typed (py.typed) and
documented in docstrings: help(riggen.Link).
The wheel is cp310-abi3: one build for every CPython from 3.10 on,
which is why it needs no per-version matrix — and why it does not install
on free-threaded CPython (3.13t / 3.14t) yet. An install from the source
distribution (any other platform) compiles the SDK alone; riggen.show()
and python -m riggen then say how to get the app: a wheel, cargo install --git, or RIGGEN_BINARY pointing at a binary you built.
Developing
Rust stable, then:
git clone https://github.com/Divelix/riggen && cd riggen
git config core.hooksPath .githooks # fmt, clippy -D warnings, test before every commit
cargo run # the app
cargo test --workspace # incl. the visual snapshot suite (needs a Vulkan driver;
# lavapipe / mesa-vulkan-drivers is the reference)
python python/build_wheel.py # the wheel: the app binary + the extension module
A notebook on the dev build, next to the fixtures — the SDK's own venv, the extension installed editable, the app from a local build:
uv venv target/sdk-venv --python 3.12
VIRTUAL_ENV=$PWD/target/sdk-venv uvx maturin develop --uv # rerun after a Rust change (~10 s)
uv pip install --python target/sdk-venv ipykernel mujoco pytest
target/sdk-venv/bin/python -m ipykernel install --user --name riggen-dev --display-name "riggen (dev)"
cargo build --release -p riggen-app && export RIGGEN_BINARY=$PWD/target/release/riggen # for riggen.show()
Put notebooks in scratch/ (gitignored) on the "riggen (dev)" kernel;
anything worth keeping becomes an examples/*.py, which the test suite
runs. The SDK suite itself: target/sdk-venv/bin/python -m pytest python/tests/sdk.
To try a TestPyPI build in a uv project instead, give riggen its own
index — an explicit one, or uv's dependency-confusion guard will find
some other package's old version on TestPyPI and refuse:
[[tool.uv.index]]
name = "testpypi"
url = "https://test.pypi.org/simple/"
explicit = true
[tool.uv.sources]
riggen = { index = "testpypi" }
then uv add "riggen==<version>".
The Rust route to the binary is cargo install --git https://github.com/Divelix/riggen riggen-app; publishing the workspace to
crates.io so that cargo install riggen works is a later release.
Read, in order: SEED.md (what and why),
docs/01-architecture.md,
docs/02-data-model.md,
docs/03-roadmap.md, docs/adr/ — then
AGENTS.md for the rules, agent or human. The SDK's own
tests are python/tests/sdk/ (pytest, against the built wheel).
Licence
MIT or Apache-2.0, at your option.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file riggen-0.2.0.tar.gz.
File metadata
- Download URL: riggen-0.2.0.tar.gz
- Upload date:
- Size: 171.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be6c4511397fd1754ad924a202122be485b1d6a3e98934ccac9da44dee94a7c6
|
|
| MD5 |
2cc1b0540d10f6ea6271e4fc49bb58bf
|
|
| BLAKE2b-256 |
b23057ae239455f435ed7f25a7526a0a1645c02e746d4d86ddb48b00d04fd312
|
Provenance
The following attestation bundles were made for riggen-0.2.0.tar.gz:
Publisher:
release.yml on Divelix/riggen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riggen-0.2.0.tar.gz -
Subject digest:
be6c4511397fd1754ad924a202122be485b1d6a3e98934ccac9da44dee94a7c6 - Sigstore transparency entry: 2650365788
- Sigstore integration time:
-
Permalink:
Divelix/riggen@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Divelix
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Trigger Event:
push
-
Statement type:
File details
Details for the file riggen-0.2.0-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: riggen-0.2.0-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 8.2 MB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
497af108fd52729bd925c9689d153ebf92a97589cc664e6235eccdb6e6ceb3b4
|
|
| MD5 |
0a2383348992fb20810169250e54d090
|
|
| BLAKE2b-256 |
0074cf5ea91d30e646b08c65312d6ac96d4448be2dad6c13a7180619989781cd
|
Provenance
The following attestation bundles were made for riggen-0.2.0-cp310-abi3-win_amd64.whl:
Publisher:
release.yml on Divelix/riggen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riggen-0.2.0-cp310-abi3-win_amd64.whl -
Subject digest:
497af108fd52729bd925c9689d153ebf92a97589cc664e6235eccdb6e6ceb3b4 - Sigstore transparency entry: 2650365805
- Sigstore integration time:
-
Permalink:
Divelix/riggen@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Divelix
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Trigger Event:
push
-
Statement type:
File details
Details for the file riggen-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: riggen-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 10.5 MB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0343378c51e5e6bffe4ea5f3658e5bb142dc6f4301be42b51f17a2e931bbc31
|
|
| MD5 |
71768dd2376f871ba15e4597b240026e
|
|
| BLAKE2b-256 |
c638ded52a68edc1aae82f0f8510d849e7dfcdfbbd618879da7f1b7bdff64e01
|
Provenance
The following attestation bundles were made for riggen-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl:
Publisher:
release.yml on Divelix/riggen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riggen-0.2.0-cp310-abi3-manylinux_2_28_x86_64.whl -
Subject digest:
e0343378c51e5e6bffe4ea5f3658e5bb142dc6f4301be42b51f17a2e931bbc31 - Sigstore transparency entry: 2650365812
- Sigstore integration time:
-
Permalink:
Divelix/riggen@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Divelix
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Trigger Event:
push
-
Statement type:
File details
Details for the file riggen-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: riggen-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 9.9 MB
- Tags: CPython 3.10+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff948b5802352f9aa3aa2cd81e8455e69dabc971ad75451b596e0c6cd2fd861a
|
|
| MD5 |
df38ae638a5ac5bd52b71616c623eecf
|
|
| BLAKE2b-256 |
91c7451148a555de19005e21238d7ea5f0f7b49517857f127f19def85b7a93ad
|
Provenance
The following attestation bundles were made for riggen-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl:
Publisher:
release.yml on Divelix/riggen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riggen-0.2.0-cp310-abi3-manylinux_2_28_aarch64.whl -
Subject digest:
ff948b5802352f9aa3aa2cd81e8455e69dabc971ad75451b596e0c6cd2fd861a - Sigstore transparency entry: 2650365814
- Sigstore integration time:
-
Permalink:
Divelix/riggen@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Divelix
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Trigger Event:
push
-
Statement type:
File details
Details for the file riggen-0.2.0-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: riggen-0.2.0-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.9 MB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab5848d4c22f9b8bf6140c70fbfbbb8f42cab4e6e087c6ae3b38d1f0803469d8
|
|
| MD5 |
add399294478a94b695bef449509da30
|
|
| BLAKE2b-256 |
c1b2b53e907ed409ddbaf1ac27a9308c32c5935f4c8e4f870797b93866128f8d
|
Provenance
The following attestation bundles were made for riggen-0.2.0-cp310-abi3-macosx_11_0_arm64.whl:
Publisher:
release.yml on Divelix/riggen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riggen-0.2.0-cp310-abi3-macosx_11_0_arm64.whl -
Subject digest:
ab5848d4c22f9b8bf6140c70fbfbbb8f42cab4e6e087c6ae3b38d1f0803469d8 - Sigstore transparency entry: 2650365798
- Sigstore integration time:
-
Permalink:
Divelix/riggen@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Divelix
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Trigger Event:
push
-
Statement type:
File details
Details for the file riggen-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: riggen-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 7.4 MB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec369cb56685eba9e6b1faf0825e479a9bba03ef1661511181d9a17698103d8d
|
|
| MD5 |
3fe3ad45a9bf8810593cbabe07bde858
|
|
| BLAKE2b-256 |
ac1f0e5cc1405a8fcbfa5c9b15a7db144abf95c6ea47ecf03c245a45a54d84c0
|
Provenance
The following attestation bundles were made for riggen-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl:
Publisher:
release.yml on Divelix/riggen
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
riggen-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl -
Subject digest:
ec369cb56685eba9e6b1faf0825e479a9bba03ef1661511181d9a17698103d8d - Sigstore transparency entry: 2650365810
- Sigstore integration time:
-
Permalink:
Divelix/riggen@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Divelix
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@a48bf70d400a3b6a75fe5f7b3e9fdec3d856e977 -
Trigger Event:
push
-
Statement type: