simscope records robot simulation rollouts and replays ones you already have. It opens a folder of them in the browser and exports any rollout as one HTML file that plays offline.
Install
simscope needs Python 3.12 or newer and uv. It is not on PyPI yet, so work from a clone:
git clone https://github.com/senthurayyappan/simscope
cd simscope
uv sync --extra viewer --extra mujoco
The built browser code is part of the repository, so you do not need Node to use it.
Quickstart
uv run python examples/viewer_demo.py --out rollouts
uv run simscope serve rollouts
uv run simscope ls rollouts
uv run simscope export rollouts box_drop -o box.html
uv run simscope export rollouts box_drop -o box.html --ui full
serve opens http://127.0.0.1:8080. --ui full writes the whole viewer. The default export is the player page.
Example
A recording wraps the simulation loop. This one drops a box and logs its pose, its contact forces, and its height:
import mujoco
import simscope
from simscope import mujoco as smj
model = mujoco.MjModel.from_xml_string(
"<mujoco><worldbody><geom type='plane' size='2 2 0.1'/>"
"<body pos='0 0 1'><freejoint/><geom type='box' size='.1 .1 .1'/></body>"
"</worldbody></mujoco>"
)
data = mujoco.MjData(model)
lib = simscope.Library("rollouts")
with lib.record("drop", scene=smj.scene_from_model(model), dt=0.02) as rec:
smj.add_contacts_stream(rec, model, max_contacts=16)
for _ in range(100):
for _ in range(10):
mujoco.mj_step(model, data)
rec.log(
smj.poses(data),
contacts=smj.contacts(model, data, max_contacts=16),
height=float(data.xpos[1, 2]),
)
Open the rollout. The camera follows the box, the plot shows height, and the timeline marks the landing as a peak in center-of-mass acceleration and a peak in net contact force. Contact forces are drawn as arrows.
For Isaac Lab, use simscope.isaaclab inside that environment: scene_from_env, PoseBuffer, and contacts.
To replay a rollout you already have, point simscope import at a .rbundle file or a Brax HTML page, then serve that folder.
Features
- Browse a folder by date or by group. Search, rate, pin, and add notes.
- Compare up to four rollouts on one clock. Cameras and ground stay aligned.
- The timeline marks peaks in contact force and in center-of-mass acceleration. Add your own markers.
- Follow a body. Switch among iso, front, side, and top. Toggle contacts and collision shapes.
- Export one HTML file.
--ui leanis the player.--ui fullis the whole app. - Import a
.rbundlefile or a Brax HTML page. - Thousands of envs stay interactive. Nearby envs are drawn in full. The rest are simple shapes.
- Put an export on an mkdeck slide:
.
The documentation covers the workflow, the CLI, and the API. Design records why simscope exists and the decisions behind it.
Develop
make install
make check
make test
The developing guide covers the browser build and where to add an adapter or a marker.
Contribute and license
Bug reports and pull requests are welcome, so read CONTRIBUTING.md first.
simscope is Apache 2.0 licensed. Copyright 2026 Senthur Ayyappan. The package also carries three.js, camera-controls, React, Radix, uPlot, Geist, and other libraries under their own licenses, and code adapted from mjviser. See THIRD_PARTY_NOTICES.md.
Metadata
Release files for simscope 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| simscope-0.1.2.tar.gz | 813.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| simscope-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.7 MB
Release files / simscope-0.1.2.tar.gz
| Download URL | simscope-0.1.2.tar.gz |
|---|---|
| Size | 813.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
34735fe61892d7946c50c5a7ba58472ca35a6b591260d02b0c8600af31fd787b
|
|
BLAKE2b-256 checksum How to use checksums |
1b02be6ab4bc31531317636b6dd234cf713fcf4f3592eb770b7c1f837341dc1a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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 / simscope-0.1.2-py3-none-any.whl
| Download URL | simscope-0.1.2-py3-none-any.whl |
|---|---|
| Size | 845.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cbe6a720e6fdd36589f71837f55f5ca927b3dadc86fe31ea0400d556f3c868fe
|
|
BLAKE2b-256 checksum How to use checksums |
c9b056cd1b85b753f7f79682e9e03d394a782d9b84579b181bba675e1121ae08
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.23 {"installer":{"name":"uv","version":"0.12.23","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}
|