diff --git a/CLAUDE.md b/CLAUDE.md
index ec99829..f85d598 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -39,7 +39,7 @@
- Токены — opaque; каждый запрос API валидируется через userinfo. Креды клиента (GAUTH_CLIENT_ID/SECRET) — только в `.env`, в UI авторизация никак не конфигурируется.
- TLS gnexus-auth в LAN self-signed: `GAUTH_VERIFY_TLS=false` по умолчанию; в проде с нормальным сертификатом — `true`.
- **Single sign-out** (правило владельца): выход из gnexus-auth обязан завершать сессию в Synapse. Прямой logout в gnexus-auth НЕ отзывает OAuth-токены (access до 30 мин, refresh 30 дней переживают logout) — поэтому callback сохраняет выданные токены в Redis по user_id (`store_login`), а вебхук `auth.logout`/`auth.global_logout`/`session.revoked` отзывает их все. SPA-poll `/api/v1/admin/me` каждые 45 c: 401 → уход на /login. Выход из Synapse (`POST /auth/logout`) тоже отзывает входы пользователя; завершение самой SSO-сессии (RP-initiated logout) — TODO в gnexus-auth, зафиксировано в #32.
-- Локальная разработка: gnexus-auth = `http://gnexus-auth.local` (в контейнерах — `extra_hosts: host-gateway` в compose), API на `localhost:8012`.
+- Локальная разработка: gnexus-auth = `http://gnexus-auth.local` (в контейнерах — `extra_hosts: host-gateway` в compose), API на `localhost:8013` (порт задаёт `SYNAPSE_PORT`), dev-сервер SPA — 5174.
- Токен передаётся `Authorization: Bearer` — cookie не годятся (сессия gnexus-auth не выходит за пределы auth-сервера); SPA-клиент хранит access/refresh сам (docs 18–20 описывают клиентскую сторону).
## GNexus UI Kit
diff --git a/frontend/src/App.vue b/frontend/src/App.vue
index f6394a6..31976e1 100644
--- a/frontend/src/App.vue
+++ b/frontend/src/App.vue
@@ -1,36 +1,125 @@
+
+
+
diff --git a/frontend/src/main.js b/frontend/src/main.js
index faf7b1a..b54dc81 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -5,4 +5,8 @@
import App from "./App.vue";
import { router } from "./router.js";
-createApp(App).use(GnexusUiVue).use(router).mount("#app");
\ No newline at end of file
+const app = createApp(App).use(GnexusUiVue).use(router);
+// Ждём первичной навигации: иначе первый рендер идёт со START-локацией ("/"),
+// и каркас (и heartbeat в App.vue) срабатывает ещё до того, как роутер узнал
+// реальный путь. isReady -> mount решает это.
+router.isReady().then(() => app.mount("#app"));
\ No newline at end of file
diff --git a/frontend/src/views/DashboardView.vue b/frontend/src/views/DashboardView.vue
index 236c391..b21b8b4 100644
--- a/frontend/src/views/DashboardView.vue
+++ b/frontend/src/views/DashboardView.vue
@@ -1,63 +1,26 @@
-
-
- Выйти
-
-
+
@@ -65,7 +28,6 @@
-