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

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.1
File Size Uploaded
simscope-0.1.1.tar.gz 788.7 kB Details

Built distribution (wheel)

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

Total release size: 1.6 MB

Release files / simscope-0.1.1.tar.gz

Download URL simscope-0.1.1.tar.gz
Size 788.7 kB
Tags Source
SHA-256 checksum
How to use checksums
1acbc376c4dd9ba0c976f8e617e72ffe3d3c3e5dc1977ddde13ef7b87d773217
BLAKE2b-256 checksum
How to use checksums
ef603af32ae8beb5676c406d8b9698833c2e9963e173c59a58b4e9deedc84726
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","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.1-py3-none-any.whl

Download URL simscope-0.1.1-py3-none-any.whl
Size 815.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6ace402ff25c5f7e9cce8ef368212cb13f720055448b3f1deb744194f9e5b826
BLAKE2b-256 checksum
How to use checksums
ba2d24e9d8ce7023bb197f8c08f7ae7c570f69ec181bf95314275f29147e4d2d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","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

0.1.2

2 release files

This release

0.1.1 This release

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