Real-time Interactive RL Simulation in Your Browser
mjswan is a powerful framework for creating interactive MuJoCo simulations with real-time policy control, running entirely in the browser. Built on top of mujoco wasm, onnxruntime, and three.js, it enables easy sharing of RL simulation demos as static sites, perfect for GitHub Pages hosting.
Check out the demo ― ttktjmt.github.io/mjswan
News
- 2026-08-17: Created mjswan_playground, a collection of mjswan demos
- 2026-08-15: Became mjlab-native, covering most mjlab tasks
- 2026-06-02: Adopted for the MuscleMimic live demo [Demo, X]
- 2026-05-06: Adopted for the GentleHumanoid live demo [Demo, X]
- 2026-04-08: Featured in the MuJoCo README
Features
- Real-time: Run mujoco simulations and policy control in real time.
- Interactive: Change the state of objects by applying forces.
- Cross-platform: Works seamlessly on desktop and mobile devices.
- VR & AR Support: Native WebXR viewer with tracked hands that interact with objects.
- Client-only: All computation runs in the browser. No server for simulation is required.
- Easy Sharing: Host as a static site for effortless demo distribution (e.g., GitHub Pages).
- Portable: Embed the simulation in a web page or Google Colab notebook.
- mjlab-native: Create a web demo of any mjlab tasks with minimal effort.
- Customizable: Visualize your mujoco models and onnx policies quickly.
Quick Start
mjswan can be installed with pip:
pip install mjswan # or 'mjswan[dev]', 'mjswan[examples]'
or with npm:
npm install mjswan
The demos live in examples/, which the wheel does not ship, so run them with the
mjswan CLI from a clone of this repository (after pip install -e '.[examples]'):
mjswan demo # lists the bundled demos
mjswan demo simple # runs the simple demo
The minimum python script for a sanity check:
import os, mujoco, mjswan
model_path = os.path.join(os.path.dirname(mujoco.__file__), "testdata", "model.xml")
mjspec = mujoco.MjSpec.from_file(model_path)
builder = mjswan.Builder()
builder.add_project(name="Sanity Check").add_scene(name="Test Model", spec=mjspec)
app = builder.build()
app.launch()
For detailed instructions, visit the documentation.
Acknowledgments
This project was greatly inspired by the Facet project demo from the research group at Tsinghua University.
It is also built upon the excellent work of zalo/mujoco_wasm, one of the earliest efforts to run MuJoCo simulations in a browser.
License
This project is licensed under the Apache-2.0 License. When using mjswan, please retain attribution notices in the app to help other users discover this project.
Release files for mjswan 0.11.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mjswan-0.11.0.tar.gz | 11.4 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mjswan-0.11.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.0 MB
Release files / mjswan-0.11.0.tar.gz
| Download URL | mjswan-0.11.0.tar.gz |
|---|---|
| Size | 11.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
df3ceb30bbb59da1ce90223fca9cc572cfbfba50d5fa16fb63c13363b0ee4b7f
|
|
BLAKE2b-256 checksum How to use checksums |
3a7d566802859246fa0d41fa007f4a2afc7fd88837188ee3cec22d431d45ea27
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / mjswan-0.11.0-py3-none-any.whl
| Download URL | mjswan-0.11.0-py3-none-any.whl |
|---|---|
| Size | 11.6 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3cda5cbe6c360fb43242fba44ed1add7ed06da051a4f6a4b22b2b7d55f904382
|
|
BLAKE2b-256 checksum How to use checksums |
be9934e1cc30a8cc9b5373877ea5f05aa93a71d2dd9e5cc240d395ff1f8126e8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.19 {"installer":{"name":"uv","version":"0.12.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|