Adds a new Dashboard tab as the default/first tab (Dashboard → Curve → Performance → Fans) showing a full GPU overview.
What's new
Critical top row — Throttling (green "No" / amber with reason), GPU Voltage, Temperature (GPU + VRAM, live).
Live Monitor — all stats with sparklines: Core Clock, Mem Clock, Voltage, Power Draw, GPU Util, Mem Util, Fan Speed, P-State, VRAM Used.
GPU Information — static specs: Driver, VBIOS, CUDA Cores, CUDA Compute, ROP Count, VRAM Type, VRAM Total, Bus Width, CPU Accessible VRAM (BAR1), Resizable BAR, PCIe Link (live) + PCIe Max, Max Core/Mem Clock, Power Limit + Range, Temp Slowdown/Shutdown, Persistence Mode, Fans, Serial, Board Part No., UUID. Unavailable fields are omitted.
Backend
New hal/dashboard.py: one-shot static GPU info via NVML. ROP count and VRAM type are best-effort from a per-model table (NVML doesn't expose them).
New /api/dashboard endpoint.
MonitoringSample gains livethrottle_reasons (+label), PCIe link width/generation (downclocks when idle → read per poll), and VRAM temp (from the MEMORY thermal sensor, if the GPU exposes it).
Frontend
New Dashboard component + useDashboard hook + DashboardInfo type + api.client.dashboard().
Also included
CORS restricted to localhost origins (end-anchored regex) — SPA is served same-origin.
_int_key_deltas now fails closed on a non-numeric profile key (no partial hardware writes).
Lint cleanup in server.py / monitoring.py.
Notes
Hotspot temp is not exposed by NVML (no such sensor/target), so it's omitted.
Verified end-to-end on an RTX 5090 (driver 610.x): all fields populate; PCIe link tracks load (Gen4 → Gen1/2 when idle).
Adds a new **Dashboard** tab as the default/first tab (Dashboard → Curve → Performance → Fans) showing a full GPU overview.
## What's new
**Critical top row** — Throttling (green "No" / amber with reason), GPU Voltage, Temperature (GPU + VRAM, live).
**Live Monitor** — all stats with sparklines: Core Clock, Mem Clock, Voltage, Power Draw, GPU Util, Mem Util, Fan Speed, P-State, VRAM Used.
**GPU Information** — static specs: Driver, VBIOS, CUDA Cores, CUDA Compute, ROP Count, VRAM Type, VRAM Total, Bus Width, CPU Accessible VRAM (BAR1), Resizable BAR, PCIe Link (live) + PCIe Max, Max Core/Mem Clock, Power Limit + Range, Temp Slowdown/Shutdown, Persistence Mode, Fans, Serial, Board Part No., UUID. Unavailable fields are omitted.
## Backend
- New `hal/dashboard.py`: one-shot static GPU info via NVML. ROP count and VRAM type are best-effort from a per-model table (NVML doesn't expose them).
- New `/api/dashboard` endpoint.
- `MonitoringSample` gains **live** `throttle_reasons` (+label), PCIe link width/generation (downclocks when idle → read per poll), and VRAM temp (from the MEMORY thermal sensor, if the GPU exposes it).
## Frontend
- New `Dashboard` component + `useDashboard` hook + `DashboardInfo` type + `api.client.dashboard()`.
## Also included
- CORS restricted to localhost origins (end-anchored regex) — SPA is served same-origin.
- `_int_key_deltas` now fails closed on a non-numeric profile key (no partial hardware writes).
- Lint cleanup in `server.py` / `monitoring.py`.
## Notes
- Hotspot temp is not exposed by NVML (no such sensor/target), so it's omitted.
- Verified end-to-end on an RTX 5090 (driver 610.x): all fields populate; PCIe link tracks load (Gen4 → Gen1/2 when idle).
Add a new Dashboard tab as the default/first tab (Dashboard - Curve -
Performance - Fans) showing a full GPU overview.
Backend:
- New hal/dashboard.py: one-shot static GPU info via NVML (VBIOS, CUDA
cores, compute capability, bus width, BAR1/CPU-accessible VRAM,
Resizable BAR, PCIe max, max clocks, power limits, temp thresholds,
persistence mode, fan count, serial, board part number, UUID).
ROP count and VRAM type are best-effort from a per-model table since
NVML does not expose them.
- New /api/dashboard endpoint.
- MonitoringSample gains live throttle_reasons (+label), PCIe link
width/generation (downclocks when idle, so read per poll), and VRAM
temp (from the MEMORY thermal sensor, if exposed).
Frontend:
- New Dashboard component: critical top row (throttling, voltage,
GPU/VRAM temps), full live-monitor grid with sparklines, and a static
GPU-information grid. Unavailable fields are omitted.
- useDashboard hook + DashboardInfo type + api.client dashboard().
Also: restrict CORS to localhost origins (end-anchored), make
_int_key_deltas fail closed on bad keys, and clean up lint blockers in
server.py/monitoring.py.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Adds a new Dashboard tab as the default/first tab (Dashboard → Curve → Performance → Fans) showing a full GPU overview.
What's new
Critical top row — Throttling (green "No" / amber with reason), GPU Voltage, Temperature (GPU + VRAM, live).
Live Monitor — all stats with sparklines: Core Clock, Mem Clock, Voltage, Power Draw, GPU Util, Mem Util, Fan Speed, P-State, VRAM Used.
GPU Information — static specs: Driver, VBIOS, CUDA Cores, CUDA Compute, ROP Count, VRAM Type, VRAM Total, Bus Width, CPU Accessible VRAM (BAR1), Resizable BAR, PCIe Link (live) + PCIe Max, Max Core/Mem Clock, Power Limit + Range, Temp Slowdown/Shutdown, Persistence Mode, Fans, Serial, Board Part No., UUID. Unavailable fields are omitted.
Backend
hal/dashboard.py: one-shot static GPU info via NVML. ROP count and VRAM type are best-effort from a per-model table (NVML doesn't expose them)./api/dashboardendpoint.MonitoringSamplegains livethrottle_reasons(+label), PCIe link width/generation (downclocks when idle → read per poll), and VRAM temp (from the MEMORY thermal sensor, if the GPU exposes it).Frontend
Dashboardcomponent +useDashboardhook +DashboardInfotype +api.client.dashboard().Also included
_int_key_deltasnow fails closed on a non-numeric profile key (no partial hardware writes).server.py/monitoring.py.Notes
✅ No issues found — changes look consistent with the stated intent. Ready to be merged.