#Dashboard
Dashboard = a high-level overview of the current organization. It answers "is everything OK, what am I paying, what changed", and links to the detail pages. It's never the place to manage things.
#Widgets
| Widget | Data | Source of truth | Status |
|---|---|---|---|
| Total servers | Count + online/offline split | Central link records + last health check | Missing |
| Active sites | Sum of applications across servers | OSS GET /applications per server (cached) | Missing (expensive) |
| Team members | Active + pending | Central members | Missing |
| Current plan | Name, cycle, status, renewal | Central subscription | Missing |
| Usage | Servers used/allowed, apps used/allowed | Central + OSS counts | Missing |
| Server status | Per server: health, version, last seen | OSS GET /health (no auth) + an authenticated ping | OSS API per server · aggregate Missing |
| CPU / RAM / disk | Per server, current % | OSS GET /server/metrics/live | OSS API per server |
| Traffic | Network in/out rate | OSS metrics/live.network (a rate between two polls, first poll = 0) | OSS API |
| Health | Servers needing attention (offline, disk > 90%, reboot required, update available) | OSS facts/metrics (+ OSS admin dashboard) | OSS API · rules Assumption |
| Billing / spending | Balance, this month's spend, last payment | Central billing | Missing |
| Spending trend | Spend per day/month | Central wallet history / charges | Missing |
| Recent activity | Last 10 audit entries, "View all" → Audit Log | Central audit | Missing |
The V7 dashboard data (/servers/{id}/summary, serverLoad, resourceUsage, usage) was per server and agent-based. It isn't reusable. V7 only
#Charts
- Recharts, data from the API only. No fake or sample production data: when a series is empty, show the empty state.
- 24-hour history per server: OSS
GET /server/metrics/history(5-minute points: cpu, memory, swap, disk, load, net, disk I/O). OSS API A cross-server history doesn't exist Missing. - Date filters: 24 h (OSS only keeps 24 h, so longer ranges would need Central to store samples, which conflicts with R5 Open question). Spending: 7 d / 30 d / 12 m from billing data.
- Tooltips with exact value + time (
useFormatter). Units from the API (*_humanfields exist in OSS). - Dark mode: chart colours from CSS variables (shadcn chart tokens), so they follow the theme.
- Responsive: charts fill their card, and the legend moves below on small screens.
#States
| State | Behaviour |
|---|---|
| Loading | Skeleton per card. Each card loads on its own (<Suspense> per block) |
| Empty, no servers | Hero "Connect your first server" + "Create a server" (if a provider is connected) |
| Partial failure | One server unreachable → its tile says "Unreachable · retry". Others still render |
| Error | Card-level error with Retry. Never a full-page error for one widget |
| No permission | Widget hidden (e.g. spend without Billing view) |
| Expired subscription | Top banner "Subscription expired, server actions are blocked" + Renew |
#Layout (concept)
Row 1
Total serversActive sitesTeam membersCurrent plan + usage
Row 2
Server status list (health, version, CPU/RAM/disk)Billing: balance + spend trend
Row 3
Recent activity → Audit LogNeeds attention
Mobile: one column in the same order, KPI tiles 2 per row.