FanMonitor: sidebar with Fan Speed, GPU Temp, Target Fan gauges
App.tsx: three-tab layout (Curve, Performance, Fans) with shared fan state refresh
GaugeCard: optional history sparkline, Fan Mode card without sparkline
fan_mode field populated as "curve" or "auto" in GET /api/fans
## Summary
Add a complete Fans tab for GPU fan speed control via temperature curves.
## Changes
### Backend
- **hal/fans.py**: NVML v2 fan read/set/reset with min/max queries
- **server.py**: GET/POST /api/fans, POST /api/fans/reset, POST /api/fans/speed endpoints
- Background fan poller reads GPU temp every 2s, interpolates fan speed from curve
- Profile integration: fan_curve field saved/applied, auto-restore on shutdown
- Probe uses current GPU temp (not first curve point) to avoid brief inappropriate speed
### Frontend
- **FanCurveEditor**: SVG chart with drag/add/delete points, static defaults (30°C=0%, 45°C=40%, 60°C=80%, 70°C=100%)
- **FanMonitor**: sidebar with Fan Speed, GPU Temp, Target Fan gauges
- **App.tsx**: three-tab layout (Curve, Performance, Fans) with shared fan state refresh
- **GaugeCard**: optional history sparkline, Fan Mode card without sparkline
- **fan_mode** field populated as "curve" or "auto" in GET /api/fans
- Backend HAL (hal/fans.py): NVML v2 fan read/set/reset with min/max queries
- Server endpoints: GET/POST /api/fans, POST /api/fans/reset, POST /api/fans/speed
- Background fan poller: reads GPU temp every 2s, interpolates fan speed from curve
- Profile integration: fan_curve field saved/applied, auto-restore on shutdown
- Frontend: FanCurveEditor (SVG chart with drag/add/delete points), FanMonitor sidebar
- App.tsx: three-tab layout (Curve, Performance, Fans)
- GaugeCard: optional history sparkline, Fan Mode card without sparkline
- fan_mode field populated as 'curve' or 'auto' in GET /api/fans
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.
Summary
Add a complete Fans tab for GPU fan speed control via temperature curves.
Changes
Backend
Frontend