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.
This commit is contained in:
iris 2026-08-31 10:33:57 +02:00
commit 2490181055
5 changed files with 19 additions and 73 deletions

View file

@ -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:

View file

@ -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`)

View file

@ -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);

View file

@ -100,9 +100,9 @@
<span class="home-tile-desc">provision per-agent matrix + github accounts</span>
</a>
<!-- API tile: no gating, unlike Forge/Matrix below — the OpenAPI
spec + Swagger UI are always served by hive-c0re itself
(docs/web-ui/dashboard.md::Dashboard endpoints). -->
<!-- API tile: the OpenAPI spec + Swagger UI are always served by
hive-c0re itself (docs/web-ui/dashboard.md::Dashboard
endpoints), so this tile is never gated/hidden. -->
<a class="home-tile" href="/api/docs">
<span class="home-tile-head">
<span class="home-tile-icon" aria-hidden="true">🧬</span>
@ -111,29 +111,6 @@
<span class="home-tile-desc">interactive OpenAPI spec (Swagger UI)</span>
</a>
<!-- Forge tile: hidden until home.js confirms the hive-forge
container is up (state.forge_present); home.js also fills the
href from state.forge_public_url (or the :3000 fallback), so
operators without a forge never see a dead link. -->
<a class="home-tile" id="home-tile-forge" href="#" target="_blank" rel="noopener" hidden>
<span class="home-tile-head">
<span class="home-tile-icon" aria-hidden="true"></span>
<span class="home-tile-label">Forge</span>
</span>
<span class="home-tile-desc">issues · pull requests · agent-config repos</span>
</a>
<!-- Matrix tile: hidden until home.js confirms the matrix GUI is
enabled (state.matrix_gui_enabled), mirroring the dashboard
tab gating so operators without it don't see a dead link. -->
<a class="home-tile" id="home-tile-matrix" href="/matrix/" hidden>
<span class="home-tile-head">
<span class="home-tile-icon" aria-hidden="true">💬</span>
<span class="home-tile-label">Matrix</span>
</span>
<span class="home-tile-desc">matrix chat client</span>
</a>
</nav>
</main>
</div><!-- /.page-content -->

View file

@ -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`