diff --git a/work/dashboard-frontend/src/App.tsx b/work/dashboard-frontend/src/App.tsx
index 2fbde71..a0a8785 100644
--- a/work/dashboard-frontend/src/App.tsx
+++ b/work/dashboard-frontend/src/App.tsx
@@ -1,20 +1,14 @@
import { Routes, Route, Navigate } from 'react-router-dom'
import Layout from './components/Layout'
import Dashboard from './pages/Dashboard'
-import Mesh from './pages/Mesh'
import Environment from './pages/Environment'
import Config from './pages/Config'
import ActivityLog from './pages/ActivityLog'
import Notifications from './pages/Notifications'
import Reference from './pages/Reference'
-import AdapterConfig from './pages/AdapterConfig'
-import GaugeSites from './pages/GaugeSites'
-import TownAnchors from './pages/TownAnchors'
import MeshCoreRouting from './pages/MeshCoreRouting'
import MeshCoreConnection from './pages/MeshCoreConnection'
-import MeshCoreCompanion from './pages/MeshCoreCompanion'
import MeshtasticConnection from './pages/MeshtasticConnection'
-import MeshtasticSources from './pages/MeshtasticSources'
import Places from './pages/Places'
import MeshtasticNodes from './pages/MeshtasticNodes'
import MeshCoreContactsCompanion from './pages/MeshCoreContactsCompanion'
@@ -41,7 +35,6 @@ function App() {
{/* Legacy /notifications -> Meshtastic Routing */}
} />
} />
- } />
{/* New aggregated pages */}
} />
@@ -49,14 +42,17 @@ function App() {
{/* Custom sources folded into Data Feeds; keep old bookmark working */}
} />
- {/* De-navved routes still work */}
- } />
- } />
- } />
+ {/* Legacy /gauge-sites -> Places (Gauge Sites tab) */}
+ } />
+ {/* Legacy /town-anchors -> Places (lands on first tab, no ?tab= deep-link) */}
+ } />
+ {/* Legacy /mesh -> Meshtastic Nodes & Health (Nodes tab) */}
+ } />
{/* Meshtastic routes */}
} />
- } />
+ {/* Legacy /meshtastic/sources -> Nodes & Health (lands on first tab, no ?tab= deep-link) */}
+ } />
} />
} />
} />
@@ -66,7 +62,8 @@ function App() {
} />
} />
} />
- } />
+ {/* Legacy /meshcore/companion -> Contacts & Companion (lands on first tab, no ?tab= deep-link) */}
+ } />
} />
diff --git a/work/dashboard-frontend/src/components/Layout.tsx b/work/dashboard-frontend/src/components/Layout.tsx
index 626e896..8a55d4e 100644
--- a/work/dashboard-frontend/src/components/Layout.tsx
+++ b/work/dashboard-frontend/src/components/Layout.tsx
@@ -3,19 +3,14 @@ import { Link, useLocation, useNavigate } from 'react-router-dom'
import { useDirty } from '@/context/DirtyContext'
import {
LayoutDashboard,
- Radio,
Cloud,
BellRing,
BookOpen,
- Sliders,
- Droplets,
MapPin,
Map,
Wifi,
- Layers,
Network,
Users,
- Bot,
Settings,
Calendar,
Activity,
@@ -85,14 +80,7 @@ const navGroups: NavGroup[] = [
// Flattened view of every nav item for title lookup.
// Also include de-navved routes so they still resolve a title.
-const extraTitleItems: NavItem[] = [
- { path: '/adapter-config', label: 'Adapter Config', icon: Sliders },
- { path: '/gauge-sites', label: 'Gauge Sites', icon: Droplets },
- { path: '/town-anchors', label: 'Town Anchors', icon: MapPin },
- { path: '/mesh', label: 'Mesh', icon: Radio },
- { path: '/meshtastic/sources', label: 'Sources', icon: Layers },
- { path: '/meshcore/companion', label: 'Companion', icon: Bot },
-]
+const extraTitleItems: NavItem[] = []
const allNavItems: NavItem[] = [
...navGroups.flatMap((g) => g.items),
@@ -108,7 +96,6 @@ const pathTitles: Record = {
'/meshtastic/danger-zones': 'Danger Zones',
'/meshcore/danger-zones': 'Danger Zones',
'/meshcore/contacts': 'Contacts & Companion',
- '/meshcore/companion': 'Contacts & Companion',
}
function formatUptime(seconds: number): string {
diff --git a/work/meshai/dashboard/api/config_routes.py b/work/meshai/dashboard/api/config_routes.py
index 5a28311..104de0f 100644
--- a/work/meshai/dashboard/api/config_routes.py
+++ b/work/meshai/dashboard/api/config_routes.py
@@ -411,8 +411,10 @@ def _refresh_mesh_context(app, new_ctx_cfg) -> bool:
@router.post("/notifications/refresh-toggles")
async def refresh_toggles(request: Request):
- """Explicit refresh endpoint (kept for backwards-compat with the
- dashboard's manual ping path)."""
+ """Explicit refresh endpoint. Not called by the dashboard frontend --
+ the _auto_refresh_toggle_filter middleware below already refreshes the
+ ToggleFilter automatically on every successful notifications config PUT.
+ Kept for ops/debug use (manually forcing a refresh outside that path)."""
bus = getattr(request.app.state, "bus", None)
config = getattr(request.app.state, "config", None)
if bus is None or config is None: