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.
Install
Section titled “Install”pip install omniloopPull in only the framework extras you need:
pip install omniloop[sb3] # Stable-Baselines3pip install omniloop[tensorboard] # TensorBoard mirrorpip install omniloop[rerun] # Rerun sinkpip install omniloop[all-integrations] # everything# Requires a Rust toolchain + maturinpip install maturincd omniloop-sdk-python && maturin developBring up the dashboard
Section titled “Bring up the dashboard”-
Start the visualizer — one command replaces the old two-terminal dance:
Terminal window omniloop upFrom 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:5173and points you there, so dashboard changes hot-reload. -
Run a target loop — in a second terminal, start the bundled demo:
Terminal window omniloop demoIt 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. -
Open the dashboard — navigate to the URL
omniloop upprinted: http://localhost:8000 for a pip install, or http://localhost:5173 when the dev server is running.
Drag a slider
Section titled “Drag a slider”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.
What just happened
Section titled “What just happened”┌──────────────┐ shared memory ┌──────────────┐ websocket ┌──────────────┐│ Your Loop │ ◄──────────────────── │ OmniLoop │ ◄───────────────► │ Dashboard ││ (Python) │ telemetry + commands │ Server │ telemetry + │ (React) ││ │ ────────────────────► │ (Starlette) │ mutations │ │└──────────────┘ └──────────────┘ └──────────────┘- Your loop registers variables and publishes telemetry through shared memory (Rust IPC, no sockets in the hot path).
- The server polls the shared-memory channel and rebroadcasts over a WebSocket.
- The dashboard renders the state and sends mutation commands back.
- Mutations arrive in the loop’s next
tick()/wait_if_halted()call — applied instantly.
Plug in your own code
Section titled “Plug in your own code”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.
Useful commands
Section titled “Useful commands”omniloop up # start server + dashboardomniloop up --session my_run # isolated sessionomniloop status # live / stale / absent, plus server healthomniloop doctor # diagnose channel health & publisher collisionsomniloop clean --dry-run # show which stale /dev/shm segments would go
omniloop inspect run.omni # summary of a recorded .omni journalomniloop replay run.omni --events-only # step through what happenedomniloop why run.omni --tick 4350 # the causal chain behind a tickomniloop diff recorded.omni replayed.omni # first tick where two runs disagreeomniloop export-mcap run.omni # export to .mcap (Foxglove, Rerun, ROS 2)
omniloop mcp # MCP server: let an AI agent drive the control planeFull flag and exit-code reference: CLI Reference.