# NousResearch/hermes-agent · Dashboard browser-open crash on headless Linux

## Open now

- Nothing open on GitHub.

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.

## TL;DR

- 3 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 1 PR(s) closed without merging.
- A fix was merged to main in PR #24620. Verify it addresses your case.
- **Recommended:** read PR #24620 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `unresolved`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.67`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #24127: \[Bug\]: \`hermes dashboard\` reports success even when the dashboard process exits immediately

## Prior & competing PRs

- **#24620: fix(dashboard): skip browser-open on headless Linux to prevent process exit**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `hermes_cli/web_server.py`, `scripts/release.py`
  - fix hunks:
  - `hermes_cli/web_server.py`

    ```diff
    @@ -4432,11 +4432,33 @@ def start_server(
         if open_browser:
             import webbrowser
     
    -        def _open():
    -            time.sleep(1.0)
    -            webbrowser.open(f"http://{host}:{port}")
    +        # On headless Linux (no DISPLAY or WAYLAND_DISPLAY) some registered
    +        # browsers are TUI programs (links, lynx, www-browser) that try to
    +        # take over the terminal.  That can send SIGHUP to the server process
    +        # and cause an immediate exit even though uvicorn bound successfully.
    +        # Skip the auto-open attempt on headless systems and let the user
    +        # open the URL manually.  macOS and Windows are always considered
    +        # display-capable.
    +        _has_display = (
    +            sys.platform != "linux"
    +            or bool(os.environ.get("DISPLAY"))
    +            or bool(os.environ.get("WAYLAND_DISPLAY"))
    +        )
    +
    +        if _has_display:
    +            def _open():
    +                try:
    +                    time.sleep(1.0)
    +                    webbrowser.open(f"http://{host}:{port}")
    +                except Exception:
    +                    pass
     
    -        threading.Thread(target=_open, daemon=True).start()
    +            threading.Thread(target=_open, daemon=True).start()
    +        else:
    +            _log.debug(
    +                "Skipping browser-open: no DISPLAY or WAYLAND_DISPLAY detected "
    +                "(headless Linux). Pass --no-open to suppress this detection."
    +            )
     
         print(f"  Hermes Web UI → http://{host}:{port}")
         uvicorn.run(app, host=host, port=port, log_level="warning")
    ```
  - `scripts/release.py`

    ```diff
    @@ -146,6 +146,8 @@
         "98612432+Osraka@users.noreply.github.com": "Osraka",
         "112634774+ryptotalent@users.noreply.github.com": "ryptotalent",
         "270097726+hookinglau@users.noreply.github.com": "hookinglau",
    +    "5029547+AllynSheep@users.noreply.github.com": "AllynSheep",
    +    "[redacted:email]": "AllynSheep",
         "[redacted:email]": "novax635",
         "[redacted:email]": "Krionex",
         "rxdxxxx@users.noreply.github.com": "rxdxxxx",
    ```
- **#24129: fix(dashboard): skip browser-open on headless Linux to prevent process exit**. closed without merge
  - maintainer direction: category `merged_via`; implication `superseded`; refs `#24620`

## Fix status

- Merged to main in PR #24620 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-05-12`.
