The fan curve is currently hard-coded in system76-power . It will be configurable in the near future. However, the fans shouldn't be loud with the default fan curve. Answer from mmstick on reddit.com
🌐
System76 Support
support.system76.com › articles › fan-noise
System Fan Noise and Expectactions - System76 Support
April 13, 2026 - System76 sets custom fan curves for laptops to maximize their performance while minimizing fan noise. Current firmware keeps the fan off until 65°C and will ramp the fan speeds to max speed by 90°C. ... Ubuntu Software applications.
🌐
Reddit
reddit.com › r/system76 › fan control!
r/System76 on Reddit: Fan Control!
April 13, 2021 -

Little background: I have a lemp10 and I think it's sweet. It is awfully loud though and I don't mean the speakers. It has a preference to be silent as long as possible and then airing everything all at once. This isn't considered good in a relationship and I want to have a good relationship with this laptop.

I don't have a silver bullet, but I thought to post some of my musing and my collect some ideas. From what I can tell, fan control happens in a few steps. I'm going to throw around the term "PWM" and the important thing here is that I'm talking fan control, and 0 means off, 100 means window-shattering, and in between means in between. (And I always am referring to the PWM duty cycle here) These steps occur once per second:

  1. Read the CPU temperature.

  2. Translate the temperature read into a desired PWM.

  3. Feed that PWM into the fan control module, which uses a algorithm with history to give a proper PWM to apply to the fans.

I think all of steps can be improved upon, however they all have merit as well. (For example the algorithm which is in place is good at reacting quickly when the CPU temperature had been rising, but is now falling. The algorithm is slow at reacting to quick temperature rises (though it is tune-able).)

Input temperatures and requested PWMs

The way this translation works is that there are a number of set points. One such set point states "At 70 degrees C the fan PWM shall be 40%". There is interpolation between the set points, though not before or after. So if you manage to sit at exactly 69 C, your fan will never turn on.

(Left is degrees Celsius, right is PWM duty cycle as a %; I have not learned how to label my axes yet.. x axis is seconds)

If you have used a lemp10, you probably already knew what this curve was going to look like. In red, we see the actual temperature as reported by the processor. In blue, the PWM that we're requesting given the table above. In yellow, the reaction by the PWM algorithm. The good: The actual PWM doesn't actually ever hit the requested of 100% PWM, saving us decibels. The bad is that most of the time the fan is on, it probably shouldn't be. At least not to the extent that it is. There is a 9-second delay here for both the turn-on and the turn-off time for the default algorithm. The default algorithm utilizes the previous 9 seconds worth of data, so it's not a shock. You can see the algorithm jumped straight to 40% PWM like was requested (albeit 9 seconds after it was requested).

Is this broken? Is there a problem to fix?

Maybe. It depends of course on what you're looking for. Your laptop is (probably) not going to melt. That PWM curve will hit 100% with the right input data. The default algorithm is actually fantastic at some data sets, perhaps just not the one above. For me personally, I would want to score an algorithm on a few factors:

  1. Slow changes in increases of PWM. 0-40% in one second? Sorry could you repeat that? I missed what you said because the call didn't compensate fast enough.

  2. Lower total area beneath the actual PWM curve.

  3. Low hysteresis. (This is when the fan speed toggles back and fourth between two PWMs in response to temperature doing the same in response to fan speed doing the same in response to..)

So, what are the options? All data below is produced in Python uses models (i.e. copies) of the C code referenced. The input data is fixed, non-reactionary to show how the system would behave.

  1. Change the fan setpoints. For example. If we add a setpoint at 60 for 20% PWM duty, our step up is both sooner, and less violent. The PWM does linger at the end though.

New set point at 60C, 20%

2) Reduce the lag in the algorithm (the road to hell...)

The intentions were good

Okay I admit it. THIS is what the fan sounds like to me. Yes we react sooner but we also exaggerate our accumulated response. Here the data buffer was decreased from 10 seconds to 5 seconds.

3) Use a modified window average algorithm instead

Modified window average where new values are weighted

None of the graphs above show the actual temperature curve in response to the algorithm. In reality, the curve of the temperature will react, so I am really just analyzing how the algorithms react in response to the input. My gut-feel is that the red curve would react downwards to the last graph the most promptly, resulting in a lower overall green graph.

For another option, as far as I can tell, the 1-second interval for reading the temperature data and modifying the output PWM is arbitrary. There is code runs in a tight loop in a microcontroller. Its loop is responsible for reading the AC power state, battery state, lid position, and keyboard state. These activities occur as fast as the microcontroller can spin. Once per second, it additionally queries the temperature from the processor and possibly sets the fan PWM. However looking at the raw temperature data, it's highly variable. I captured a fans-not-on-yet sequence of 60C, 62C, 91C, 75C, 65C. I haven't been able to rationalize this yet.

------

My next steps: I want to come up with some repeatable use cases. I don't have the ability to do debugging here, but what I can do is apply different algorithms and parameters, and measure the processor temperature and fan PWM (which should correlate to the PWM reasonably-well). I would love suggestions for repeatable use cases, or different algorithms to attempt. The modeling code is rudimentary but I'm happy to share with anyone who is interested. I think some people might be interested in the battery implications of fan curves. SO far I've been super happy with my lemp10's battery. I don't know what fan is in the system. If anyone happens to know what the fan is, please reply below and I'll check it out.

Thanks

🌐
System76
tech-docs.system76.com › models › thelio-mira-b1.0 › repairs.html
Parts & Repairs - System76 Technical Documentation
The Thelio-IO board handles the front power button, fan control, and 2.5“ SATA connectors for the system.
🌐
GitHub
github.com › gdoteof › system76-galapago-pro-fan-unfucker
GitHub - gdoteof/system76-galapago-pro-fan-unfucker: Ubuntu fan control indicator for Clevo laptops
It shows the CPU temperature on the left and the GPU temperature on the right, and a menu for manual control. For command-line, use -h to display help, or a number representing percentage of fan duty to control the fan (from 40% to 100%).
Starred by 16 users
Forked by 3 users
Languages   C 96.0% | Makefile 4.0% | C 96.0% | Makefile 4.0%
🌐
Reddit
reddit.com › r/system76 › fix for loud fans
r/System76 on Reddit: Fix for Loud Fans
March 9, 2023 -

A week ago i posted about loud fan noise. Here is how i was finally able to address it.

The cause of the noise

There are three factors that are cooperating to create a loud fan:

  1. The fans are just loud at high RPM (they do cool well but whine like a tiny jet engine at 5000 rpm)

  2. Intel turbo (frequency boost) can quickly double the wattage used when the system starts to load

  3. The fan curve

We can only fix 3), by changing the firmware and flashing.

The problem with the built-in fan curves

Inexplicably, the built-in curves have a 5 second delay for gazelle. This means, if your chip goes turbo, it will take 5 seconds before the fan will react. By that time, the temperature will have already spiked to 80-90 C. https://github.com/system76/ec/blob/2a8befc195cd821232d2934593d29337e4eddb3e/src/board/system76/gaze17-3060/board.mk

There is also a 20 second cooldown, which means the fan continues to spin for 20 seconds, even when the chip has already cooled down.

Helpful tools:

  • psensor a graphical hardware temperature monitor for Linux.

  • i7z a small open source utility that reports Intel Core i7, i5, i3 CPU information.

  • hardinfo a system profiler and benchmark graphical tool for Linux systems

How to flash firmware:

This article explains how to do it.

https://devimalplanet.com/guide-how-to-adjust-the-fan-curve-on-system76-laptops

But i recommend adding points so the fan starts spinning at 10% immediately when the temp rises above idle. So heatup=0. And cooldown maybe 5.

Mine doesn't go to 100% until the temp is 5% away from the throttling temp of the processor (Look up your particular processor to find it)

This keeps the fan below 50% in most circumstances because it can start spinning immediately, rather than twiddling its thumbs while the cpu has time to get piping hot.

Note: i may be mischaracterizing the heatup/cooldown, because it may be a rampup/rampdown rather than instant rpm. Nevertheless i get a much quieter fan if i start it spinning at a lower temp.

🌐
GitHub
github.com › system76 › ec › issues › 163
Oryx Pro Fan Curve Improvement · Issue #163 · system76/ec
March 4, 2021 - System76 Support wrote: "After updating your firmware, you should have manual control over the fans' turbo speed with the Fn + 1 shortcut, however at this time we still do not have fan curves exposed from within the firmware."
Author   system76
🌐
Reddit
reddit.com › r/system76 › thelio - any way to control the fan speed?
r/System76 on Reddit: Thelio - any way to control the fan speed?
January 18, 2019 -

I just got a thelio and the CPU fan is rather loud even on idle. I poked around in the BIOS and found that I could tweak the fan to be very quiet at lower temps (<50c). However as soon as the system boots these settings appear ignored. I understand the thelio io chip is supposed to control these things. Is there any way to tweak it.

Top answer
1 of 2
3
The fan curve is currently hard-coded in system76-power . It will be configurable in the near future. However, the fans shouldn't be loud with the default fan curve.
2 of 2
1
I played around with it quite a bit. I ended up just wiring the CPU fan to the motherboard directly instead of through the thelio io chip. This makes the BIOS changes stick. I set the fan to just turn off at <45c temps. It works - the device is super quiet when idle and at slow speeds. It gets louder under high load which is expected. My takeaways: I like the system a lot aside from this The loud fan is specifically the 80mm CPU fan that comes with the i7-9700k selection. It's the fan from the Freezer 12 CPU cooler. Even at it's lowest speed it seems unusually loud. The other fans are quiet. It's not broken or rattling. To give some measurement of how loud, I can barely hear it from my kitchen about 30 feet away. Other reviews of the cooler say it gets "noticeably loud" at 1500 RPM The default BIOS settings are just as aggressive as thelio io. But of course the BIOS doesn't know what type of cooler is installed. These settings from thelio io and the default BIOS are IMO too conservative for a cooler that is marketed as "passive/active". I can't find any way to control the CPU fan when plugged into thelio io. This line makes me think I could just edit that file. I can clearly see pwm1 is the cpu fan control. I can read it. But I can't seem to write to it. Possibly something else is just overriding it instantly. In theory I like the idea of thelio io but I wish it had either an end user friendly app to control it or at least some idea of how to do it programmatically. Perhaps System76 should consider tweaking the thelio io's fan settings when used with this cooler. It should probably not run at all or at a very low RPM when idle.
🌐
Gentoo Forums
forums.gentoo.org › board index › assistance › kernel & hardware
fan issues on system76 gazelle - Gentoo Forums
gentoo-gazelle rican-linux # pwmconfig # pwmconfig revision 6166 (2013-05-01) This program will search your sensors for pulse width modulation (pwm) controls, and test each one to see if it controls a fan on your motherboard. Note that many motherboards do not have pwm circuitry installed, even if your sensor chip supports pwm.
Find elsewhere
🌐
Arch Linux Forums
bbs.archlinux.org › viewtopic.php
System76 Oryx Pro (oryx5): Fan Speed - Suspend fix it temporarily / Newbie Corner / Arch Linux Forums
Edit1: Suspending the laptop fix the fan speed problem. It change the CPU fan and reactivate the GPU fan, both around 2k RPM instead of only the CPU at 6k RPM.
🌐
System76
tech-docs.system76.com › models › thelio-b4 › repairs.html
Thelio (Parts & Repairs) | System76 Technical Documentation
The Thelio-IO board handles the front power button, fan control, and 2.5” SATA connectors for the system.
🌐
GitLab
gitlab.freedesktop.org › upower › power-profiles-daemon › #66
Fan support on a System76 Thelio (#66) · Issue · upower/power-profiles-daemon
November 19, 2021 - I noticed that power-profile-daemon claims to conflict with system76-power. When I'm not running system76-power, my desktop fans seem to be running a full speed. Is there anything I can do to help make sure that power-profile-daemon correctly controls the fans on this device?
🌐
GitHub
github.com › system76 › thelio-io-firmware › issues › 4
Case fan control in windows · Issue #4 · system76/thelio-io-firmware
June 17, 2020 - Customer is using a Thelio Major R1 in windows and the case fans are not falling back to BIOS control. The CPU fan seems to work as expected.
Author   system76
🌐
ArchWiki
wiki.archlinux.org › title › System76_Oryx_Pro
System76 Oryx Pro - ArchWiki
February 10, 2026 - The default fan curve for the all System76 computers is designed to minimize noise (source). Unfortunately, in the Oryx Pro's case, this goal is taken to an extreme: by default, the fans will only reach 100% at 90°C; and your CPU starts to throttle well before that point.
🌐
Reddit
reddit.com › r/system76 › super secret, and incredibly useful shortcut for all system76 laptop owners
r/System76 on Reddit: Super secret, and incredibly useful shortcut for all System76 Laptop owners
June 29, 2023 -

Ever wanted to cool down your laptop quickly?
ever wanted to quickly change your fan speed?

Yes, this is not so easy with System76 laptops... but this post has a nice quick tip for you all.

While looking into a custom fan curve for my Lemur Pro, I was talking with u/Hyperair who was very kind to walk me through the process of flashing a custom firmware build to my laptop.

During the process he told me a super amazing keyboard shortcut to turn the fans up full for however long you want, and quickly turn them back to normal.

Fn+ 1

Try it and see!

An easy way to boost performance temporarily when doing something heavy, or to give your legs or wrists a break from the heat.

Just press "Fn + 1" to quickly toggle between default and 100% fans.

You can thank me by clicking the like button
v ( ^ _ < )

🌐
GitHub
github.com › mmt050 › clevo-fancontrol
GitHub - mmt050/clevo-fancontrol: Clevo (and some System76 models) fan-control service · GitHub
This further allows me to write a more sophisticated PID-controller thermal algo in higher language (like python) and only use this to translate to the EmbeddedController by clevo, which the original project already handled. The built-in curve setting works great with Ryzen 5700U S76 Pangolin (pang11). My need is to have a setpoint of 60deg, and turn off the fans below 50deg.
Forked by 3 users
Languages   C 67.8% | Python 29.0% | Makefile 3.2%
🌐
Jaketrent
jaketrent.com › post › reduce-system76-fan-noise
Reduce System76 Fan Noise - Jake Trent
December 11, 2023 - system76-power profile Power Profile: Battery CPU: 8% - 50%, No Turbo Backlight acpi_video0: 19/19 = 100% Keyboard Backlight system76_acpi::kbd_backlight: 0/255 = 0% No turbo: brings the fan way down!
🌐
GitHub
github.com › system76 › ec › issues › 180
Discussion: Optimal Fan Curves · Issue #180 · system76/ec
April 21, 2021 - The highest value should always be 100%, unless that speed is broken for a given model's fans. Currently, most System76 models seem to have this placed at around 90'C.
Author   system76
🌐
NixOS Discourse
discourse.nixos.org › help
Very high fan noises on nixOS using a system76 thelio - Help - NixOS Discourse
December 9, 2022 - I have a thelio, popOS was on it before and everything was perfect. when I switched to nixos I noticed the fans were always running at a fast speed even when I am not doing anything. so I enabled this option hardware.system76.enable.all = true and rebooted, a few good things happened (that I noticed) the packages system76-power and system76-firmware were installed their services were enabled respectively the bad things I noticed: the fans were still loud running system76-power profile retu...