<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Wi-Fi 7 on Wojciech Marusiak IT Blog</title>
        <link>https://www.wojcieh.net/tags/wi-fi-7/</link>
        <description>Recent content in Wi-Fi 7 on Wojciech Marusiak IT Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Wed, 04 Nov 2026 10:00:00 +0100</lastBuildDate><atom:link href="https://www.wojcieh.net/tags/wi-fi-7/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Goodbye Windows 11 (Part 2): Living on CachyOS Linux with Zen 5 znver4, MediaTek MT7927 Wi-Fi 7, TPM 2.0 Face Auth, and Antigravity AI</title>
        <link>https://www.wojcieh.net/living-on-cachyos-linux-zen-5-znver4-tpm2-face-auth-ai-workstation/</link>
        <pubDate>Wed, 04 Nov 2026 10:00:00 +0100</pubDate>
        
        <guid>https://www.wojcieh.net/living-on-cachyos-linux-zen-5-znver4-tpm2-face-auth-ai-workstation/</guid>
        <category>CachyOS</category>
        <category>Linux</category>
        <category>AMD</category>
        <category>Ryzen</category>
        <category>Radeon</category>
        <category>KDE Plasma</category>
        <category>TPM 2.0</category>
        <category>OpenRGB</category>
        <category>Wi-Fi 7</category>
        <category>Antigravity</category>
        <category>MCP</category>
        <category>Linux &amp; Open Source</category>
        <category>Hardware &amp; HomeLab</category>
        <category>AI &amp; LLM Ops</category>
        <description>&lt;p&gt;&lt;img src=&#34;https://www.wojcieh.net/images/uploads/2026/11/cachyos-linux-daily-driver-znver4-ai-workstation.webp&#34;
	
	
	
	loading=&#34;lazy&#34;
	
		alt=&#34;Goodbye Windows 11 (Part 2): Living on CachyOS Linux with Zen 5 znver4, TPM 2.0 Face Auth, and Antigravity AI&#34;
	
	
&gt;&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.wojcieh.net/goodbye-windows-11-am5-zen-5-workstation-cachyos-linux/&#34; &gt;Part 1 of this series&lt;/a&gt;&lt;/strong&gt;, I covered why I finally dropped Windows 11, how I built my all-AMD Zen 5 (&lt;code&gt;Ryzen 7 9700X&lt;/code&gt;) and RDNA 3 (&lt;code&gt;ASUS TUF Gaming Radeon RX 7900 XTX&lt;/code&gt;) workstation inside a Fractal Design Vector RS case, how a rigid &lt;strong&gt;Thermalright M.2 Pro&lt;/strong&gt; heatsink stopped my single-sided 4 TB Samsung 990 PRO from bending, why I skipped ASUS&amp;rsquo;s proprietary Q-Antenna connectors, and how I set up custom UEFI Secure Boot keys alongside TPM 2.0.&lt;/p&gt;
&lt;p&gt;In today&amp;rsquo;s post, I will walk through the Linux operating system and daily engineering setup: why &lt;strong&gt;CachyOS&lt;/strong&gt;&amp;rsquo;s &lt;code&gt;znver4&lt;/code&gt; repositories make a noticeable difference on Zen 5, getting the &lt;strong&gt;MediaTek MT7927&lt;/strong&gt; Wi-Fi 7 and Bluetooth 5.4 PCIe card working, recovering from an AMD fTPM CPU-swap lockout (&lt;code&gt;0x000001df&lt;/code&gt;) in &lt;strong&gt;Gaze&lt;/strong&gt; facial authentication, controlling 9 ARGB zones with &lt;strong&gt;OpenRGB&lt;/strong&gt;, tuning &lt;strong&gt;KDE Plasma 6&lt;/strong&gt; on a 40-inch 5K2K ultrawide, and running my &lt;strong&gt;Antigravity AI&lt;/strong&gt; + MCP homelab stack natively on Linux.&lt;/p&gt;
&lt;h2 id=&#34;why-cachyos-x86_64_v4--znver4&#34;&gt;Why CachyOS? (&lt;code&gt;x86_64_v4&lt;/code&gt; &amp;amp; &lt;code&gt;znver4&lt;/code&gt;)
&lt;/h2&gt;&lt;p&gt;When picking a Linux distribution for a Zen 5 processor, keep in mind that most mainstream distributions (Ubuntu, Fedora, vanilla Arch) still compile their binary packages for the baseline &lt;code&gt;x86_64&lt;/code&gt; (&lt;code&gt;v1&lt;/code&gt;) instruction set from twenty years ago. That leaves modern instruction sets like AVX2 and 512-bit AVX-512 unused in system libraries unless you compile packages from source.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CachyOS&lt;/strong&gt; (an Arch Linux derivative) fixes this at the repository level:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Architecture-Optimized Repositories (&lt;code&gt;cachyos-znver4&lt;/code&gt; / &lt;code&gt;cachyos-v4&lt;/code&gt;):&lt;/strong&gt; Core system libraries (&lt;code&gt;glibc&lt;/code&gt;, &lt;code&gt;openssl&lt;/code&gt;, &lt;code&gt;zstd&lt;/code&gt;), compilers (&lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;clang&lt;/code&gt;, &lt;code&gt;rust&lt;/code&gt;), browsers, and desktop packages are compiled specifically for AMD Zen 4/Zen 5 (&lt;code&gt;znver4&lt;/code&gt;) and &lt;code&gt;x86_64_v4&lt;/code&gt; instruction sets with LTO (Link-Time Optimization) and PGO (Profile-Guided Optimization).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The &lt;code&gt;linux-cachyos&lt;/code&gt; Kernel (&lt;code&gt;7.3.x&lt;/code&gt;):&lt;/strong&gt; Ships with the &lt;strong&gt;BORE (Burst-Oriented Response Enhancer)&lt;/strong&gt; CPU scheduler, which keeps interactive desktop responsiveness and Wayland frame pacing smooth even when background builds or AI indexing jobs peg all 16 threads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Btrfs + Zstd + zram by Default:&lt;/strong&gt; Out of the box, the root (&lt;code&gt;@&lt;/code&gt;) and home (&lt;code&gt;@home&lt;/code&gt;) subvolumes use &lt;code&gt;Btrfs&lt;/code&gt; with transparent &lt;code&gt;zstd&lt;/code&gt; compression and &lt;code&gt;noatime&lt;/code&gt;, paired with &lt;strong&gt;Snapper&lt;/strong&gt; + &lt;strong&gt;Btrfs Assistant&lt;/strong&gt; for atomic rollbacks and a 30.5 GB compressed RAM swap device (&lt;code&gt;zram0&lt;/code&gt;) instead of wearing out the NVMe with swap writes.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-mediatek-mt7927-wi-fi-7--bluetooth-54-on-linux-tp-link-archer-tbe550e&#34;&gt;1. MediaTek MT7927 Wi-Fi 7 &amp;amp; Bluetooth 5.4 on Linux (&lt;code&gt;TP-Link Archer TBE550E&lt;/code&gt;)
&lt;/h2&gt;&lt;p&gt;As I covered in Part 1, I disabled the motherboard&amp;rsquo;s onboard Realtek Wi-Fi controller to avoid ASUS&amp;rsquo;s proprietary plastic Q-Antenna plugs and installed a &lt;strong&gt;TP-Link Archer TBE550E&lt;/strong&gt; PCIe card, which pairs the &lt;strong&gt;MediaTek MT7927&lt;/strong&gt; (Wi-Fi 7) and &lt;strong&gt;MT6639&lt;/strong&gt; (Bluetooth 5.4) chipset with standard brass &lt;strong&gt;RP-SMA&lt;/strong&gt; connectors.&lt;/p&gt;
&lt;p&gt;On &lt;code&gt;linux-cachyos&lt;/code&gt; (&lt;code&gt;7.2+&lt;/code&gt; / &lt;code&gt;7.3+&lt;/code&gt;), the &lt;code&gt;mt76&lt;/code&gt; (&lt;code&gt;mt7925e&lt;/code&gt;) Wi-Fi driver initialized the &lt;strong&gt;MT7927&lt;/strong&gt; PCIe controller (&lt;code&gt;14c3:7927&lt;/code&gt;) right out of the box. Connected to my UniFi U6-Pro access point on a 160 MHz 5 GHz channel (&lt;code&gt;ch 40, 5200 MHz&lt;/code&gt;) with &lt;code&gt;WPA3-SAE&lt;/code&gt;, it negotiated a &lt;strong&gt;2.401 Gbps TX / 2.161 Gbps RX&lt;/strong&gt; physical link and saturated the AP&amp;rsquo;s 1 GbE uplink at &lt;strong&gt;759 Mbps TCP&lt;/strong&gt; (&lt;code&gt;iperf3 -P 4&lt;/code&gt;) with a &lt;strong&gt;2.6 ms&lt;/strong&gt; ping to my Unraid NAS.&lt;/p&gt;
&lt;p&gt;Bluetooth 5.4, however, failed to initialize at boot. Checking &lt;code&gt;dmesg&lt;/code&gt; showed the missing firmware path:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bluetooth hci0: Direct firmware load for mediatek/mt7927/BT_RAM_CODE_MT6639_2_1_hdr.bin failed with error -2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Even though the PCIe card is sold by TP-Link, the internal USB Bluetooth 5.4 controller exposes a &lt;strong&gt;Foxconn / Hon Hai&lt;/strong&gt; USB ID (&lt;code&gt;0489:e13a&lt;/code&gt;) that expects MediaTek&amp;rsquo;s &lt;code&gt;MT6639&lt;/code&gt; RAM patch. Extracting &lt;code&gt;BT_RAM_CODE_MT6639_2_1_hdr.bin&lt;/code&gt;, copying it into &lt;code&gt;/usr/lib/firmware/mediatek/mt7927/&lt;/code&gt;, and reloading &lt;code&gt;btusb&lt;/code&gt; (&lt;code&gt;sudo modprobe -r btusb &amp;amp;&amp;amp; sudo modprobe btusb&lt;/code&gt;) brought Bluetooth 5.4 (&lt;code&gt;hci0&lt;/code&gt;) online permanently:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Bluetooth: hci0: Device setup in 148089 usecs
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Bluetooth: MGMT ver 1.23
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; The small 38 MB USB thumb drive included inside the TP-Link Archer TBE550E box (&lt;code&gt;048d:1234&lt;/code&gt;, Integrated Technology Express) is only a read-only Windows driver ISO, not a Bluetooth receiver. Leave it in the box so it does not clutter &lt;code&gt;lsblk&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-biometric-face-authentication-gaze-the-amd-ftpm-cpu-swap-reset-0x000001df-and-usb-hub-bandwidth&#34;&gt;2. Biometric Face Authentication (&lt;code&gt;Gaze&lt;/code&gt;), The AMD fTPM CPU-Swap Reset (&lt;code&gt;0x000001df&lt;/code&gt;), and USB Hub Bandwidth
&lt;/h2&gt;&lt;p&gt;To replace Windows Hello on Linux, I use &lt;strong&gt;Gaze&lt;/strong&gt; (&lt;code&gt;gazed.service&lt;/code&gt; by Gundu Labs). It runs local ONNX facial recognition (&lt;code&gt;w600k_r50.onnx&lt;/code&gt; ArcFace + YuNet face detection + MiniFASNet anti-spoofing liveness detection) and hooks &lt;code&gt;pam_gaze.so&lt;/code&gt; into &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt;, &lt;code&gt;/etc/pam.d/polkit-1&lt;/code&gt;, and &lt;code&gt;/etc/pam.d/kde&lt;/code&gt;, letting me authenticate &lt;code&gt;sudo&lt;/code&gt; in the terminal and unlock the KDE lockscreen by looking at my &lt;strong&gt;Logitech BRIO 4K&lt;/strong&gt; webcam.&lt;/p&gt;
&lt;h3 id=&#34;the-amd-ftpm-cpu-swap-reset-0x000001df-integrity-check-failed&#34;&gt;The AMD fTPM CPU Swap Reset (&lt;code&gt;0x000001df: integrity check failed&lt;/code&gt;)
&lt;/h3&gt;&lt;p&gt;The nastiest TPM surprise happened right after I swapped my hardware from the old &lt;strong&gt;Ryzen 7 5800X (AM4 / B550)&lt;/strong&gt; to the new &lt;strong&gt;Ryzen 7 9700X (AM5 / ASUS TUF B850-PLUS)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Unlike a discrete plug-in SPI TPM 2.0 module that you can unplug from an old motherboard and move to a new one, &lt;strong&gt;AMD fTPM&lt;/strong&gt; runs inside the CPU&amp;rsquo;s on-die AMD Secure Processor (ASP/PSP) and stores its non-volatile state in the motherboard&amp;rsquo;s SPI flash. The first time I powered on the new AM5 build, the BIOS stopped with the familiar prompt:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;New CPU installed, fTPM/PSP NV corrupted or fTPM/PSP NV structure changed. Press Y to reset fTPM.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pressing &lt;code&gt;Y&lt;/code&gt; initialized a brand-new fTPM 2.0 instance with a new cryptographic &lt;strong&gt;Storage Root Key (SRK)&lt;/strong&gt; and primary seed on &lt;code&gt;/dev/tpmrm0&lt;/code&gt;. CachyOS booted fine from the Samsung 990 PRO NVMe, &lt;strong&gt;but my facial biometric authentication (&lt;code&gt;Gaze&lt;/code&gt;) broke completely&lt;/strong&gt;. Worse, every time my webcam tried to unlock the KDE lockscreen or &lt;code&gt;sudo&lt;/code&gt;, my user account got locked out.&lt;/p&gt;
&lt;p&gt;Gaze (&lt;code&gt;gazed.service&lt;/code&gt;) seals its encrypted biometric key blobs in &lt;code&gt;/var/lib/gaze/tpm&lt;/code&gt; against the hardware TPM&amp;rsquo;s primary key using the TPM2 Software Stack (&lt;code&gt;tss-esapi&lt;/code&gt;: &lt;code&gt;Esys_CreatePrimary&lt;/code&gt;, &lt;code&gt;Esys_Load&lt;/code&gt;, &lt;code&gt;Esys_Unseal&lt;/code&gt; on &lt;code&gt;/dev/tpmrm0&lt;/code&gt;) instead of storing facial templates on disk in plaintext. Checking &lt;code&gt;journalctl -u gazed.service&lt;/code&gt; showed the exact cryptographic error when the new Ryzen 9700X&amp;rsquo;s fTPM tried to load the blobs sealed by the old Ryzen 5800X:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WARN tss_esapi::context::tpm_commands::object_commands: Error: Tss2_RC(0x000001df) - tpm:parameter(1):integrity check failed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR gazed: TPM Load/Unseal failed: credential unavailable: account password changed, wrong TPM, or corrupt record
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Because &lt;code&gt;pam_gaze.so&lt;/code&gt; sat at the top of &lt;code&gt;/etc/pam.d/kde&lt;/code&gt; and &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt;, every &lt;code&gt;0x000001df&lt;/code&gt; TPM unseal error counted as a failed authentication attempt in PAM. After three failed wakeups, &lt;code&gt;pam_faillock&lt;/code&gt; (&lt;code&gt;deny = 3&lt;/code&gt;, &lt;code&gt;unlock_time = 600&lt;/code&gt;) triggered and locked my user account out of both password and biometric login for 10 minutes.&lt;/p&gt;
&lt;p&gt;To recover from an fTPM hardware reset on Linux, clear the old TPM-wrapped state so the daemon generates a new primary key under the new CPU&amp;rsquo;s fTPM seed:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo faillock --user wojcieh --reset
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl stop gazed.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rm -rf /var/lib/gaze/tpm /var/lib/gaze/users
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl start gazed.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo gaze add-face default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;three-tweaks-for-fast-reliable-biometric-unlock&#34;&gt;Three Tweaks for Fast, Reliable Biometric Unlock
&lt;/h3&gt;&lt;p&gt;Getting &lt;code&gt;Gaze&lt;/code&gt; to work reliably in daily use took three additional changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tuning &lt;code&gt;/etc/gaze/config.toml&lt;/code&gt; for Room Lighting:&lt;/strong&gt; The default config adds a 1500 ms startup delay and sets &lt;code&gt;liveness.threshold = 0.85&lt;/code&gt;, which is too strict for a standard RGB webcam while auto-exposure warms up. Dropping &lt;code&gt;start_delay_ms = 0&lt;/code&gt;, &lt;code&gt;liveness.threshold = 0.70&lt;/code&gt;, and &lt;code&gt;dark_luma_threshold = 12&lt;/code&gt; cut authentication time down to &lt;strong&gt;~600 ms&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Relaxing &lt;code&gt;pam_faillock&lt;/code&gt; Thresholds:&lt;/strong&gt; By default on Arch/CachyOS, &lt;code&gt;/etc/security/faillock.conf&lt;/code&gt; locks your user account for &lt;strong&gt;10 minutes (&lt;code&gt;unlock_time = 600&lt;/code&gt;)&lt;/strong&gt; after &lt;strong&gt;3 failed attempts (&lt;code&gt;deny = 3&lt;/code&gt;)&lt;/strong&gt;. If you walk away from the PC or trigger the lockscreen in a dark room three times, &lt;code&gt;pam_faillock&lt;/code&gt; blocks both password and biometric login for 10 minutes. Setting &lt;code&gt;deny = 10&lt;/code&gt; and &lt;code&gt;unlock_time = 60&lt;/code&gt; in &lt;code&gt;/etc/security/faillock.conf&lt;/code&gt; fixed that.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Unpowered USB Hub Trap:&lt;/strong&gt; While cleaning up my desk cables, I plugged my Logitech BRIO 4K webcam into an external 4-port USB 3.0 hub (&lt;code&gt;ASMedia ASM1074&lt;/code&gt;). Immediately, &lt;code&gt;gaze&lt;/code&gt; stopped working and &lt;code&gt;journalctl&lt;/code&gt; filled with &lt;code&gt;uvcvideo 3-2.1:1.3: cannot get freq at ep 0x84 (err -110)&lt;/code&gt;. High-bandwidth webcams like the BRIO draw up to 900 mA during sensor initialization and reserve large chunks of synchronous USB bandwidth; sharing an unpowered hub with wireless mouse and keyboard receivers causes voltage drops that hang the camera&amp;rsquo;s internal controller. Moving the BRIO back to a rear motherboard USB 3.2 port solved it right away.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-silencing-unused-motherboard-sensors-nct6799--9-zone-openrgb&#34;&gt;3. Silencing Unused Motherboard Sensors (&lt;code&gt;nct6799&lt;/code&gt;) &amp;amp; 9-Zone OpenRGB
&lt;/h2&gt;&lt;p&gt;My Fractal Vector RS case routes all chassis fans through a &lt;strong&gt;Nexus+ PWM fan hub&lt;/strong&gt; connected to the motherboard&amp;rsquo;s &lt;code&gt;CPU_OPT&lt;/code&gt; header (&lt;code&gt;fan5&lt;/code&gt;), while the Noctua NH-D15 dual-tower cooler sits on &lt;code&gt;CPU_FAN&lt;/code&gt; (&lt;code&gt;fan2&lt;/code&gt; / &lt;code&gt;pwm2&lt;/code&gt;). On the ASUS TUF B850-PLUS, &lt;code&gt;CPU_OPT&lt;/code&gt; mirrors the PWM duty cycle of &lt;code&gt;CPU_FAN&lt;/code&gt; in hardware, so a single curve on &lt;code&gt;pwm2&lt;/code&gt; scales both the CPU cooler (725 -&amp;gt; 1256 RPM) and the chassis intake/exhaust fans (749 -&amp;gt; 1481 RPM) together. Meanwhile, the ASUS TUF Gaming Radeon RX 7900 XTX runs passively (&lt;strong&gt;0 RPM&lt;/strong&gt; at 39°C core / 48°C hotspot) until a game puts load on the GPU.&lt;/p&gt;
&lt;p&gt;To clean up &lt;code&gt;sensors&lt;/code&gt; and &lt;strong&gt;CoolerControl&lt;/strong&gt; so unused fan headers do not show &lt;code&gt;0 RPM&lt;/code&gt; clutter, I created &lt;code&gt;/etc/sensors.d/nct6799.conf&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chip &amp;#34;nct6799-*&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    label fan2 &amp;#34;CPU (Noctua NH-D15)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    label fan5 &amp;#34;Chassis (Fractal Nexus+)&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ignore fan1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ignore fan3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ignore fan4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ignore fan6
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ignore fan7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For lighting, &lt;strong&gt;OpenRGB 1.0&lt;/strong&gt; with the &lt;strong&gt;OpenRGB Effects Plugin&lt;/strong&gt; controls all 9 zones across 6 devices (motherboard &lt;code&gt;0b05:19af&lt;/code&gt;, Fractal Vector RS 120-LED ARGB strip, chassis ARGB fan, G.SKILL Trident Z5 Neo RGB DDR5 RAM on &lt;code&gt;/dev/i2c-14&lt;/code&gt;, RX 7900 XTX, TUF K7 keyboard, and Gladius III mouse) using a crimson/red &lt;code&gt;Starry Night&lt;/code&gt; profile. Two gotchas to watch out for if your ASUS Aura lighting goes dark after a motherboard swap or BIOS update:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Pressing &lt;code&gt;F4&lt;/code&gt; inside the ASUS UEFI BIOS toggles Aura into &lt;em&gt;Stealth Mode&lt;/em&gt;, which cuts power to the onboard ARGB headers even in Linux. Set &lt;code&gt;When system is in working state (S0)&lt;/code&gt; to &lt;code&gt;All On&lt;/code&gt; in BIOS and do a 10-second cold PSU power cycle to reset the Aura controller&amp;rsquo;s EEPROM.&lt;/li&gt;
&lt;li&gt;Make sure &lt;code&gt;&amp;quot;exit_profile&amp;quot;&lt;/code&gt; is not pointing to a blank profile in &lt;code&gt;~/.config/OpenRGB/OpenRGB.json&lt;/code&gt;, otherwise closing the OpenRGB window will send &lt;code&gt;#000000&lt;/code&gt; (off) to every LED in your case.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-kde-plasma-6-on-5k2k-wayland-pipewire-audio--the-passwd--kwallet-gotcha&#34;&gt;4. KDE Plasma 6 on 5K2K Wayland, PipeWire Audio, &amp;amp; The &lt;code&gt;passwd&lt;/code&gt; + &lt;code&gt;KWallet&lt;/code&gt; Gotcha
&lt;/h2&gt;&lt;p&gt;Running a 40-inch &lt;strong&gt;5K2K (&lt;code&gt;5120x2160&lt;/code&gt; @ 120 Hz)&lt;/strong&gt; ultrawide monitor on KDE Plasma 6 (Wayland) with 160% fractional scaling is sharp and tear-free on the open-source AMD &lt;code&gt;amdgpu&lt;/code&gt; driver. My desktop configuration stays minimal:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Application Style &amp;amp; Window Decorations:&lt;/strong&gt; &lt;code&gt;Darkly&lt;/code&gt; (&lt;code&gt;darkly-bin&lt;/code&gt;) with subtle window translucency and blur, paired with &lt;code&gt;Breeze-Round-Chameleon Dark&lt;/code&gt; icons.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Floating Bottom Panel:&lt;/strong&gt; A single native KDE Plasma 6 floating, auto-hiding panel centered at the bottom of the 21:9 ultrawide.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SteelSeries Arctis Nova Pro Wireless (&lt;code&gt;ChatMix&lt;/code&gt; on PipeWire):&lt;/strong&gt; Instead of SteelSeries GG bloatware, &lt;strong&gt;&lt;code&gt;linux-arctis-manager&lt;/code&gt;&lt;/strong&gt; (&lt;code&gt;arctis-manager.service&lt;/code&gt;) talks to the USB Wireless Base Station (&lt;code&gt;1038:12e0&lt;/code&gt;) and creates native PipeWire virtual sinks (&lt;code&gt;SteelSeries Arctis Nova Pro: Game&lt;/code&gt; and &lt;code&gt;SteelSeries Arctis Nova Pro: Chat&lt;/code&gt;) plus battery telemetry in the KDE system tray, so the physical ChatMix dial on the DAC works out of the box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instant Region Screenshots (&lt;code&gt;Print&lt;/code&gt; key):&lt;/strong&gt; On Windows, I used ShareX/Snipping Tool so hitting &lt;code&gt;PrintScreen&lt;/code&gt; immediately opened a crosshair region selector and copied the selection to the clipboard on mouse release. In KDE Plasma 6, you can get the exact same behavior with native &lt;strong&gt;Spectacle&lt;/strong&gt;:
&lt;ol&gt;
&lt;li&gt;Set &lt;code&gt;useReleaseToCapture=true&lt;/code&gt; and &lt;code&gt;quitAfterSaveCopyExport=true&lt;/code&gt; in &lt;code&gt;~/.config/spectaclerc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Bind the &lt;code&gt;Print&lt;/code&gt; key in &lt;code&gt;~/.config/kglobalshortcutsrc&lt;/code&gt; to &lt;code&gt;RectangularRegionScreenShot&lt;/code&gt; instead of &lt;code&gt;LaunchSpectacle&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;the-passwd--kwallet-gotcha-why-chrome-logged-me-out&#34;&gt;The &lt;code&gt;passwd&lt;/code&gt; + &lt;code&gt;KWallet&lt;/code&gt; Gotcha (Why Chrome Logged Me Out)
&lt;/h3&gt;&lt;p&gt;Right after I rotated my local user password in the terminal with &lt;code&gt;passwd&lt;/code&gt;, I rebooted the PC and ran into an annoying surprise: KDE popped up a modal asking for my &lt;code&gt;kdewallet&lt;/code&gt; password, and both &lt;strong&gt;Google Chrome&lt;/strong&gt; and &lt;strong&gt;Antigravity&lt;/strong&gt; logged me out of every account.&lt;/p&gt;
&lt;p&gt;Chromium and Electron apps on KDE encrypt their login cookies in &lt;code&gt;~/.config/google-chrome/Default/Cookies&lt;/code&gt; using a master key (&lt;code&gt;Chrome Safe Storage&lt;/code&gt;) stored inside &lt;strong&gt;KDE Wallet&lt;/strong&gt; (&lt;code&gt;~/.local/share/kwalletd/kdewallet.kwl&lt;/code&gt;). When you log in through SDDM, &lt;code&gt;pam_kwallet5.so&lt;/code&gt; passes your login password to unlock &lt;code&gt;kdewallet.kwl&lt;/code&gt; automatically.&lt;/p&gt;
&lt;p&gt;However, if you change your Linux password via &lt;code&gt;passwd&lt;/code&gt; in the terminal and &lt;code&gt;/etc/pam.d/passwd&lt;/code&gt; does not notify &lt;code&gt;pam_kwallet5.so&lt;/code&gt;, your Linux user gets the new password while &lt;code&gt;kdewallet.kwl&lt;/code&gt; stays encrypted with your old password. On the next login, auto-unlock fails, Chrome cannot read &lt;code&gt;Chrome Safe Storage&lt;/code&gt;, and it invalidates your encrypted session cookies.&lt;/p&gt;
&lt;p&gt;To make sure future &lt;code&gt;passwd&lt;/code&gt; changes re-encrypt KWallet automatically whenever you change your system password, add this line to &lt;code&gt;/etc/pam.d/passwd&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;#%PAM-1.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;password	include		system-auth
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-password	optional	pam_kwallet5.so
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;5-5k2k-gaming--ai-engineering-in-daily-use&#34;&gt;5. 5K2K Gaming &amp;amp; AI Engineering in Daily Use
&lt;/h2&gt;&lt;h3 id=&#34;gaming-at-5120x2160-on-cachyos&#34;&gt;Gaming at &lt;code&gt;5120x2160&lt;/code&gt; on CachyOS
&lt;/h3&gt;&lt;p&gt;With the RX 7900 XTX (24 GB VRAM) running on Mesa &lt;code&gt;RADV&lt;/code&gt; and Proton Experimental / GE-Proton, every game I play runs natively at &lt;code&gt;5120x2160&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Path of Exile 2:&lt;/strong&gt; Runs via &lt;strong&gt;DirectX 12&lt;/strong&gt; (&lt;code&gt;VKD3D-Proton&lt;/code&gt;) in Borderless Windowed mode, which lets the Linux build of &lt;code&gt;awakened-poe-trade-bin&lt;/code&gt; overlay price checks cleanly on Wayland.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beyond All Reason (BAR):&lt;/strong&gt; Initially launched to a black screen with audio playing in the background. Checking &lt;code&gt;~/.local/state/Beyond All Reason/infolog.txt&lt;/code&gt; showed &lt;code&gt;error=4 (LUA_ERRMEM) not enough memory&lt;/code&gt; because the Spring engine tried to allocate a &lt;code&gt;5120x2037&lt;/code&gt; borderless framebuffer with 4x MSAA enabled. Setting &lt;code&gt;MSAA = 0&lt;/code&gt; and &lt;code&gt;MSAALevel = 0&lt;/code&gt; in &lt;code&gt;springsettings.cfg&lt;/code&gt; fixed it right away (and at 5K2K pixel density, anti-aliasing is not needed anyway).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Battle.net via Lutris:&lt;/strong&gt; One quirk to watch out for when installing Battle.net through Lutris/Wine: when the Battle.net login window first pops up during the Lutris installer script, &lt;strong&gt;do not log in yet&lt;/strong&gt;. Close the login window with &lt;code&gt;[X]&lt;/code&gt; so Lutris can finish writing its Wine prefix configuration, and then launch it normally from the library.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;migrating-my-antigravity-ai-engineering-environment&#34;&gt;Migrating My Antigravity AI Engineering Environment
&lt;/h3&gt;&lt;p&gt;To move my AI pair-programming setup from Windows 11 without losing context, I packaged &lt;code&gt;~/.gemini/config/&lt;/code&gt; (all custom skills, rules, and MCP server definitions), my &lt;code&gt;~/DevProjects&lt;/code&gt; git repositories, and over 60 conversation trajectories into a migration bundle and rewrote the path references from &lt;code&gt;C:\Users\wojci&lt;/code&gt; to &lt;code&gt;/home/wojcieh&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Watch out for one detail when importing historical Antigravity sessions into &lt;code&gt;~/.gemini/antigravity/conversations/*.pb&lt;/code&gt;: the running Antigravity Electron app caches its conversation index (&lt;code&gt;agyhub_summaries_proto.pb&lt;/code&gt;) in RAM and flushes it back to disk on exit. If you overwrite the &lt;code&gt;.pb&lt;/code&gt; files while the IDE is open, closing the window will overwrite your imported index. Always run &lt;code&gt;killall antigravity&lt;/code&gt; before importing or modifying &lt;code&gt;.pb&lt;/code&gt; state files.&lt;/p&gt;
&lt;p&gt;Finally, I generated dedicated CachyOS FIDO2 hardware SSH keys (&lt;code&gt;ssh-keygen -t ecdsa-sk -O resident&lt;/code&gt;) for interactive logins (which on Linux talk directly to &lt;code&gt;libfido2&lt;/code&gt; without any Windows &lt;code&gt;webauthn.dll&lt;/code&gt; Passkey Manager popup) and scoped Ed25519 automation keys for my homelab hosts (&lt;code&gt;mcp-docker-host&lt;/code&gt;, &lt;code&gt;mcp-k3s-host&lt;/code&gt;, &lt;code&gt;pangolin&lt;/code&gt;, &lt;code&gt;unraid&lt;/code&gt;, and &lt;code&gt;ha&lt;/code&gt;), along with &lt;code&gt;systemd&lt;/code&gt; automounts in &lt;code&gt;/etc/fstab&lt;/code&gt; for my Unraid NFSv4.2 shares:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;192.168.255.50:/mnt/user/media /mnt/nas/media nfs rw,noatime,_netdev,nofail,nfsvers=4.2,soft,timeo=150,retrans=3,x-systemd.automount,x-systemd.mount-timeout=30,x-systemd.idle-timeout=30min 0 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Moving from an AM4 Windows 11 desktop to an all-AMD Zen 5 workstation running &lt;strong&gt;CachyOS Linux&lt;/strong&gt; has been a massive upgrade for my daily work. The system boots in two seconds, idles in silence with zero fans spinning on the GPU, unlocks &lt;code&gt;sudo&lt;/code&gt; in 600 milliseconds with my face backed by a hardware TPM 2.0, and runs my entire AI agent + MCP homelab stack natively without a single Windows popup getting in the way.&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
