diff --git a/docs/features/fleet-view.mdx b/docs/features/fleet-view.mdx
index 290fa084..26ae37ed 100644
--- a/docs/features/fleet-view.mdx
+++ b/docs/features/fleet-view.mdx
@@ -6,17 +6,45 @@ description: Monitor all your nodes from a single dashboard with real-time healt
The **Fleet** tab gives you a bird's-eye view of every node in your Sencho deployment, local and remote, on one screen. It is available to all tiers, with advanced features unlocked by Skipper and Admiral.
-
+
## Page layout
-The Fleet page is divided into two tabs:
+### Fleet masthead
-- **Overview** - the main monitoring view described on this page
-- **Snapshots** - fleet-wide backup snapshots (covered in [Fleet Backups](/features/fleet-backups))
+The top of the page is a status masthead that summarises the state of the entire fleet at a glance:
-The header shows **Fleet Overview** with a subtitle summarising the current state (e.g. "2 of 2 nodes online, 31 containers, 21 stacks"). Two buttons sit in the top-right corner:
+- **Status word** in italic display type: **The fleet** with a pulsing coloured rail (green when all nodes are online and healthy, amber when any node is offline, rose when any node is critical)
+- **Meta line** showing node count, online count, and last sync time (e.g. "2 nodes · 1 online · last sync 7s")
+- **Reasons** line appears when the fleet is degraded, summarising what's wrong ("1 offline · 1 critical")
+- **Stats cluster** with three tiles:
+ - **CPU**: average across online nodes, with the peak node and percentage called out below
+ - **MEM**: total RAM used across the fleet, with total capacity and percentage
+ - **CONTAINERS**: active running count; hover the tile to see a breakdown of running vs total
+- **Alerts** indicator on the right shows the current critical count, highlighted in rose when above zero
+
+### Grid / Topology toggle
+
+Below the masthead, switch between two layouts:
+
+- **Grid** (default): one card per node. The local node is pinned at the top with a cyan accent rail and a ★ Local badge so it is never confused with a remote.
+- **Topology**: a connection diagram with the local node on the left and remotes radiating to the right. Connector lines colour by link health (cyan when online, amber when critical, dashed rose when offline), and each node chip shows its status dot, CPU and memory readings. Click a node to jump to its details.
+
+
+
+
+
+### Tabs
+
+The Fleet page has two tabs:
+
+- **Overview**: the monitoring view described on this page
+- **Snapshots**: fleet-wide backup snapshots (covered in [Fleet Backups](/features/fleet-backups))
+
+### Action buttons
+
+Two buttons sit in the top-right corner:
| Button | What it does |
|--------|--------------|
@@ -61,17 +89,6 @@ Click the **Refresh** button in the top-right to re-fetch data from all nodes. T
The features below require a Skipper or Admiral license. Community users see an upgrade prompt in place of these controls.
-### Fleet health summary cards
-
-Four cards appear above the node grid, aggregating data across all online nodes:
-
-| Card | What it shows |
-|------|---------------|
-| **Containers** | Total running containers, with fleet-wide total in subtitle |
-| **Fleet CPU** | Average CPU across all online nodes, plus which node has the highest load |
-| **Fleet Memory** | Total RAM used / total available across the fleet |
-| **Alerts** | Count of nodes with critical resource usage (CPU or disk above 90%). Card turns red when any exist |
-
### Auto-refresh
Fleet data automatically refreshes every 30 seconds. A subtle indicator at the bottom of the page confirms this is active. When a node update is in progress, the refresh rate increases to every 5 seconds so you can watch status changes in near real-time.
diff --git a/docs/images/fleet-view/fleet-overview.png b/docs/images/fleet-view/fleet-overview.png
index ee122a91..a1152422 100644
Binary files a/docs/images/fleet-view/fleet-overview.png and b/docs/images/fleet-view/fleet-overview.png differ
diff --git a/docs/images/fleet-view/fleet-topology.png b/docs/images/fleet-view/fleet-topology.png
new file mode 100644
index 00000000..16c901ed
Binary files /dev/null and b/docs/images/fleet-view/fleet-topology.png differ
diff --git a/frontend/src/components/FleetView.tsx b/frontend/src/components/FleetView.tsx
index 44c5f393..0601443f 100644
--- a/frontend/src/components/FleetView.tsx
+++ b/frontend/src/components/FleetView.tsx
@@ -1,10 +1,12 @@
import { useState, useEffect, useCallback, useMemo, useRef } from 'react';
import {
Server, Cpu, MemoryStick, HardDrive, RefreshCw, ChevronDown, ChevronRight,
- Layers, Wifi, WifiOff, Search, ArrowUpDown, AlertTriangle, Box, Activity,
+ Layers, Wifi, WifiOff, Search, ArrowUpDown, AlertTriangle,
Play, Square, RotateCcw, ExternalLink, Camera, Download, Loader2, Check,
- CircleCheck, CircleAlert, Globe, Monitor, X,
+ CircleCheck, CircleAlert, Globe, Monitor, X, LayoutGrid, Network,
} from 'lucide-react';
+import { FleetMasthead } from './fleet/FleetMasthead';
+import { FleetTopology } from './fleet/FleetTopology';
import { Button } from '@/components/ui/button';
import { Badge } from '@/components/ui/badge';
import { Skeleton } from '@/components/ui/skeleton';
@@ -149,25 +151,6 @@ function UsageBar({ percent, color }: { percent: number; color: string }) {
);
}
-function StatCard({ icon: Icon, label, value, sub, alert }: {
- icon: React.ElementType;
- label: string;
- value: string;
- sub?: string;
- alert?: boolean;
-}) {
- return (
-