From 83dd66c81e1eedb86f488cc3a3a52bf2443e320f Mon Sep 17 00:00:00 2001 From: Nabla7 Date: Thu, 15 Jan 2026 10:33:06 +0100 Subject: [PATCH] feat: default to rerun-web and auto-open browser on startup (browser does better memory management that OS so until rerun memory leak is fixed this is better) - Changed GlobalConfig.viewer_backend default from rerun-native to rerun-web - WebsocketVisModule now opens dashboard in browser automatically on start - Requested by Jeff --- dimos/core/global_config.py | 2 +- .../web/websocket_vis/websocket_vis_module.py | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/dimos/core/global_config.py b/dimos/core/global_config.py index bfb553a45d..205c38c361 100644 --- a/dimos/core/global_config.py +++ b/dimos/core/global_config.py @@ -33,7 +33,7 @@ class GlobalConfig(BaseSettings): replay: bool = False rerun_enabled: bool = True rerun_server_addr: str | None = None - viewer_backend: ViewerBackend = "rerun-native" + viewer_backend: ViewerBackend = "rerun-web" n_dask_workers: int = 2 memory_limit: str = "auto" mujoco_camera_position: str | None = None diff --git a/dimos/web/websocket_vis/websocket_vis_module.py b/dimos/web/websocket_vis/websocket_vis_module.py index d73844b4ec..d6ecb7096d 100644 --- a/dimos/web/websocket_vis/websocket_vis_module.py +++ b/dimos/web/websocket_vis/websocket_vis_module.py @@ -26,6 +26,7 @@ import threading import time from typing import Any +import webbrowser from dimos_lcm.std_msgs import Bool # type: ignore[import-untyped] from reactivex.disposable import Disposable @@ -57,6 +58,9 @@ logger = setup_logger() +_browser_open_lock = threading.Lock() +_browser_opened = False + class WebsocketVisModule(Module): """ @@ -149,8 +153,20 @@ def start(self) -> None: self._uvicorn_server_thread = threading.Thread(target=self._run_uvicorn_server, daemon=True) self._uvicorn_server_thread.start() - # Show control center link in terminal - logger.info(f"Command Center: http://localhost:{self.port}/command-center") + # Auto-open the appropriate landing page: + # - rerun-web: "/" serves dashboard with Rerun iframe + command center iframe + # - rerun-native: "/" redirects to "/command-center" + url = f"http://localhost:{self.port}/" + logger.info(f"Dashboard: {url}") + + global _browser_opened + with _browser_open_lock: + if not _browser_opened: + try: + webbrowser.open_new_tab(url) + _browser_opened = True + except Exception as e: + logger.debug(f"Failed to open browser: {e}") try: unsub = self.odom.subscribe(self._on_robot_pose)