{"repo":"NousResearch/hermes-agent","public_id":"24127","display_label":"Dashboard browser-open crash on headless Linux","summary":"These items address a bug where running `hermes dashboard` on headless Linux environments causes the process to exit immediately while still reporting success. The fix skips the browser-open step in such environments to prevent the premature exit.","subsystem":null,"counts":{"members":3,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":24620,"merged_at":"2026-05-12T23:38:15+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-05-12T23:38:15+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":24127,"pr_number":24620,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-05-12T23:38:15+00:00"}],"members":[{"kind":"issue","number":24127,"title":"[Bug]: `hermes dashboard` reports success even when the dashboard process exits immediately","url":null,"state":"closed"},{"kind":"pr","number":24129,"title":"fix(dashboard): skip browser-open on headless Linux to prevent process exit","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#24620","number":24620}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":24620,"title":"fix(dashboard): skip browser-open on headless Linux to prevent process exit","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/web_server.py","scripts/release.py"],"fix_hunks":[{"file":"hermes_cli/web_server.py","hunks":["@@ -4432,11 +4432,33 @@ def start_server(\n     if open_browser:\n         import webbrowser\n \n-        def _open():\n-            time.sleep(1.0)\n-            webbrowser.open(f\"http://{host}:{port}\")\n+        # On headless Linux (no DISPLAY or WAYLAND_DISPLAY) some registered\n+        # browsers are TUI programs (links, lynx, www-browser) that try to\n+        # take over the terminal.  That can send SIGHUP to the server process\n+        # and cause an immediate exit even though uvicorn bound successfully.\n+        # Skip the auto-open attempt on headless systems and let the user\n+        # open the URL manually.  macOS and Windows are always considered\n+        # display-capable.\n+        _has_display = (\n+            sys.platform != \"linux\"\n+            or bool(os.environ.get(\"DISPLAY\"))\n+            or bool(os.environ.get(\"WAYLAND_DISPLAY\"))\n+        )\n+\n+        if _has_display:\n+            def _open():\n+                try:\n+                    time.sleep(1.0)\n+                    webbrowser.open(f\"http://{host}:{port}\")\n+                except Exception:\n+                    pass\n \n-        threading.Thread(target=_open, daemon=True).start()\n+            threading.Thread(target=_open, daemon=True).start()\n+        else:\n+            _log.debug(\n+                \"Skipping browser-open: no DISPLAY or WAYLAND_DISPLAY detected \"\n+                \"(headless Linux). Pass --no-open to suppress this detection.\"\n+            )\n \n     print(f\"  Hermes Web UI → http://{host}:{port}\")\n     uvicorn.run(app, host=host, port=port, log_level=\"warning\")"]},{"file":"scripts/release.py","hunks":["@@ -146,6 +146,8 @@\n     \"98612432+Osraka@users.noreply.github.com\": \"Osraka\",\n     \"112634774+ryptotalent@users.noreply.github.com\": \"ryptotalent\",\n     \"270097726+hookinglau@users.noreply.github.com\": \"hookinglau\",\n+    \"5029547+AllynSheep@users.noreply.github.com\": \"AllynSheep\",\n+    \"[redacted:email]\": \"AllynSheep\",\n     \"[redacted:email]\": \"novax635\",\n     \"[redacted:email]\": \"Krionex\",\n     \"rxdxxxx@users.noreply.github.com\": \"rxdxxxx\",\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}