{"id":45119182,"url":"https://github.com/hydrowelder/mujoco-mojo","last_synced_at":"2026-06-14T07:00:56.615Z","repository":{"id":334829358,"uuid":"1142937150","full_name":"Hydrowelder/mujoco-mojo","owner":"Hydrowelder","description":"A complete MJCF lifecycle and trial orchestration suite for MuJoCo, powered by Pydantic v2.","archived":false,"fork":false,"pushed_at":"2026-05-28T03:55:53.000Z","size":27068,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-28T04:12:23.919Z","etag":null,"topics":["monte-carlo","mujoco","mujoco-python","robotics"],"latest_commit_sha":null,"homepage":"https://hydrowelder.github.io/mujoco-mojo/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Hydrowelder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-27T02:28:19.000Z","updated_at":"2026-05-28T02:27:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"1533fb0c-567c-41f4-92e8-85ddaeeee548","html_url":"https://github.com/Hydrowelder/mujoco-mojo","commit_stats":null,"previous_names":["hydrowelder/mujoco-mojo"],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/Hydrowelder/mujoco-mojo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hydrowelder%2Fmujoco-mojo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hydrowelder%2Fmujoco-mojo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hydrowelder%2Fmujoco-mojo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hydrowelder%2Fmujoco-mojo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Hydrowelder","download_url":"https://codeload.github.com/Hydrowelder/mujoco-mojo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Hydrowelder%2Fmujoco-mojo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33682998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["monte-carlo","mujoco","mujoco-python","robotics"],"created_at":"2026-02-19T22:34:51.690Z","updated_at":"2026-06-14T07:00:56.607Z","avatar_url":"https://github.com/Hydrowelder.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003cimg alt=\"MuJoCo Mojo\" src=\"https://raw.githubusercontent.com/hydrowelder/mujoco-mojo/master/docs/assets/dark-hero-logo.svg\" style=\"width: 100%\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://pypi.org/project/mujoco-mojo/\" class=\"badge-link\" style=\"text-decoration:none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/pypi/v/mujoco-mojo.svg?cacheSeconds=300\" alt=\"PyPI version\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://pypi.org/project/mujoco-mojo/\" class=\"badge-link\" style=\"text-decoration:none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/pypi/pyversions/mujoco-mojo.svg?cacheSeconds=86400\" alt=\"Python versions\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/Hydrowelder/mujoco-mojo/actions/workflows/release.yml\" class=\"badge-link\" style=\"text-decoration:none;\"\u003e\n    \u003cimg src=\"https://github.com/Hydrowelder/mujoco-mojo/actions/workflows/release.yml/badge.svg?branch=master\" alt=\"Tests \u0026 Release Status\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/astral-sh/ruff\" class=\"badge-link\" style=\"text-decoration:none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\" alt=\"Ruff\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://docs.pydantic.dev/latest/\" class=\"badge-link\" style=\"text-decoration:none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/Pydantic-v2-FF43A1?logo=pydantic\u0026logoColor=white\" alt=\"Pydantic v2\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/Apache-2.0\" class=\"badge-link\" style=\"text-decoration:none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-Apache_2.0-blue.svg\" alt=\"License\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://hydrowelder.github.io/mujoco-mojo/\" class=\"badge-link\" style=\"text-decoration:none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/docs-GitHub_Pages-blue.svg\" alt=\"Documentation\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/Hydrowelder/mujoco-mojo/discussions\" class=\"badge-link\" style=\"text-decoration:none;\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/discussions-GitHub-blue?logo=github\u0026logoColor=white\" alt=\"GitHub Discussions\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://pepy.tech/projects/mujoco-mojo\"\u003e\n    \u003cimg src=\"https://static.pepy.tech/personalized-badge/mujoco-mojo?period=monthly\u0026units=INTERNATIONAL_SYSTEM\u0026left_color=GREY\u0026right_color=BLUE\u0026left_text=downloads%2Fmonth\" alt=\"PyPI Downloads\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nA **complete MJCF lifecycle and trial orchestration suite** for MuJoCo, powered by **Pydantic v2**.\n\n**MuJoCo Mojo** bridges the gap between static XML modeling and large-scale simulation research. It provides a strongly-typed bridge for building models and a robust execution engine for running them at scale.\n\n- **Model:** Build MJCFs via **validated Python objects** allowing for programatic generation.\n- **Scale:** Execute **multi-threaded Monte Carlo trials** with built-in resume logic.\n- **Monitor:** Track progress via a **zero-dependency web dashboard** and persistent logs.\n- **Assess:** Quickly view **interactive results** of a trial in context of others.\n- **Reproduce:** Automatic **environment snapshotting** (`requirements.txt`) for every job.\n\n## Installation\n\nInstall using `uv` (recommended):\n\n```bash\nuv add mujoco-mojo\n```\n\nor with `pip`:\n\n```bash\npip install mujoco-mojo\n```\n\n---\n\n## Features\n\n### MJCF Tools\n\n- **Strongly-Typed Elements:** MJCF components backed by Pydantic v2 for immediate validation.\n- **Semantic Validation:** Early detection of structural errors and attribute mismatches before the engine starts.\n- **MuJoCo Alignment:** Designed to mirror MuJoCo’s XML schema closely (no magic abstractions)\n- **Object Enumerations:** Embedded MuJoCo object mappings to simplify retrieving `mjOBJ` IDs.\n- **Asset Sharing:** Specialized handling of dependency by remapping assets to become shared allows for space efficient execution of complex models\n\n### Runtime Toolkit\n\n- **Forcing Functions:** A library of typed `Load` definitions (spring-dampers, point-to-point forces, friction, and more) that apply themselves including reaction forces.\n- **Proximity Sensing:** Built-in distance and closest-point tracking between sites and bodies, exposed as both telemetry signals and live overlays with no extra instrumentation. Works on concave geometry meshes.\n- **Structured Telemetry:** A single `post`/`track` call records any value into a hierarchical namespace during simulations. This include prebuilt `request` calls for commonly desired values.\n- **Video Recording:** Multi-camera MP4/WebM/GIF capture synced to simulation time, with playback-speed control, force/proximity overlays, on-frame labels, and single-frame snapshots.\n\n### Job Utilities\n\n#### Campaign Orchestration\n\n- **Multi-Threaded Execution:** Single or multi-threaded trial execution\n- **Environment Snapshotting:** Automatically record installed Python packages to `requirements.txt` for job recreation (works with `uv` or `pip`)\n- **Resume Logic:** Resume a previously started job without rerunning previous cases\n- **Robust Logging:** Built in Rich logging for terminal and a rotating file handler for persistent logs and status files for insight on trial progress\n- **Global Overrides:** Force specific values onto distributions via CLI or JSON overrides to test \"golden\" cases.\n\n#### Monte Carlo\n\n- **Reproducible Sampling:** Random draw tools for Monte Carlo or rerun with global variable override\n- End of run summary with metric to help perform a state of health check\n- Support for running jobs with SLURM for distributed compute\n\n\u003e [!TIP]\n\u003e\n\u003e ```bash\n\u003e mujoco-mojo run monte-carlo \\\n\u003e     --generator monte_carlo_test.Experiment.generate \\\n\u003e     --runtime monte_carlo_test.runtime \\\n\u003e     --workdir ./mc_test/ \\\n\u003e     --no-resume \\\n\u003e     --gen-arg 123 \\\n\u003e     --gen-kwarg 'test=1234' \\\n\u003e     --n-trial 10 \\\n\u003e     --n-proc 1\n\u003e ```\n\n#### Optimization\n\n- **Bayesian Search:** Intelligent design space navigation powered by Optuna integration.\n- **Design Variables:** Continuous (`DesignFloat`) and discrete (`DesignCategorical`) parameters evolved by the solver.\n- **Adaptive Refinement:** \"Zoom\" into promising neighborhoods by aggressively shrinking search bounds on resume.\n- **Stochastic Robustness:** Multi-evaluation trials that average scores over different seeds to filter out noisy physics outliers.\n\n\u003e [!TIP]\n\u003e\n\u003e ```bash\n\u003e mujoco-mojo run optimiztion \\\n\u003e     -g sim.generate \\\n\u003e     -r sim.runtime \\\n\u003e     --objective sim.objective \\\n\u003e     --n-trial 400 \\\n\u003e     --n-proc 10 \\\n\u003e     --seed 42 \\\n\u003e     --storage \\\n\u003e     --direction minimize\n\u003e ```\n\n### Dojo Dashboard\n\nA zero-dependency, offline-first web suite for monitoring and analyzing your simulation jobs in real-time.\n\n#### Monitor: Real-Time Oversight\n\n- **Live Progress Tracking:** Dynamic progress bars and color-coded status cards provide a high-level view of your Monte Carlo runs.\n- **Success/Failure Analytics:** Automatic categorization of trials with built-in data integrity checks to identify \"empty\" vs. \"failed\" runs.\n- **Sensory Feedback:** Optional audio cues and visual celebrations let you know exactly when a multi-hour job hits 100%.\n- **Deep-Linked Navigation:** Jump straight from the monitor to any individual trial in the viewer with one click.\n\n#### Mosaic: Advanced Telemetry Analysis\n\n- **High-Fidelity Plotting:** Hardware-accelerated visualization using Plotly.js for seamless zooming and panning through millions of data points.\n- **Dynamic Versus Mode:** Overlay current telemetry against previous trials using an intuitive range-selection slider for instant regression testing.\n- **Regex-Powered Filtering:** Navigate high-dimensional datasets using a \"folder-style\" signal selector with suffix and regex support.\n- **State Persistence \u0026 Sharing:** Every view is captured in a shareable, compressed URL by pasting a link to share your exact configuration.\n- **Pro-Grade Tooling:** Built-in JSON configuration editor, drag-and-drop config restoration, and multi-format exports (SVG, PNG, CSV).\n- **Keyboard-First Design:** Full hotkey support for warping between trials and managing views without leaving the home row.\n\n### Reloaded\n\nA rapid prototyping loop that allows you to modify physics logic and model architecture on the fly without ever closing the visualizer.\n\n- **Module Hot-Reloading:** Recursively reloads local Python modules and MJCF logic, allowing code changes to propagate instantly to the active simulation.\n- **Unified Visualizer Bridge:** Synchronized visualization of custom force and torque vectors across native OpenGL, Viser web interfaces, and video recordings.\n- **Multiple Viewer Backends:** Drive the same reload/sync pipeline through either the native MuJoCo OpenGL viewer or a Viser web viewer.\n- **Interactive Prototyping:** A developer-centric command loop to toggle playback speeds, repeat last commands, watch for file changes and auto-reload, switch telemetry recording on or off mid-session, or trigger \"generation-only\" mode for rapid MJCF debugging.\n- **Live Session Controls:** Adjust the seed and trial number on the fly with `seed \u003cN\u003e` and `trial \u003cN\u003e`, without restarting the loop.\n- **Asset Persistence:** Automatically dumps current MJCF snapshots and model configurations to a workspace directory for post-hoc analysis or version tracking.\n\n\u003e [!TIP]\n\u003e\n\u003e ```bash\n\u003e mujoco-mojo reloaded \\\n\u003e     --generator monte_carlo_test.Experiment.generate \\\n\u003e     --runtime monte_carlo_test.runtime \\\n\u003e ```\n\n---\n\n\u003e [!NOTE]\n\u003e **MuJoCo Mojo** is an independently developed open-source toolbox. It is **not** affiliated with, sponsored by, or endorsed by **Google DeepMind** or the official **MuJoCo** development team.\n\u003e MuJoCo® is a registered trademark of Google LLC. All MJCF schemas and MuJoCo-related terminology used within this project are for compatibility and documentation purposes only.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhydrowelder%2Fmujoco-mojo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhydrowelder%2Fmujoco-mojo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhydrowelder%2Fmujoco-mojo/lists"}