Skip to main content

simscope: record robot simulation rollouts and replay them

CI Docs Python License

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 lean is the player. --ui full is the whole app.
  • Import a .rbundle file 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: ![Rollout](assets/box.html).

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.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for simscope 0.1.3
File Size Uploaded
simscope-0.1.3.tar.gz 825.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for simscope 0.1.3
File Interpreter ABI Platform
simscope-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 1.7 MB

Release files / simscope-0.1.3.tar.gz

Download URL simscope-0.1.3.tar.gz
Size 825.4 kB
Tags Source
SHA-256 checksum
How to use checksums
685f28bd892aeaedceee532b042e2616589fb634d51839a9bc654ee573eb21b0
BLAKE2b-256 checksum
How to use checksums
82d08bfe12a99064f6f00b6c21d4fa12f463b748b0c548a92801e25b5eb4fdd6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.24 {"installer":{"name":"uv","version":"0.12.24","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.3-py3-none-any.whl

Download URL simscope-0.1.3-py3-none-any.whl
Size 856.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
40e25c731d8ca72257053e499a0c838847b8ae3a0411f678e98a872e21b6713e
BLAKE2b-256 checksum
How to use checksums
caac46fcc0e8f5e53a98bab5c51d8504d54737c5fd0038f85714baec77452c2b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.24 {"installer":{"name":"uv","version":"0.12.24","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 history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page