<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: kavin.dev</title>
    <description>The latest articles on DEV Community by kavin.dev (@kavindotdev).</description>
    <link>https://dev.to/kavindotdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3907684%2F86666475-0b71-4694-ae8f-545b672182a6.jpg</url>
      <title>DEV Community: kavin.dev</title>
      <link>https://dev.to/kavindotdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kavindotdev"/>
    <language>en</language>
    <item>
      <title>How Node.js Handles Thousands of Requests Without Blocking - The Magic of libuv</title>
      <dc:creator>kavin.dev</dc:creator>
      <pubDate>Fri, 03 Jul 2026 03:02:43 +0000</pubDate>
      <link>https://dev.to/kavindotdev/understanding-libuv-the-engine-behind-nodejs-asynchronous-programming-3n7o</link>
      <guid>https://dev.to/kavindotdev/understanding-libuv-the-engine-behind-nodejs-asynchronous-programming-3n7o</guid>
      <description>&lt;p&gt;When developers first learn Node.js, they often hear statements like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Node.js is single-threaded."&lt;br&gt;
"JavaScript is synchronous."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the same time, they see Node.js handling thousands of requests, reading files, and making API calls — without blocking the application.&lt;/p&gt;

&lt;p&gt;So, how is that possible?&lt;/p&gt;

&lt;p&gt;The answer is &lt;strong&gt;libuv&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is libuv?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;libuv&lt;/strong&gt; is an open-source C library that provides Node.js with asynchronous, non-blocking I/O capabilities. It is one of the core components that makes Node.js fast and efficient.&lt;/p&gt;

&lt;p&gt;JavaScript itself doesn't know how to read files, create network sockets, or manage timers. Instead, Node.js relies on libuv to communicate with the operating system and perform these tasks efficiently.&lt;/p&gt;

&lt;p&gt;Think of it like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff8qhiyzyoiydxkgtnjhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff8qhiyzyoiydxkgtnjhe.png" alt=" " width="264" height="334"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Do We Need libuv?
&lt;/h2&gt;

&lt;p&gt;Imagine you're reading a large file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Without&lt;/strong&gt; asynchronous programming, JavaScript would have to wait until the file is completely read before executing the next line of code — making your application unresponsive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;With libuv&lt;/strong&gt;, the file is read in the background while JavaScript continues executing other tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Start&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;data.txt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;End&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Start
End
(file contents)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of waiting for the file to finish reading, Node.js continues executing the next statement immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Does libuv Do?
&lt;/h2&gt;

&lt;p&gt;libuv is responsible for several important features in Node.js.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Event Loop
&lt;/h3&gt;

&lt;p&gt;The Event Loop is &lt;strong&gt;implemented by libuv&lt;/strong&gt;. It continuously checks whether asynchronous operations have completed.&lt;/p&gt;

&lt;p&gt;When an operation finishes, its callback is placed in the queue, and JavaScript executes it when the call stack becomes empty. This is what allows Node.js to remain responsive even while many operations are happening simultaneously.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. File System Operations
&lt;/h3&gt;

&lt;p&gt;Operations like &lt;code&gt;fs.readFile()&lt;/code&gt;, &lt;code&gt;fs.writeFile()&lt;/code&gt;, and &lt;code&gt;fs.appendFile()&lt;/code&gt; are all handled through libuv. These operations don't block JavaScript while waiting for the operating system.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Thread Pool
&lt;/h3&gt;

&lt;p&gt;People often say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Node.js is single-threaded."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's true — &lt;strong&gt;for JavaScript execution&lt;/strong&gt;. However, libuv maintains a &lt;strong&gt;thread pool&lt;/strong&gt; behind the scenes.&lt;/p&gt;

&lt;p&gt;The default thread pool contains &lt;strong&gt;4 worker threads&lt;/strong&gt;. Tasks such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File system operations&lt;/li&gt;
&lt;li&gt;DNS lookups&lt;/li&gt;
&lt;li&gt;Compression&lt;/li&gt;
&lt;li&gt;Cryptography&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...are executed by these worker threads instead of blocking the JavaScript thread.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Network Operations
&lt;/h3&gt;

&lt;p&gt;libuv also manages networking, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP servers&lt;/li&gt;
&lt;li&gt;TCP sockets&lt;/li&gt;
&lt;li&gt;UDP sockets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's one reason a Node.js server can efficiently handle thousands of simultaneous client connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Timers
&lt;/h3&gt;

&lt;p&gt;Functions like &lt;code&gt;setTimeout()&lt;/code&gt;, &lt;code&gt;setInterval()&lt;/code&gt;, and &lt;code&gt;setImmediate()&lt;/code&gt; are all managed internally by libuv.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Does libuv Work? (Step-by-Step)
&lt;/h2&gt;

&lt;p&gt;Let's trace through a concrete example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;notes.txt&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Execution flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;JavaScript prints &lt;code&gt;1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;fs.readFile()&lt;/code&gt; is handed over to libuv&lt;/li&gt;
&lt;li&gt;JavaScript immediately prints &lt;code&gt;3&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;libuv performs the file read in the background&lt;/li&gt;
&lt;li&gt;Once the file is ready, libuv places the callback into the Event Loop&lt;/li&gt;
&lt;li&gt;The callback executes and prints &lt;code&gt;2&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1
3
2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;A Simple Analogy&lt;/strong&gt;&lt;br&gt;
Imagine you're waiting for pizza.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Without libuv
You:
"Is my pizza ready?"

Kitchen:
"No."

You:
"Now?"

Kitchen:
"No."

You:
"Now?"

Kitchen:
"No."

You're constantly checking.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With libuv&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
You:
"I'll wait."

🍕

Kitchen:
"_Your pizza is ready!_"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;** Key Takeaways**&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript runs on a single thread&lt;/li&gt;
&lt;li&gt;libuv performs asynchronous operations&lt;/li&gt;
&lt;li&gt;libuv implements the Event Loop&lt;/li&gt;
&lt;li&gt;libuv manages timers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Handled By&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Event Loop&lt;/td&gt;
&lt;td&gt;libuv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File I/O&lt;/td&gt;
&lt;td&gt;libuv (thread pool)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network (TCP/UDP)&lt;/td&gt;
&lt;td&gt;libuv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timers&lt;/td&gt;
&lt;td&gt;libuv&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JS Execution&lt;/td&gt;
&lt;td&gt;V8 Engine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;libuv is the invisible engine that keeps Node.js non-blocking. Without it, Node.js would just be a synchronous runtime — nothing special.&lt;/p&gt;

&lt;p&gt;Next time you call &lt;code&gt;fs.readFile()&lt;/code&gt; or spin up an HTTP server, remember: &lt;strong&gt;libuv is doing the heavy lifting behind the scenes.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>computerscience</category>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>JWT Explained: What It Is, How It Works, and Why You Should Care</title>
      <dc:creator>kavin.dev</dc:creator>
      <pubDate>Sat, 27 Jun 2026 08:28:38 +0000</pubDate>
      <link>https://dev.to/kavindotdev/jwt-explained-what-it-is-how-it-works-and-why-you-should-care-538p</link>
      <guid>https://dev.to/kavindotdev/jwt-explained-what-it-is-how-it-works-and-why-you-should-care-538p</guid>
      <description>&lt;p&gt;If you've ever built a login system and wondered "should I use sessions or tokens?" - this one's for you.&lt;/p&gt;

&lt;p&gt;So..What Even Is a JWT?&lt;/p&gt;

&lt;h2&gt;
  
  
  JWT stands for JSON Web Token, it's just a way for a server to hand a client a small, self-contained package of information that the client can carry around and present whenever it needs to prove something — like "hey, I'm logged in."
&lt;/h2&gt;

&lt;p&gt;JWT vs. Sessions — What's the Difference?&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Structure of a JWT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A JWT looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjMiLCJleHAiOjE2OTAwMDB9.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Scary at first, but it's just three Base64-encoded parts separated by dots:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HEADER.PAYLOAD.SIGNATURE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Header - tells you the algorithm used (e.g. HS256):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"alg"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HS256"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typ"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JWT"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Payload - the actual data. This is where user info lives&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"012"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kavin@dev.to.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1690000000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Signature&lt;/strong&gt; -this is what makes it trustworthy. The server creates it by signing the header + payload with a secret key:&lt;br&gt;
&lt;code&gt;HMACSHA256(base64(header) + "." + base64(payload), SECRET_KEY)&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Quick Summary&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A JWT is a signed, self-contained token the client carries around.&lt;/li&gt;
&lt;li&gt;t has three parts: Header, Payload, Signature&lt;/li&gt;
&lt;li&gt;Access tokens are stateless (no DB check), short-lived&lt;/li&gt;
&lt;li&gt;Refresh tokens are stored in DB, longer-lived, used only to refresh access tokens&lt;/li&gt;
&lt;li&gt;When an access token expires → client sends refresh token → gets a new access token (and new refresh token with rotation)&lt;/li&gt;
&lt;li&gt;Store refresh tokens in HttpOnly cookies for better security&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>jwt</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>backend</category>
    </item>
    <item>
      <title>Understanding React Rendering Flow</title>
      <dc:creator>kavin.dev</dc:creator>
      <pubDate>Wed, 27 May 2026 03:20:07 +0000</pubDate>
      <link>https://dev.to/kavindotdev/understanding-react-rendering-flow-1fl1</link>
      <guid>https://dev.to/kavindotdev/understanding-react-rendering-flow-1fl1</guid>
      <description>&lt;p&gt;⚛️&lt;/p&gt;

&lt;p&gt;If you're learning React, one of the most important concepts is understanding &lt;strong&gt;what happens internally when a component renders&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At first, React can feel magical.&lt;/p&gt;

&lt;p&gt;You write JSX… and somehow the UI updates automatically.&lt;/p&gt;

&lt;p&gt;But behind the scenes, React follows a very systematic rendering flow.&lt;/p&gt;

&lt;p&gt;Let’s break it down step-by-step 👇&lt;/p&gt;




&lt;h1&gt;
  
  
  React Rendering Flow
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer Writes Components
        ↓
Components Return JSX
        ↓
JSX Converts into React Elements
        ↓
React Creates Virtual DOM
        ↓
React Compares Old &amp;amp; New Virtual DOM
        ↓
Updates Only Changed Parts in Real DOM
        ↓
Browser Displays Updated UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  1 Developer Creates Components
&lt;/h1&gt;

&lt;p&gt;In React, UI is built using &lt;strong&gt;components&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A component is simply a JavaScript function that returns UI.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Welcome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello Captain&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Components make applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reusable&lt;/li&gt;
&lt;li&gt;Organized&lt;/li&gt;
&lt;li&gt;Scalable&lt;/li&gt;
&lt;li&gt;Easier to maintain&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  2 Components Return JSX
&lt;/h1&gt;

&lt;p&gt;Inside components, we usually return JSX.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JSX looks like HTML, but it’s actually JavaScript syntax.&lt;/p&gt;

&lt;p&gt;Browsers cannot understand JSX directly.&lt;/p&gt;

&lt;p&gt;So React transforms it internally before rendering.&lt;/p&gt;




&lt;h1&gt;
  
  
  3 JSX Converts into React Elements
&lt;/h1&gt;

&lt;p&gt;React converts JSX into plain JavaScript objects called &lt;strong&gt;React Elements&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Hello&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;becomes something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;h1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These objects describe what the UI should look like.&lt;/p&gt;




&lt;h1&gt;
  
  
  React Element Structure
&lt;/h1&gt;

&lt;p&gt;A React Element mainly contains:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTML tag or component&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;props&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Properties/data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;children&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nested content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Unique ID for lists&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  4 React Creates the Virtual DOM
&lt;/h1&gt;

&lt;p&gt;Using React Elements, React builds a &lt;strong&gt;Virtual DOM&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Virtual DOM?
&lt;/h2&gt;

&lt;p&gt;A lightweight JavaScript representation of the Real DOM stored in memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Virtual DOM = Fast in-memory copy of UI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of directly manipulating the browser DOM every time something changes, React first updates the Virtual DOM.&lt;/p&gt;

&lt;p&gt;This makes rendering much faster and more efficient.&lt;/p&gt;




&lt;h1&gt;
  
  
  5 React Performs Diffing (Reconciliation)
&lt;/h1&gt;

&lt;p&gt;Whenever state or props change:&lt;/p&gt;

&lt;p&gt;React creates a &lt;strong&gt;new Virtual DOM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then React compares:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Old Virtual DOM
vs
New Virtual DOM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This comparison process is called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Diffing / Reconciliation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;React tries to identify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"What exactly changed?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;instead of rebuilding the entire page.&lt;/p&gt;




&lt;h1&gt;
  
  
  6 React Updates the Real DOM
&lt;/h1&gt;

&lt;p&gt;After finding the differences:&lt;/p&gt;

&lt;p&gt;React updates only the changed parts in the Real DOM.&lt;/p&gt;

&lt;p&gt;This selective updating is why React apps feel fast and responsive.&lt;/p&gt;

&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better performance&lt;/li&gt;
&lt;li&gt;Efficient updates&lt;/li&gt;
&lt;li&gt;Smooth UI interactions&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  7 Browser Paints the Updated UI
&lt;/h1&gt;

&lt;p&gt;Finally, the browser renders the updated UI on the screen.&lt;/p&gt;

&lt;p&gt;Important point:&lt;/p&gt;

&lt;p&gt;React manages updates,&lt;br&gt;
but the &lt;strong&gt;browser actually displays the UI&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why React Is Fast
&lt;/h1&gt;

&lt;p&gt;React improves performance because it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses Virtual DOM&lt;/li&gt;
&lt;li&gt;Updates only changed elements&lt;/li&gt;
&lt;li&gt;Avoids unnecessary DOM operations&lt;/li&gt;
&lt;li&gt;Efficiently re-renders components&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Understanding React’s rendering flow helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write better components&lt;/li&gt;
&lt;li&gt;Optimize performance&lt;/li&gt;
&lt;li&gt;Debug rendering issues&lt;/li&gt;
&lt;li&gt;Understand hooks and state updates more deeply&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you understand this internal workflow, React becomes much easier to reason about.&lt;/p&gt;




&lt;h2&gt;
  
  
  What helped you understand React rendering for the first time?
&lt;/h2&gt;

&lt;p&gt;Drop your thoughts below &lt;/p&gt;

</description>
      <category>react</category>
      <category>webdev</category>
      <category>reactjsdevelopment</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to Install NVIDIA Drivers on Fedora 44</title>
      <dc:creator>kavin.dev</dc:creator>
      <pubDate>Thu, 07 May 2026 03:53:34 +0000</pubDate>
      <link>https://dev.to/kavindotdev/how-to-install-nvidia-drivers-on-fedora-44-1b9a</link>
      <guid>https://dev.to/kavindotdev/how-to-install-nvidia-drivers-on-fedora-44-1b9a</guid>
      <description>&lt;p&gt;This guide covers the &lt;strong&gt;RPM Fusion method&lt;/strong&gt; — the recommended and most maintainable way to install NVIDIA proprietary drivers on Fedora. No manual &lt;code&gt;.run&lt;/code&gt; installers, no broken &lt;code&gt;dnf&lt;/code&gt; states.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before you start, make sure your system is fully up to date&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf upgrade &lt;span class="nt"&gt;--refresh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reboot if there were kernel updates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Enable RPM Fusion Repositories
&lt;/h2&gt;

&lt;p&gt;Fedora doesn't ship proprietary drivers by default. RPM Fusion fills that gap. You need both the &lt;strong&gt;free&lt;/strong&gt; and &lt;strong&gt;nonfree&lt;/strong&gt; repos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-&lt;span class="si"&gt;$(&lt;/span&gt;rpm &lt;span class="nt"&gt;-E&lt;/span&gt; %fedora&lt;span class="si"&gt;)&lt;/span&gt;.noarch.rpm &lt;span class="se"&gt;\&lt;/span&gt;
  https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-&lt;span class="si"&gt;$(&lt;/span&gt;rpm &lt;span class="nt"&gt;-E&lt;/span&gt; %fedora&lt;span class="si"&gt;)&lt;/span&gt;.noarch.rpm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;## Step 2 — Install the NVIDIA Driver&lt;/p&gt;

&lt;p&gt;Install the &lt;code&gt;akmod-nvidia&lt;/code&gt; package. The &lt;code&gt;akmod&lt;/code&gt; (automatic kernel module) system automatically rebuilds the driver whenever your kernel updates — saving you from the classic "driver broke after update" headache.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;akmod-nvidia
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;*&lt;em&gt;Optional *&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;If you need &lt;strong&gt;CUDA support&lt;/strong&gt; (for ML, video encoding, etc.), add this too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;xorg-x11-drv-nvidia-cuda
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Wait for the Kernel Module to Build
&lt;/h2&gt;

&lt;p&gt;This is the step most guides skip over — and it's important.&lt;/p&gt;

&lt;p&gt;After installation, the kernel module needs to compile. &lt;strong&gt;Do not reboot immediately.&lt;/strong&gt; Wait for the build to complete:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;akmods &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dracut &lt;span class="nt"&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can verify the module is built by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;modinfo &lt;span class="nt"&gt;-F&lt;/span&gt; version nvidia
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see a version number like &lt;code&gt;570.xx.xx&lt;/code&gt; in the output. If you see an error instead, &lt;strong&gt;do not reboot yet&lt;/strong&gt; — something went wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Reboot
&lt;/h2&gt;

&lt;p&gt;Once the module is confirmed built:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;reboot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After rebooting, verify the driver is active:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see your GPU listed with the driver version and memory usage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;The RPM Fusion + &lt;code&gt;akmod-nvidia&lt;/code&gt; approach is the most reliable way to run NVIDIA drivers on Fedora. It survives kernel updates, works across Fedora versions, and doesn't require babysitting &lt;code&gt;.run&lt;/code&gt; scripts.&lt;/p&gt;

&lt;p&gt;Got questions or a specific GPU edge case? Drop them in the comments below. 🐧&lt;/p&gt;

</description>
      <category>linux</category>
      <category>nvidia</category>
      <category>nividagpu</category>
      <category>fedora44</category>
    </item>
    <item>
      <title>How To Install ROG Control Center on Fedora 44,43 Based Distros (asusctl Guide)</title>
      <dc:creator>kavin.dev</dc:creator>
      <pubDate>Fri, 01 May 2026 15:08:43 +0000</pubDate>
      <link>https://dev.to/kavindotdev/how-to-install-rog-control-center-on-fedora-4443-based-distros-asusctl-guide-2e43</link>
      <guid>https://dev.to/kavindotdev/how-to-install-rog-control-center-on-fedora-4443-based-distros-asusctl-guide-2e43</guid>
      <description>&lt;p&gt;If you're running an Asus ROG/TUF laptop on Fedora 42,43,44, you've probably noticed there's no official Armoury Crate for Linux. But don't worry, the open source &lt;code&gt;asusctl.&lt;/code&gt; suite has you covered with fan control, performance profiles, GPU switching, and RGB lighting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Enable the COPR Repository
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;sudo dnf copr enable lukenukem/asus-linux&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo dnf update --refresh&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install asusctl and supergfxctl
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;sudo dnf install asusctl supergfxctl rog-control-center&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo dnf update --refresh&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Enable Services
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo systemctl enable --now asusd.service&lt;/code&gt;&lt;br&gt;
&lt;code&gt;sudo systemctl enable supergfxd.service&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  step 4: Verify Kernel Modules
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;lsmod |  grep asus
&lt;/code&gt;You should see modules like &lt;code&gt;asus_nb_wmi&lt;/code&gt;, &lt;code&gt;asus_armoury&lt;/code&gt;, 
&lt;code&gt;asus_wmi&lt;/code&gt;, and &lt;code&gt;hid_asus&lt;/code&gt; listed.
&lt;code&gt;
## Step 5: Launch ROG Control Center
&lt;/code&gt;rog-control-center`&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Or find it in your application menu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  asusd.service fails to start?
&lt;/h3&gt;

&lt;p&gt;Run it manually to see the raw error:&lt;br&gt;
&lt;code&gt;sudo asusd&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  "Asus kernel isn't loaded" warning?
&lt;/h3&gt;

&lt;p&gt;Ignore it — it's safe and cosmetic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Profile switching not working?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;asusctl profile --list&lt;/code&gt;&lt;br&gt;
&lt;code&gt;asusctl profile -P Balanced&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Can Control
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fan Curves&lt;/li&gt;
&lt;li&gt;Performance Profiles (silent, Balanced, Turbo)&lt;/li&gt;
&lt;li&gt;GPU switching (Integrated / Hybrid / Dedicated)&lt;/li&gt;
&lt;li&gt;Keyboard RGB lighting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fli7s46d8ng4xgoi7g2xf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fli7s46d8ng4xgoi7g2xf.png" alt=" " width="800" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifm3gco8eavgufwst82l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifm3gco8eavgufwst82l.png" alt=" " width="800" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvnpetakce3k33g8u7x1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvnpetakce3k33g8u7x1.png" alt=" " width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;No Windows VM needed anymore! The &lt;code&gt;asusctl&lt;/code&gt; project is actively &lt;br&gt;
maintained and gets better with every update. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Useful Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://asus-linux.org" rel="noopener noreferrer"&gt;asus-linux.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/asus-linux/asusctl" rel="noopener noreferrer"&gt;asusctl GitLab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>linux</category>
      <category>asus</category>
      <category>rog</category>
      <category>fedora</category>
    </item>
  </channel>
</rss>
