onescope
A viewer for deterministic libraries. Open a scene, snapshot or replay, or attach to a running program, and watch the world: scrub its history, inspect any entity, compare runs, and fork from any frame to poke at it.
Open source, MIT or Apache-2.0, made by Recursive AI. Version 1.0.0 is on NuGet, for .NET 10. One shell, one module per library; the onephysics and onepath modules are bundled. Everything the window does is also a command-line operation and a Model Context Protocol tool, so an agent can drive it the same way.
A quick look
Open a replay headless, seek to a step, inspect the world and capture a frame. Each operation prints its result as one line of JSON.
The frame is from a run of the 1.0.0 tool from NuGet on a 240-step onephysics replay: five balls on the ground at step 120, in a 2D and a 3D view, with the inspector, the timeline and the event log. Getting started has the program that recorded it and the full output.
onescope open run.oppr --headless \ --run 'seek {"step":120}' \ --run 'inspect {"entity":1}' \ --run 'capture_frame {"path":"frame.png"}'
A step index, and the library’s own hash
From the README:
Time is a step index. Seeking to step k lands on exactly the state that playing straight to k gives, however you got there, and the world hash it reports is the library’s own. A fork re-simulates from the original’s bits, records each poke into its own replay, and shows where it diverges. The original file and the running program are never changed.
What it does
Scrub and inspect
An entity tree, an inspector, 2D and 3D scene views, and a timeline with a track per source, plus an event log and a compare panel.
Fork and poke
Fork any source at any step, poke the fork, step it, and find where it diverges. Forks hang below the timeline as branches; in a window, drag a body in a fork to poke it.
Compare
A fork against its original, or two versions of a library on one replay, each module in its own load context.
Watch a running program
A host calls RecursiveAI.OneScope.Probe once, and the shell attaches to its live stream. The probe never blocks or throws into the host.
Headless and scriptable
Every operation takes and returns JSON, from the window, the command line or the Model Context Protocol. Headless captures are byte-identical from run to run on one renderer.
Add a library
A module built on RecursiveAI.OneScope.Sdk describes a world as data. The library never depends on onescope; the module lives in the library’s repository.
Drive it over the Model Context Protocol
onescope open <file> --live <socket> serves the operations on a Unix socket, and onescope mcp --socket <socket> bridges it to stdio. The README’s client configuration:
{ "mcpServers": { "onescope": { "command": "onescope", "args": ["mcp", "--socket", "/tmp/onescope.sock"] } } }
Status and packages
- Tool
RecursiveAI.OneScope.Tool: theonescopecommand and shell, a onegame program. A window on Linux, macOS and Windows, or headless. - Bundled modules
RecursiveAI.OnePhysics.Scope1.1.0 for onephysics 1.0.0, andRecursiveAI.OnePath.Scope1.0.0 for onepath 1.2.0. Other modules load from a path with--module. - Sdk
RecursiveAI.OneScope.Sdk: the module contract, the draw list and the time model. BCL only; AOT and trim safe. - Probe
RecursiveAI.OneScope.Probe: what a host calls to stream a replay. BCL only; AOT, trim and WebAssembly safe. - Attach
RecursiveAI.OneScope.Attach: the viewer side of a probe, and the.oscopesession file. BCL only. - Status
1.0.0, all four packages: the first stable release. Earlier versions were 0.x previews.
- .NET
.NET 10, C#. MIT or Apache-2.0.