diff --git a/README.md b/README.md
index b3ae330..8ae1609 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@ docker compose up -d --build
Open EC and create the first administrator using `EC_SETUP_TOKEN` (at least 32
characters; generate it with `openssl rand -hex 32`). After setup, remove that
token from the environment. Administrators can add administrators, operators and
-viewers from **Settings → Users**. See [Users and access](docs/authentication.md)
+viewers from **Administration → Users**. See [Users and access](docs/authentication.md)
for permissions, sessions, password recovery and upgrade instructions.
Operator pages and management APIs require login. Enrolled agents authenticate
@@ -32,11 +32,11 @@ including SQLite metadata and published game-file storage.
including its DLC files. There are no library names or version labels to enter.
Each upload becomes the latest files for that game after verification.
Uploads work before any host is enrolled.
-2. **Hosts → Add Host**: configure a Debian 12/13 amd64 machine and run its
+2. **Fleet → Hosts → Add Host**: configure a Debian 12/13 amd64 machine and run its
generated enrollment command. The host automatically prepares its Plutainer
runtime and the latest T5 and T6 files, when available. The host page
shows setup progress. Automatic agent updates are enabled by default.
-3. Add the exact Plutonium server keys in **Keys**, or supply missing keys when
+3. Add the exact Plutonium server keys in **Administration → Keys**, or supply missing keys when
launching.
4. Launch a server or collection. Collection previews show cached capacity
estimates; Apply saves the queue and opens its progress page. Provisioning
@@ -61,6 +61,22 @@ continue. The host page shows update status and the last check.
## Fleet and operations
+The sidebar groups pages into **Fleet**, **Library**, **Operations**, **Analytics**,
+and **Administration** (administrators only). On small screens, open the navigation
+menu in the header. The account menu contains **My account**, including your
+browser's display timezone; keyboard shortcuts are available through **?**.
+
+**Operations → Overview** combines work that needs attention, running workflows,
+and recent results. Related provisioning attempts and host commands stay grouped
+under their workflow. Normal waits for empty lobbies remain under **Running**;
+successful routine checks remain in **Host operation history**. Full history is
+available on each workflow page.
+
+Server details use **Live**, **Matches**, **Configuration**, **Diagnostics**, and
+**History** sections. Hosts use **Overview**, **Servers**, **Setup**, and **Settings**.
+Contextual Back links preserve the originating filters and views, while breadcrumbs
+show each page's place in the navigation. Existing URLs and server tab links work.
+
The fleet registry lives in SQLite, independently of host filesystems. Status
combines agent container health, fresh game telemetry and agent-local RCON.
Unreachable hosts report unknown instance state; they do not trigger duplicate
diff --git a/docs/authentication.md b/docs/authentication.md
index 490c195..2570047 100644
--- a/docs/authentication.md
+++ b/docs/authentication.md
@@ -20,7 +20,7 @@ their access checks. HTTPS requirements still apply. See the
password. Only the holder of the token can create the first administrator.
4. Remove `EC_SETUP_TOKEN` after setup and restart/recreate the controller.
Setup remains closed once any user exists, even if the token is still set.
-5. Use **Settings → Users** to create additional accounts. Share temporary
+5. Use **Administration → Users** to create additional accounts. Share temporary
passwords privately; each user must change theirs on first login.
Existing installations become protected on upgrade. Existing game servers and
diff --git a/docs/metrics.md b/docs/metrics.md
index 18f7957..3dd1c23 100644
--- a/docs/metrics.md
+++ b/docs/metrics.md
@@ -1,6 +1,6 @@
# Metrics
-Metrics is a primary navigation tab at `/metrics` (keyboard shortcut: `g m`).
+Metrics is under **Analytics** at `/metrics` (keyboard shortcut: `g m`).
Choose the past 24 hours, 7 days, or 30 days. The page refreshes every minute.
The overview shows **Time with players** (occupied server-hours divided by known
diff --git a/src/lib/ui/components/ArtifactDetail.svelte b/src/lib/ui/components/ArtifactDetail.svelte
index dd1732c..3227bd3 100644
--- a/src/lib/ui/components/ArtifactDetail.svelte
+++ b/src/lib/ui/components/ArtifactDetail.svelte
@@ -291,7 +291,7 @@
{latestVersion.notes || 'No version notes provided.'}
{latestVersion.notes || 'No version notes provided.'}
{notice}
{/if} diff --git a/src/routes/campaigns/[id]/+page.svelte b/src/routes/campaigns/[id]/+page.svelte index 13cc394..21b197c 100644 --- a/src/routes/campaigns/[id]/+page.svelte +++ b/src/routes/campaigns/[id]/+page.svelte @@ -33,7 +33,7 @@ interface Detail { deployment: { id: string; action: string; started_at: string; - finished_at: string | null; triggered_by: string | null; + finished_at: string | null; triggered_by: string | null; beta_id?: number | null; }; servers: ServerRow[]; files: FileRow[]; @@ -149,6 +149,7 @@ {#if detail.watchdogIncidentId}Started by Maintenance · View incident and recovery history
{/if} + {#if detail.deployment.beta_id}Started from Beta #{detail.deployment.beta_id} · Review its files, checks, and test servers.
{/if} {#if detail.servers.some(server => !server.server_deleted_at && ['held', 'manual'].includes(server.restart_state))}Apply held changes and restart after the safety checks pass.