From 2490181055f3b0b2f45cde6514c8c738f5be2414 Mon Sep 17 00:00:00 2001 From: iris Date: Mon, 31 Aug 2026 10:33:57 +0200 Subject: [PATCH 1/4] H0M3: remove Forge/Matrix tiles from hive home mara (issue #3816): remove the swarm-service links (forge, matrix) from the hive home hub. Both surfaces are still reachable directly (forge's own public URL, /matrix/); they just no longer get a tile on H0M3. Dropped the now-dead reveal/href-fill logic in home.js and updated the two docs that described the old gating. --- docs/web-ui/README.md | 5 ++-- docs/web-ui/dashboard.md | 29 ++++++++-------------- frontend/packages/dashboard/src/home.js | 25 ++----------------- frontend/packages/dashboard/src/index.html | 29 +++------------------- frontend/packages/dashboard/src/tabs.js | 4 +-- 5 files changed, 19 insertions(+), 73 deletions(-) diff --git a/docs/web-ui/README.md b/docs/web-ui/README.md index 12201218..d3b95f21 100644 --- a/docs/web-ui/README.md +++ b/docs/web-ui/README.md @@ -10,9 +10,8 @@ below; this page only covers what you actually do here. Everything starts at the **H0M3 hub**, served at `/` — a grid of tiles linking to every surface (Dashboard, Flow, Logs, Builds, Stats, -Settings, Core, Credentials, plus Matrix/Forge when enabled). Every -page links back to H0M3, so you're never more than one click from the -hub. +Settings, Core, Credentials). Every page links back to H0M3, so you're +never more than one click from the hub. The **dashboard** itself (`/dashboard.html`) is where you'll spend most of your time. It's a single page with exactly four tabs: diff --git a/docs/web-ui/dashboard.md b/docs/web-ui/dashboard.md index 6cad964d..9dac4cbb 100644 --- a/docs/web-ui/dashboard.md +++ b/docs/web-ui/dashboard.md @@ -687,25 +687,16 @@ re-renders the terminal row. The root agent is addressed as `@root`. ## H0M3 page (`/`) The H0M3 hub is the primary landing page (served at `/` by default). A -responsive grid of link tiles — Dashboard, Flow, Logs, Matrix (when enabled), -Forge (when enabled), among others (Builds, Stats, Settings, Core, -Credentials, API) — each pointing to their respective surfaces. The **API** -tile always shows (unlike Matrix/Forge, see below) and links to the -Swagger UI at `/api/docs`. The page -is a pure portal with no tab-bar or SSE subscriptions. Typography + colours -inherit from the shared theme (Catppuccin Mocha via `common.css` + `theme.css`). -Optional tiles are hidden until `home.js` confirms their availability: -Matrix is hidden until `home.js` confirms `matrix_gui_enabled` (same gating as -the dashboard's M4TR1X tab); Forge is hidden until `home.js` confirms both -`state.forge_present` **and** `state.forge_public_url` (sourced from -`services.hyperhive.forge.publicUrl`, which defaults to the gateway vhost URL -when `behindGateway=true` and is `null` otherwise) and fills the href from the -latter — never guessed from the operator's browser hostname + a container -port, which is only right by accident off plain localhost. Operators without -matrix or forge enabled — or with forge on but no public URL configured — -never see a dead or wrong link. `home.js` also fills the swarm/hive identity -line at the top. All dashboard sub-pages include a `← Home` back-link for -navigation. +responsive grid of link tiles — Dashboard, Flow, Logs, Builds, Stats, +Settings, Core, Credentials, API — each pointing to their respective +surfaces, all unconditionally shown (no gating). The page is a pure +portal with no tab-bar or SSE subscriptions. Typography + colours inherit +from the shared theme (Catppuccin Mocha via `common.css` + `theme.css`). +`home.js` fills the swarm/hive identity line at the top. All dashboard +sub-pages include a `← Home` back-link for navigation. + +No Matrix or Forge tile here — those surfaces (`/matrix/`, the forge's own +public URL) are reached directly, not linked from the dashboard UI. ## L0GS page (`/logs.html`) diff --git a/frontend/packages/dashboard/src/home.js b/frontend/packages/dashboard/src/home.js index ce020a77..0225f556 100644 --- a/frontend/packages/dashboard/src/home.js +++ b/frontend/packages/dashboard/src/home.js @@ -1,9 +1,7 @@ // H0M3 page script. The page is static markup; this only does // a few small things off a single `/api/state` read: -// 1. reveal the Matrix tile when the matrix GUI is enabled (same -// gating as the dashboard's M4TR1X tab — no dead link otherwise); -// 2. fill the swarm/hive identity line when configured; -// 3. render the shared server-warnings banner (top of every page). +// 1. fill the swarm/hive identity line when configured; +// 2. render the shared server-warnings banner (top of every page). // No SSE — a portal doesn't need live updates. // // It also drives the decorative matrix-rain backdrop (#matrix-rain) — @@ -25,25 +23,6 @@ async function init() { renderServerWarnings(state.server_warnings); - if (state.matrix_gui_enabled) { - const tile = $('home-tile-matrix'); - if (tile) tile.hidden = false; - } - - // Forge tile: reveal only when the hive-forge container is up AND - // the operator has stated a public URL for it - // (services.hyperhive.forge.publicUrl, surfaced as - // state.forge_public_url) — hidden rather than guessed from - // `location.hostname` + the direct :3000 port, which is only - // correct by accident on deployments that aren't plain localhost. - if (state.forge_present && state.forge_public_url) { - const tile = $('home-tile-forge'); - if (tile) { - tile.href = state.forge_public_url; - tile.hidden = false; - } - } - const ident = $('hive-identity'); if (ident && (state.swarm_name || state.hive_name)) { const parts = [state.swarm_name, state.hive_name].filter(Boolean); diff --git a/frontend/packages/dashboard/src/index.html b/frontend/packages/dashboard/src/index.html index ad4d0428..3aa97541 100644 --- a/frontend/packages/dashboard/src/index.html +++ b/frontend/packages/dashboard/src/index.html @@ -100,9 +100,9 @@ provision per-agent matrix + github accounts - + @@ -111,29 +111,6 @@ interactive OpenAPI spec (Swagger UI) - - - - - - diff --git a/frontend/packages/dashboard/src/tabs.js b/frontend/packages/dashboard/src/tabs.js index 08fa8b0a..4be7010d 100644 --- a/frontend/packages/dashboard/src/tabs.js +++ b/frontend/packages/dashboard/src/tabs.js @@ -188,8 +188,8 @@ window.marked = marked; // names from here instead of refetching on every keystroke). window.__hyperhive_state = s; renderServerWarnings(s.server_warnings); - // (The M4TR1X surface is reachable from the H0M3 hub now, not the - // dashboard tab strip — home.js gates its tile on matrix_gui_enabled.) + // (The M4TR1X surface is reachable directly at /matrix/ when enabled + // — no link in the dashboard tab strip or the H0M3 hub.) // Hive identity: render the swarm/hive name as a headline at the // top of the SW4RM pane + update the page title once the // server-side display names are known. `hive_name` / `swarm_name` From 40be8222b82eb5e8a336fd6f43200d5e869ff428 Mon Sep 17 00:00:00 2001 From: iris Date: Mon, 31 Aug 2026 10:43:44 +0200 Subject: [PATCH 2/4] docs: fix stale Matrix-tile reference in M4TR1X page section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit argus (PR#3820 review): the M4TR1X page section still said the operator opens /matrix/ from the H0M3 hub's Matrix tile — that tile no longer exists after this PR removed it. Fixed to say the page is opened directly. --- docs/web-ui/dashboard.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/web-ui/dashboard.md b/docs/web-ui/dashboard.md index 9dac4cbb..04b1f2ca 100644 --- a/docs/web-ui/dashboard.md +++ b/docs/web-ui/dashboard.md @@ -636,8 +636,8 @@ nginx container at `/matrix/` when `HIVE_MATRIX_GUI_ENABLED` env var → `state.matrix_gui_enabled` in `/api/state`; the gateway does the actual static serving. -The operator opens `/matrix/` from the Matrix tile on the H0M3 hub, logs -in once with the in-host tuwunel homeserver URL +The operator opens `/matrix/` directly — there's no tile for it on the +H0M3 hub — logs in once with the in-host tuwunel homeserver URL (`http://localhost:8008` or whatever the matrix module exposes). The unified nginx-front re-root to From 19ed400cddf1d92a96be8b8e58622f15b4d469fd Mon Sep 17 00:00:00 2001 From: iris Date: Mon, 31 Aug 2026 12:51:47 +0200 Subject: [PATCH 3/4] docs: M4TR1X page is reached via swarm-ui's LinksMenu, not opened directly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mara (PR#3820): the operator doesn't type /matrix/ into the browser — it's a swarm-level link (hive-matrix.nix registers it into services.hyperhive.swarm.controller.links, rendered by swarm-ui's LinksMenu). Corrected the M4TR1X page doc, and fixed the hive-matrix.nix comment that still described the removed H0M3 tile in present tense while I was in there. --- docs/web-ui/dashboard.md | 13 ++++++++++--- nix/host-modules/hive-matrix.nix | 10 ++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/docs/web-ui/dashboard.md b/docs/web-ui/dashboard.md index 04b1f2ca..c78b62f9 100644 --- a/docs/web-ui/dashboard.md +++ b/docs/web-ui/dashboard.md @@ -636,9 +636,16 @@ nginx container at `/matrix/` when `HIVE_MATRIX_GUI_ENABLED` env var → `state.matrix_gui_enabled` in `/api/state`; the gateway does the actual static serving. -The operator opens `/matrix/` directly — there's no tile for it on the -H0M3 hub — logs in once with the in-host tuwunel homeserver URL -(`http://localhost:8008` or whatever the matrix module exposes). +There's no tile for it on the H0M3 hub (removed along with Forge's — +see the H0M3 section above). Instead the operator reaches it from the +swarm-ui LinksMenu (the 🔗 popover on every swarm-ui route, +`docs/swarm/ui.md::Quick links`) — `hive-matrix.nix` registers a +`{label: "Matrix", url: "https:///"}` entry into +`services.hyperhive.swarm.controller.links` whenever the gateway +fronts matrix and the GUI is on, same gating condition +`state.matrix_gui_enabled` used to check. Logs in once with the +in-host tuwunel homeserver URL (`http://localhost:8008` or whatever +the matrix module exposes). The unified nginx-front re-root to `https://chat.${hyperhive.swarm.domain}` + `.well-known/matrix/client` diff --git a/nix/host-modules/hive-matrix.nix b/nix/host-modules/hive-matrix.nix index 632643a7..bc836acc 100644 --- a/nix/host-modules/hive-matrix.nix +++ b/nix/host-modules/hive-matrix.nix @@ -513,10 +513,12 @@ in # This swarm-ui quick-links entry. Gated on `gui.enable` too, not just # `gatewayHost != null`: `/` on that vhost only serves fluffychat - # (below) when the GUI is on — otherwise the link would 404, the same - # reason the old dashboard's H0M3 page hides its Matrix tile on - # `state.matrix_gui_enabled` rather than `gatewayHost` alone. See - # `services.hyperhive.swarm.controller.links`'s description. + # (below) when the GUI is on — otherwise the link would 404. Same + # `gatewayHost && gui.enable` condition the removed hive-dashboard + # H0M3 tile used to check via `state.matrix_gui_enabled` before this + # link became the only way in (docs/web-ui/dashboard.md::M4TR1X + # page). See `services.hyperhive.swarm.controller.links`'s + # description. services.hyperhive.swarm.controller.links = lib.optional (cfg.gatewayHost != null && cfg.gui.enable) { From 146db58bab19ebf72cc9f96bc2979f2dc619c2ac Mon Sep 17 00:00:00 2001 From: iris Date: Mon, 31 Aug 2026 12:55:40 +0200 Subject: [PATCH 4/4] docs: trim M4TR1X-page LinksMenu paragraph to the pointer, not the impl MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mara: strip impl details from docs. Dropped the nix-module name, struct literal, and gating-condition restatement — docs/swarm/ui.md::Quick links already covers that; this section only needs to say where the link lives now. --- docs/web-ui/dashboard.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/docs/web-ui/dashboard.md b/docs/web-ui/dashboard.md index c78b62f9..b0f84fb8 100644 --- a/docs/web-ui/dashboard.md +++ b/docs/web-ui/dashboard.md @@ -637,14 +637,9 @@ nginx container at `/matrix/` when `/api/state`; the gateway does the actual static serving. There's no tile for it on the H0M3 hub (removed along with Forge's — -see the H0M3 section above). Instead the operator reaches it from the -swarm-ui LinksMenu (the 🔗 popover on every swarm-ui route, -`docs/swarm/ui.md::Quick links`) — `hive-matrix.nix` registers a -`{label: "Matrix", url: "https:///"}` entry into -`services.hyperhive.swarm.controller.links` whenever the gateway -fronts matrix and the GUI is on, same gating condition -`state.matrix_gui_enabled` used to check. Logs in once with the -in-host tuwunel homeserver URL (`http://localhost:8008` or whatever +see the H0M3 section above). The operator reaches it from the swarm-ui +LinksMenu instead (see `docs/swarm/ui.md::Quick links`), and logs in +once with the in-host tuwunel homeserver URL (`http://localhost:8008` or whatever the matrix module exposes). The unified nginx-front re-root to