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.

RustTauri v2ReactTypeScriptTokiosystemd

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