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)
-
-
-
- ⚒
- Forge
-
- issues · pull requests · agent-config repos
-
-
-
-
-
- 💬
- Matrix
-
- matrix chat client
-
-
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`