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

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.2
File Size Uploaded
simscope-0.1.2.tar.gz 813.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for simscope 0.1.2
File Interpreter ABI Platform
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}

Release history Release notifications | RSS feed

0.1.3

2 release files

This release

0.1.2 This release

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