Skip to content

Quickstart

Install OmniLoop, bring up the dashboard, and drag sliders that control a running process — in under 5 minutes.

OmniLoop spans two jobs with one tool: tune the reward and catch the collapse while a policy trains, then keep the same tripwires armed when it runs on the machine. This page is the first one; C++ and Rust are the second.

Terminal window
pip install omniloop

Pull in only the framework extras you need:

Terminal window
pip install omniloop[sb3] # Stable-Baselines3
pip install omniloop[tensorboard] # TensorBoard mirror
pip install omniloop[rerun] # Rerun sink
pip install omniloop[all-integrations] # everything
  1. Start the visualizer — one command replaces the old two-terminal dance:

    Terminal window
    omniloop up

    From a pip install this serves both the telemetry server and the dashboard on :8000. From a repository checkout it additionally starts the Vite dev server on :5173 and points you there, so dashboard changes hot-reload.

  2. Run a target loop — in a second terminal, start the bundled demo:

    Terminal window
    omniloop demo

    It ships in the wheel, so there is nothing to clone. From a checkout you can equally run any of examples/, e.g. python examples/rl/mock_rl_training.py.

  3. Open the dashboard — navigate to the URL omniloop up printed: http://localhost:8000 for a pip install, or http://localhost:5173 when the dev server is running.

The dashboard’s Interactive State Matrix shows sliders for every tunable parameter. Drag learning_rate — you’ll see the mock training loop’s reward_mean react in real time.

That’s it. The loop is running, and you’re editing its live state without restarting it.

┌──────────────┐ shared memory ┌──────────────┐ websocket ┌──────────────┐
│ Your Loop │ ◄──────────────────── │ OmniLoop │ ◄───────────────► │ Dashboard │
│ (Python) │ telemetry + commands │ Server │ telemetry + │ (React) │
│ │ ────────────────────► │ (Starlette) │ mutations │ │
└──────────────┘ └──────────────┘ └──────────────┘
  1. Your loop registers variables and publishes telemetry through shared memory (Rust IPC, no sockets in the hot path).
  2. The server polls the shared-memory channel and rebroadcasts over a WebSocket.
  3. The dashboard renders the state and sends mutation commands back.
  4. Mutations arrive in the loop’s next tick() / wait_if_halted() call — applied instantly.

The fastest path is TrainingLoop — it derives the dashboard schema from your existing config dataclass, and binds each parameter back to the object that actually owns it:

from omniloop import TrainingLoop
loop = TrainingLoop.from_dataclass(
cfg.ppo,
tunable=["entropy_coef", "clip_param", "learning_rate"],
bind={"learning_rate": optimizer}, # writes optimizer.param_groups[*]["lr"]
journal="run.omni",
)
loop.watch_all_nonfinite(True) # freeze on the first NaN, don't crash
for it in range(num_iterations):
with loop.tick():
train_one_iteration(...)
loop.log(reward_mean=r, policy_loss=pl)

If your framework already has a loop you can’t restructure, use a framework adapter instead:

Framework Integration
ROS 2 OmniLoopRosBridge
LeRobot OmniLoopCallback
MuJoCo Built-in MujocoAdapter

An adapter earns its place by answering one of two questions the SDK cannot answer for itself: where is the tick, in a loop you do not own, and where is the variable, in a foreign object model. New adapters are pulled by a named user rather than pushed speculatively.

Terminal window
omniloop up # start server + dashboard
omniloop up --session my_run # isolated session
omniloop status # live / stale / absent, plus server health
omniloop doctor # diagnose channel health & publisher collisions
omniloop clean --dry-run # show which stale /dev/shm segments would go
omniloop inspect run.omni # summary of a recorded .omni journal
omniloop replay run.omni --events-only # step through what happened
omniloop why run.omni --tick 4350 # the causal chain behind a tick
omniloop diff recorded.omni replayed.omni # first tick where two runs disagree
omniloop export-mcap run.omni # export to .mcap (Foxglove, Rerun, ROS 2)
omniloop mcp # MCP server: let an AI agent drive the control plane

Full flag and exit-code reference: CLI Reference.