Vora
A privileged Linux daemon that autonomously tunes CPU/GPU fan speeds via PID control and workload classification over real-time sensor data, with a Tauri dashboard.
The Problem
Linux laptop fan control is either fully automatic (BIOS/EC defaults that run fans at max under light loads) or requires manual configuration (fancontrol with static thresholds). Neither adapts to workload patterns — compiling code and watching a video have very different thermal profiles but identical fan responses.
The Solution
I built Vora as a privilege-separated system: a root-level Rust daemon that reads hwmon/sysfs sensor data and controls fan PWM values, communicating with an unprivileged Tauri UI over Unix domain sockets.
- PID control loop — Proportional-integral-derivative controller that smoothly adjusts fan speed based on temperature trajectory, not just current temperature. This prevents the annoying fan spin-up/spin-down oscillation.
- Workload classification — Categorizes current system load (idle, light, sustained, burst) and adjusts PID tuning parameters accordingly.
- Real-time dashboard with live thermal gauges, historical charts, and manual profile overrides using React 19, Recharts, and Framer Motion.
- Safety-critical constraints — A 90°C thermal floor guarantees fans ramp to maximum regardless of the active profile. Graceful handoff to BIOS/EC defaults on daemon exit ensures fans never stay off after a crash.
What Went Wrong
The initial Unix domain socket implementation used synchronous I/O in the daemon. When the UI requested a burst of historical data, the daemon would block on the socket write and miss a PID control cycle, causing a brief temperature spike before the next adjustment.
The fix: I migrated the daemon's socket handling to Tokio async I/O, decoupling the control loop from UI communication. The PID controller runs on its own Tokio task with a guaranteed timer interval, and UI requests are served concurrently without blocking the control path.
Results
- Privilege-separated architecture — Root daemon + unprivileged UI over Unix sockets
- Smooth fan curves that adapt to workload patterns
- 90°C thermal safety floor with graceful BIOS handoff on exit
- Real-time dashboard with live sensor visualization
Interested in working together?
Let's Talk