From e600f69515cf27cdc6706d6ee0bd6d30c166282a Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Wed, 10 Jun 2026 22:06:29 -0700 Subject: [PATCH] docs(dashboard): document machine-level multi-profile management - web-dashboard.md: 'Managing multiple profiles' section (switcher, URL deep-links, unified launch, --isolated, scoped Chat, what stays per-profile) + --isolated in the options table - profiles.md: 'From the dashboard' subsection + set-as-active vs switcher clarification - cli-commands.md: --isolated flag + profile-alias launch example --- website/docs/reference/cli-commands.md | 5 +++ .../docs/user-guide/features/web-dashboard.md | 38 +++++++++++++++++++ website/docs/user-guide/profiles.md | 14 +++++++ 3 files changed, 57 insertions(+) diff --git a/website/docs/reference/cli-commands.md b/website/docs/reference/cli-commands.md index 6d99ce6a0b6..abf172e9faf 100644 --- a/website/docs/reference/cli-commands.md +++ b/website/docs/reference/cli-commands.md @@ -1350,6 +1350,7 @@ Launch the web dashboard — a browser-based UI for managing configuration, API | `--host` | `127.0.0.1` | Bind address | | `--no-open` | — | Don't auto-open the browser | | `--insecure` | off | Allow binding to non-localhost hosts. Exposes dashboard credentials on the network; use only behind trusted network controls. | +| `--isolated` | off | When launched from a named profile (`worker dashboard`), run a dedicated per-profile server instead of routing to the machine dashboard. | | `--stop` | — | Stop running `hermes dashboard` processes and exit. | | `--status` | — | List running `hermes dashboard` processes and exit. | @@ -1359,6 +1360,10 @@ hermes dashboard # Custom port, no browser hermes dashboard --port 8080 --no-open + +# From a profile alias — routes to the machine dashboard with the +# profile preselected in the sidebar switcher (attach if running) +worker dashboard ``` ## `hermes profile` diff --git a/website/docs/user-guide/features/web-dashboard.md b/website/docs/user-guide/features/web-dashboard.md index b7518c01b6b..09484de2561 100644 --- a/website/docs/user-guide/features/web-dashboard.md +++ b/website/docs/user-guide/features/web-dashboard.md @@ -28,6 +28,7 @@ This starts a local web server and opens `http://127.0.0.1:9119` in your browser | `--host` | `127.0.0.1` | Bind address | | `--no-open` | — | Don't auto-open the browser | | `--insecure` | off | Allow binding to non-localhost hosts (**DANGEROUS** — exposes API keys on the network; pair with a firewall and strong auth) | +| `--isolated` | off | When launched from a named profile (`worker dashboard`), run a dedicated per-profile server instead of routing to the machine dashboard | ```bash # Custom port @@ -40,6 +41,43 @@ hermes dashboard --host 0.0.0.0 hermes dashboard --no-open ``` +## Managing multiple profiles + +The dashboard is a **machine-level** management surface: one server manages +every [profile](../profiles.md) on the machine. A profile switcher in the +sidebar (visible whenever more than one profile exists) decides which +profile the management pages read and write — Config, API Keys, Skills, +MCP, Models, and the Chat tab all follow it. While a profile other than +the dashboard's own is selected, an amber banner names the managed profile +so the write target is never ambiguous. + +The selection lives in the URL (`?profile=`), so deep links like +`http://127.0.0.1:9119/skills?profile=worker` land with the switcher +preselected and survive refresh. + +Launching the dashboard from a profile alias routes to the machine +dashboard instead of starting a second server: + +```bash +worker dashboard +# → already running: opens the browser at ?profile=worker +# → not running: starts the machine dashboard with "worker" preselected +``` + +Pass `--isolated` to opt out and run a dedicated server scoped to that +profile (the pre-unification behavior — useful if you deliberately expose +different profiles' dashboards with different auth). + +The **Chat** tab follows the switcher too: a scoped chat spawns its PTY +child with the selected profile's `HERMES_HOME`, so the conversation runs +with that profile's model, skills, memory, and session history. Switching +profiles starts a fresh terminal session. + +What stays per-profile and is *not* absorbed by the switcher: gateway +processes (manage them via `hermes -p gateway …`), each profile's +session database, and cron schedulers (the Cron page already aggregates +across profiles with its own filter). + ## Prerequisites The default `hermes-agent` install does not ship the HTTP stack or PTY helper — those are optional extras. The **web dashboard** needs FastAPI and Uvicorn (`web` extra). The **Chat** tab also needs `ptyprocess` to spawn the embedded TUI behind a pseudo-terminal (`pty` extra on POSIX). Install both with: diff --git a/website/docs/user-guide/profiles.md b/website/docs/user-guide/profiles.md index 494e7ec4241..2efb2a9f867 100644 --- a/website/docs/user-guide/profiles.md +++ b/website/docs/user-guide/profiles.md @@ -199,6 +199,20 @@ If you want this profile to work in a specific project by default, also set its coder config set terminal.cwd /absolute/path/to/project ``` +### From the dashboard + +The [web dashboard](features/web-dashboard.md#managing-multiple-profiles) +is a machine-level surface that can manage **any** profile's config, API +keys, skills, MCPs, and model via the profile switcher in its sidebar — no +per-profile dashboard needed. `coder dashboard` routes to the machine +dashboard with the `coder` profile preselected. The dashboard's Chat tab +also follows the switcher, spawning a conversation under the selected +profile's home. + +Note: "Set as active" on the dashboard's Profiles page is the sticky +default for **future CLI/gateway runs** (same as `hermes profile use`) — +to edit a profile from the dashboard, use the switcher instead. + ## Updating `hermes update` pulls code once (shared) and syncs new bundled skills to **all** profiles automatically: