# Contributing to Menagerie
We want Menagerie to be a true community-driven effort that continuously
improves and grows over time for the benefit of the entire research community.
As such, we welcome contributions that:
- Fix issues with an existing model
- Improve the realism of a model (e.g. via
[system identification](https://en.wikipedia.org/wiki/System_identification))
- Add an entirely new model
Note that Menagerie follows [Google's Open Source Community Guidelines](https://opensource.google/conduct/).
## How to contribute
Whether you want to fix an issue with an existing model, improve it, or add a
completely new model, please get in touch with us first (ideally _before_
starting work if it's something major) by opening a new
[issue](https://github.com/google-deepmind/mujoco_menagerie/issues).
Coordinating up front makes it much easier to avoid frustration later on.
Once we reach an agreement on the proposed change, please submit a
[pull request](https://github.com/google-deepmind/mujoco_menagerie/pulls) (PR)
so that we can review your implementation.
## Development setup
Everything is wrapped behind three `make` commands. You need
[`uv`](https://docs.astral.sh/uv/) installed — that's the only prerequisite.
```bash
make install # one-time: installs pre-commit and the git hook
make all # run every check CI runs (lint + format + license + XML + tests)
```
After `make install`, the lint/format/license/XML checks fire automatically on
every `git commit`. Before pushing, run `make all` to also execute the (slower)
simulation tests. The two intermediate targets are also exposed if you want
finer control:
| Command | What it runs |
| ------------- | ------------------------------------------------------------- |
| `make check` | Lint + format (ruff), MJCF XML formatting, top-level LICENSE |
| `make test` | `pytest` over every model directory (simulation + structural) |
| `make all` | `make check` followed by `make test` |
CI runs the same things, so a green `make all` locally means a green CI.
## XML style
You can browse existing models to get a general sense of the style we adopt for
our MJCF (XML) files. In no particular order:
- 2-space indentation
- Make generous use of default classes to reduce redundancies in the kinematic tree
- Preserve attribute ordering: compiler, asset and default class definitions
first, then worldbody and actuators, etc.
- Always ship a `scene.xml` that includes the model
Formatting is enforced by `format_xml.py` (called automatically via the
pre-commit hook). The script enforces:
- 2-space indentation
- Double-quoted attribute values
- Self-closing empty elements as `` (no space before the slash)
- Lines wrap at 120 characters; overflow attributes continue at `(depth + 1) * 2` spaces of indent
- Blank lines between sibling elements are preserved
- Multi-line attribute values are collapsed to a single line (XML attribute
value normalization makes them un-recoverable after parsing anyway)
To format on demand:
```bash
uv run format_xml.py --write path/to/file.xml ... # rewrite in place
uv run format_xml.py --check path/to/file.xml ... # exit 1 if not formatted
```
The
[XML Language Support by Red Hat](https://marketplace.visualstudio.com/items?itemName=redhat.vscode-xml)
VS Code extension produces output that is close to (but not always
byte-identical to) `format_xml.py`. Use the script as the source of truth — its
output is what CI checks.
## Changelog & contributors
Please document your changes in the appropriate changelog:
- Repo-wide changes (CI, tooling, documentation, shared infrastructure):
update the [global `CHANGELOG.md`](./CHANGELOG.md)
- Model-specific changes: update the `CHANGELOG.md` in that model's directory
(e.g. `unitree_go1/CHANGELOG.md`)
Then add your name to [`CONTRIBUTORS.md`](./CONTRIBUTORS.md), keeping the list
sorted alphabetically by first name.
## Contributor License Agreement
Contributions to this project must be accompanied by a Contributor License
Agreement (CLA). You (or your employer) retain the copyright to your
contribution; this simply gives us permission to use and redistribute your
contributions as part of the project. Head over to
to see your current agreements on file or to sign a new one.
You generally only need to submit a CLA once, so if you've already submitted
one (even if it was for a different project), you probably don't need to do it
again.