## Summary - Adds configurable GPS polygon areas to `config.json`; nodes are attributed to an area if their last-known position falls inside the polygon - New `Area: …` dropdown filter (matching the existing region filter style) appears on all analytics, nodes, packets, map, and live screens when areas are configured - Backend resolves area membership with a 30s TTL cache; area filter bypasses the 500-node cap on `/api/bulk-health` so all area nodes are always returned - Includes a polygon builder tool (`/area-map.html`) for drawing and exporting area boundaries ## Changes **Backend** - `AreaEntry` type + `Areas` config field - `GetNodePubkeysInArea` DB query + `resolveAreaNodes` (30s TTL, `areaNodeMu` RWMutex) - `PacketQuery.Area` + `filterPackets` polygon check - `?area=` param propagated through all analytics, topology, clock-health, and bulk-health routes - `/api/config/areas` endpoint **Frontend** - `area-filter.js`: single-select dropdown, persists to localStorage, cleans up stale keys on load - Wired into analytics, nodes, packets, channels, map, and live pages - Live map clears node markers on area change **Docs & tools** - `docs/user-guide/area-filter.md` — configuration and usage guide - `docs/api-spec.md` — updated with new endpoint and `?area=` param table - `tools/area-map.html` — polygon builder for defining area boundaries - Demo areas added to `config.example.json` ## Test plan - [x] No areas configured → filter dropdown does not appear on any page - [x] Areas configured → dropdown appears, "All" selected by default - [x] Selecting an area filters nodes/packets/topology/map correctly - [x] Selecting "All" restores unfiltered view - [x] Selection persists across page reloads (localStorage) - [x] Stale localStorage key (area removed from config) is cleared on load - [x] `/api/bulk-health?area=X` returns all nodes in area (no 500-node cap) - [x] `/api/config/areas` returns correct list 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Kpa-clawbot <kpaclawbot@outlook.com> Co-authored-by: openclaw-bot <bot@openclaw.local>
2.3 KiB
Nodes
The Nodes page lists every node your mesh has seen — repeaters, companions, rooms, and sensors.
[Screenshot: nodes list with status indicators]
What you see
Each row shows:
- Name — the node's advertised name (or public key if unnamed)
- Role — Repeater, Companion, Room, or Sensor
- Status — color-coded health indicator
- Last seen — when the node was last heard
- Advert count — how many advertisements this node has sent
Status indicators
| Indicator | Meaning |
|---|---|
| 🟢 Active | Heard recently (within threshold for its role) |
| 🟡 Degraded | Not heard for a while but not yet silent |
| 🔴 Silent | Not heard for an extended period |
Thresholds differ by role. Infrastructure nodes (repeaters, rooms) have longer grace periods than companions. See Configuration for healthThresholds.
Filtering
Role tabs
Click All, Repeaters, Rooms, Companions, or Sensors to filter by role.
Search
Type in the search box to filter by name or public key. The filter applies instantly.
Status filter
Filter to show only active, degraded, or silent nodes.
Area filter
If areas are configured, an area pill bar appears above the list. Selecting an area shows only nodes whose GPS position falls within that area.
Last heard filter
Filter nodes by how recently they were heard (e.g., last hour, last 24h).
Sorting
Click any column header to sort. Click again to reverse the order. Your sort preference is saved across sessions.
Node detail
Click a node row to open the detail pane on the right. It shows:
- Full public key
- Role and status explanation
- Location (if known)
- Recent packets involving this node
- Neighbor nodes
- Signal statistics
Click the node name in the detail pane to open the full node page with complete history, analytics, and health data.
Favorites
Nodes you've claimed on the Home page appear as favorites. You can also star nodes directly from the Nodes page.
Tips
- Use the search box for quick lookups — it matches partial names and keys
- Sort by "Last seen" descending to find the most active nodes
- The status explanation tells you exactly why a node is marked degraded or silent