--- type: User Story title: Monitor community account activity description: Administrators use a server-rendered dashboard to review daily activity, confirmed connections, locations, denials, and risky networks. tags: [admin, dashboard, metrics, security, maps, ssr] timestamp: 2026-08-07T22:31:05Z story_id: US-018 status: verified --- # User Story As an administrator, I want an operational dashboard of account and game activity, so that I can understand community growth and quickly investigate access risks. # Acceptance Criteria - [x] The administrator landing page is a dashboard rather than a settings form. - [x] A server-rendered Natural Earth overview plots each user's latest non-anonymized observation with valid approximate coordinates, allowing clear and hosting classifications while excluding VPN, proxy, and Tor observations. - [x] When a user's newest coordinate-bearing observation is VPN, proxy, or Tor, the map uses that user's older clear or hosting observation when one exists. - [x] A user without a coordinate-bearing clear or hosting observation is counted as unavailable on the map. - [x] Administrators can opt into a zoomable OpenStreetMap view without removing the default overview. - [x] OpenStreetMap tiles load only after the administrator selects the interactive view and retain required attribution. - [x] Map markers show the managed Discord nickname on hover or keyboard focus, link to user records, and have an accessible text-table equivalent. - [x] Users sharing approximate coordinates render as one grouped marker with a visible count in both map views. - [x] Grouped-marker hover and keyboard focus list every managed Discord nickname at that location. - [x] Interactive grouped markers open a popup with links to every corresponding user record. - [x] Single-user markers retain their direct nickname tooltip and user-record link. - [x] The location list identifies the enriched network company and ASN when available. - [x] The location list shows ProxyCheck's connection type separately from its risk classification. - [x] The location list shows the provider's proxy/VPN signal as an explicit Yes or No value. - [x] Unknown is shown only for individual enriched fields that are unavailable, including existing cached responses. - [x] The dashboard graphs distinct daily active users by UTC day for the previous 14 days with understandable date labels. - [x] Monthly active users count distinct users observed through portal or game activity in the previous 30 days. - [x] Monthly active Minecraft accounts count distinct accounts with a confirmed Velocity post-login connection in the previous 30 days. - [x] The dashboard shows login denials from the previous 24 hours. - [x] Recent VPN, proxy, and Tor observations remain available in the separate network-risk section when excluded from map-location selection. - [x] The graph includes an accessible title, description, point labels, and textual values. - [x] Dashboard queries and initial rendering execute server-side; only the opt-in pan-and-zoom map hydrates client-side. - [x] Deployment-managed guild settings and denial messaging remain available on a dedicated settings page. # Implementation - [`apps/web/src/app/admin/(console)/page.tsx`](../apps/web/src/app/admin/%28console%29/page.tsx) - [`apps/web/src/app/admin/(console)/settings/page.tsx`](../apps/web/src/app/admin/%28console%29/settings/page.tsx) - [`apps/web/src/lib/admin-metrics.ts`](../apps/web/src/lib/admin-metrics.ts) - [`apps/web/src/components/user-world-map.tsx`](../apps/web/src/components/user-world-map.tsx) - [`apps/web/src/components/map-view-toggle.tsx`](../apps/web/src/components/map-view-toggle.tsx) - [`apps/web/src/lib/user-location-map.ts`](../apps/web/src/lib/user-location-map.ts) # Validation - Missing-day chart behavior and per-user VPN collapsing are covered by [`apps/web/src/lib/admin-metrics.test.ts`](../apps/web/src/lib/admin-metrics.test.ts). - Coordinate parsing, the clear/hosting map policy, backward-compatible ProxyCheck network parsing, normalized location grouping, projection, count badges, complete grouped tooltips, linked markers, semantic network columns, text fallback, and attribution are covered by the user-location and user-world-map tests. - The full test suite passes with 106 tests across 36 files; web type checking and lint pass. - The Next.js production build succeeds and reports the dashboard and database-backed console pages as dynamic server-rendered routes. # Related Stories - [Preserve a CloudEvents-style audit trail](us-010-audit-events.md) - [Deploy and operate the platform securely](us-015-platform-operations.md) - [Block anonymized account additions](us-008-vpn-blocking.md)