<?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>Forem: Marcin Firmuga</title>
    <description>The latest articles on Forem by Marcin Firmuga (@huckler).</description>
    <link>https://forem.com/huckler</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3693207%2F6a4682e6-273e-4a98-9ce7-653391a5abcc.png</url>
      <title>Forem: Marcin Firmuga</title>
      <link>https://forem.com/huckler</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/huckler"/>
    <language>en</language>
    <item>
      <title>Wednesday Code Autopsy #4: The Canvas Arc Nobody Uses - PC Workman</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Thu, 16 Apr 2026 17:50:16 +0000</pubDate>
      <link>https://forem.com/huckler/wednesday-code-autopsy-4-the-canvas-arc-nobody-uses-pc-workman-oob</link>
      <guid>https://forem.com/huckler/wednesday-code-autopsy-4-the-canvas-arc-nobody-uses-pc-workman-oob</guid>
      <description>&lt;p&gt;Needed circular progress gauge. Googled "Python circular progress bar." Every answer: &lt;code&gt;pip install [library]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Drew mine with pure tkinter Canvas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero dependencies&lt;/li&gt;
&lt;li&gt;Two parameters: &lt;code&gt;style="arc"&lt;/code&gt;, &lt;code&gt;extent=-270&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Professional look&lt;/li&gt;
&lt;li&gt;20 lines of code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;secret:&lt;/strong&gt; tkinter has THREE arc styles. 99% of devs only use one.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I needed a circular progress gauge for PC Workman's "First Setup &amp;amp; Drivers" page.&lt;/p&gt;

&lt;p&gt;Something clean. Professional. The kind you see in system health dashboards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First instinct:&lt;/strong&gt; Google.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search:&lt;/strong&gt; "Python circular progress bar"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;matplotlib circular progress tutorial&lt;/li&gt;
&lt;li&gt;PIL + pillow gauge example&lt;/li&gt;
&lt;li&gt;PyQt QProgressBar subclass&lt;/li&gt;
&lt;li&gt;Custom tkinter widget library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every answer started the same: &lt;code&gt;pip install [library]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;PC Workman is already PyQt6 + tkinter + psutil + SQLite. Adding matplotlib for one gauge? Overkill.&lt;/p&gt;

&lt;p&gt;There had to be a better way.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Discovery
&lt;/h2&gt;

&lt;p&gt;Opened the &lt;a href="https://docs.python.org/3/library/tkinter.html#canvas-objects" rel="noopener noreferrer"&gt;tkinter Canvas docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Not Stack Overflow. Not a tutorial. The &lt;strong&gt;actual documentation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Found &lt;code&gt;create_arc()&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;style:&lt;/strong&gt; One of 'pieslice' (default), 'chord', or &lt;strong&gt;'arc'&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;style="arc"&lt;/strong&gt; — draws just the arc itself. No fill. No center lines.&lt;/p&gt;

&lt;p&gt;This was it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_draw_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Background arc (full 270° track)
&lt;/span&gt;    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#1f2937&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Progress arc (proportional to score)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_score_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&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;Result:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;[10-second PC Health gauge animation]&lt;/p&gt;

&lt;p&gt;Clean. Professional. Zero dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Geometry
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;create_arc()&lt;/code&gt; takes a &lt;strong&gt;bounding box&lt;/strong&gt;, not center + radius:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="c1"&gt;#                 └─────┬─────┘
#                 rectangle containing circle
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a perfect circle at (60, 60) with radius 50:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="c1"&gt;#                 60-50, 60-50, 60+50, 60+50
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fbeolvjqnssprhnyrv369.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%2Fbeolvjqnssprhnyrv369.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Angles
&lt;/h3&gt;

&lt;p&gt;tkinter measures angles from &lt;strong&gt;East (3 o'clock) = 0°&lt;/strong&gt;, counterclockwise:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;th&gt;Degrees&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;East&lt;/td&gt;
&lt;td&gt;0°&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;North&lt;/td&gt;
&lt;td&gt;90°&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;West&lt;/td&gt;
&lt;td&gt;180°&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;South&lt;/td&gt;
&lt;td&gt;270°&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Trick:&lt;/strong&gt; Negative &lt;code&gt;extent&lt;/code&gt; goes &lt;strong&gt;clockwise&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a speedometer (7:30 to 4:30 position):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# 225° = bottom-left (7:30)
&lt;/span&gt;&lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;  &lt;span class="c1"&gt;# -270° clockwise = wraps to bottom-right (4:30)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perfect 270° gauge.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Secret Third Style
&lt;/h3&gt;

&lt;p&gt;Most devs know two Canvas arc styles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Style&lt;/th&gt;
&lt;th&gt;What It Draws&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"pieslice"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Filled wedge from center (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;"chord"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Arc + straight line connecting ends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;"arc"&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Just the arc curve&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Almost nobody uses &lt;code&gt;style="arc"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's your circular progress bar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#10b981&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;7-pixel green arc. No fill. No custom drawing.&lt;br&gt;
&lt;strong&gt;style="arc"&lt;/strong&gt; has been in tkinter since Python 1.x. 99% of developers have never touched it.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Production Implementation
&lt;/h2&gt;

&lt;p&gt;The two-line example is simplified. Here's what ships in PC Workman:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_draw_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;92&lt;/span&gt;
    &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;

    &lt;span class="c1"&gt;# Layer 1: Outer glow (wider, darker)
&lt;/span&gt;    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#1a2035&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Layer 2: Track (gray path)
&lt;/span&gt;    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#1f2937&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Layer 3: Progress (colored, proportional)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_score_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Score text
&lt;/span&gt;        &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                          &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consolas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cy&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/100&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#6b7280&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consolas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&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;Three layers on same Canvas:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Outer glow&lt;/strong&gt; — 10px dark, 4px larger radius (depth)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track&lt;/strong&gt; — 7px gray, full 270° (background)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress&lt;/strong&gt; — 7px colored, proportional (gauge)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No masking. No blending. Just stacking arcs.&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.amazonaws.com%2Fuploads%2Farticles%2F1ftdl9caznp8z2j9dayf.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%2F1ftdl9caznp8z2j9dayf.png" alt=" " width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Math
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Score&lt;/th&gt;
&lt;th&gt;Calculation&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;-int(270 * 1.0)&lt;/td&gt;
&lt;td&gt;-270 (full)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;-int(270 * 0.75)&lt;/td&gt;
&lt;td&gt;-202 (¾)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;-int(270 * 0.5)&lt;/td&gt;
&lt;td&gt;-135 (½)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-int(270 * 0.0)&lt;/td&gt;
&lt;td&gt;0 (empty)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The &lt;code&gt;int()&lt;/code&gt; is critical.&lt;/strong&gt; tkinter won't accept float extents — it'll silently fail and draw nothing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Color Grading
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_score_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#10b981&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Green
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#fbbf24&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Amber
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#ef4444&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;      &lt;span class="c1"&gt;# Red
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_score_grade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXCELLENT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FAIR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POOR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three thresholds. Same color in arc, number, and label.&lt;/p&gt;

&lt;p&gt;No color library. Just hex values.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Scanning State
&lt;/h2&gt;

&lt;p&gt;Gauge drawn twice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;On load&lt;/strong&gt; — gray track only (&lt;code&gt;score=None&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After scan&lt;/strong&gt; — colored progress (&lt;code&gt;score=0-100&lt;/code&gt;)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Initial
&lt;/span&gt;&lt;span class="nf"&gt;_draw_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;health_canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# After scan thread
&lt;/span&gt;&lt;span class="nf"&gt;_draw_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;health_canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calculated_score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;if score is not None&lt;/code&gt; prevents empty arc or crash.&lt;/p&gt;

&lt;p&gt;While scanning (registry check, driver status, updates), gauge waits as clean gray circle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Copyable Minimal Example
&lt;/h2&gt;

&lt;p&gt;Want this in your project? Here's the stripped version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tkinter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Tk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0a0e14&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;draw_gauge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Gray track
&lt;/span&gt;    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                      &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#1f2937&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Colored progress
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;extent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;270&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_arc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;extent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;arc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#10b981&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Text
&lt;/span&gt;        &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                          &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consolas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;draw_gauge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mainloop&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;20 lines. Zero dependencies. Production-ready.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;This gauge powers health check in &lt;strong&gt;PC Workman&lt;/strong&gt; (110+ downloads, 23 GitHub stars).&lt;br&gt;
First thing users see in "First Setup &amp;amp; Drivers."&lt;/p&gt;

&lt;p&gt;Makes the section feel premium — smooth, clean, not default tkinter.&lt;br&gt;
All because I read Canvas docs instead of installing matplotlib.&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.amazonaws.com%2Fuploads%2Farticles%2Fdzxq20tj4msgw37vn2cf.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%2Fdzxq20tj4msgw37vn2cf.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Lesson
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Most developers solve problems by adding dependencies.&lt;br&gt;
Need progress bar? Install library.&lt;br&gt;&lt;br&gt;
Need chart? Install library.&lt;br&gt;&lt;br&gt;
Need widget? Install library.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nothing wrong with libraries. Good ones save time.&lt;br&gt;
&lt;strong&gt;But sometimes the best solution is in stdlib docs.&lt;/strong&gt;&lt;br&gt;
In a parameter you've never used.&lt;br&gt;
On a page you've never read.&lt;br&gt;
&lt;strong&gt;style="arc"&lt;/strong&gt; has existed since Python 1.x.&lt;br&gt;
99% of developers never touched it.&lt;br&gt;
I found it in 5 minutes of reading docs instead of Googling "how to."&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;PC Workman v1.7.x builds toward &lt;strong&gt;TURBO Mode&lt;/strong&gt;. Windows optimization tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU unparking&lt;/li&gt;
&lt;li&gt;RAM flushing&lt;/li&gt;
&lt;li&gt;Service management&lt;/li&gt;
&lt;li&gt;Power plan switching&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"First Setup &amp;amp; Drivers" scans system, gives health score before TURBO touches anything.&lt;/p&gt;

&lt;p&gt;This gauge is part of that foundation.&lt;/p&gt;

&lt;p&gt;v1.7.2 ships next week.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's your "I can't believe this is possible with just X" moment?&lt;/strong&gt;&lt;br&gt;
Time you almost installed library, then realized solution was in docs?&lt;br&gt;
Drop it below &lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PC Workman:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK/releases" rel="noopener noreferrer"&gt;Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK#readme" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK/releases/latest" rel="noopener noreferrer"&gt;Download&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Follow the build:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X: &lt;a href="https://twitter.com/hck_lab" rel="noopener noreferrer"&gt;@hck_lab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://linkedin.com/in/marcinfirmuga" rel="noopener noreferrer"&gt;Marcin Firmuga&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;All links: &lt;a href="https://linktr.ee/hck_labs" rel="noopener noreferrer"&gt;linktr.ee/hck_labs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Wednesday Code Autopsy continues next week.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Building PC Workman in public. One arc at a time.&lt;/p&gt;

</description>
      <category>python</category>
      <category>buildinpublic</category>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>PC Workman v1.7.2: I Built a Driver Booster Competitor From Scratch, Fixes. Monday Grind Blueprint #3</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Mon, 13 Apr 2026 12:40:56 +0000</pubDate>
      <link>https://forem.com/huckler/pc-workman-v172-i-built-a-driver-booster-competitor-from-scratch-fixes-monday-grind-blueprint-3393</link>
      <guid>https://forem.com/huckler/pc-workman-v172-i-built-a-driver-booster-competitor-from-scratch-fixes-monday-grind-blueprint-3393</guid>
      <description>&lt;p&gt;6 AM. Monday. Couldn't sleep.&lt;/p&gt;

&lt;p&gt;Not the inspirational "I'm so motivated" kind of can't sleep. More like my brain decided to start compiling the entire weekly sprint at 5:47 AM and wouldn't shut up until I opened VS Code.&lt;/p&gt;

&lt;p&gt;By 11 AM I had shipped four things that weren't even on this week's list. By Friday, the actual plan got done too. Some of it. Enough of it. This is the story of both.&lt;/p&gt;

&lt;p&gt;PC Workman is at v1.7.2 now. If you're new here: it's an open-source AI-powered system monitor I've been building solo for 800+ hours. Python, PyQt5, WMI, a custom AI diagnostic engine called hck_GPT, and a lot of late nights after Żabka shifts. This week was one of the heaviest since I started.&lt;/p&gt;

&lt;p&gt;Let's cut it open.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. hck_GPT Time Badges — The Small Feature That Took Months to Actually Do
&lt;/h2&gt;

&lt;p&gt;This one has been haunting me since Monday Grind Blueprint #1.&lt;/p&gt;

&lt;p&gt;The problem was simple: hck_GPT would tell you things like "Chrome ate 6GB RAM recently." When recently? An hour ago? Yesterday? During that Windows update at 3 AM?&lt;/p&gt;

&lt;p&gt;No timestamp. No context. Just "recently."&lt;/p&gt;

&lt;p&gt;I kept pushing it back. "Next sprint." "After the UI redesign." "When I have time." Classic.&lt;/p&gt;

&lt;p&gt;Monday morning, 6:23 AM, I just... did it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Interesting Part
&lt;/h3&gt;

&lt;p&gt;hck_GPT's chat panel is a &lt;code&gt;tk.Text&lt;/code&gt; widget. Most people use Text widgets for plain text. Type stuff in, maybe color some words, done.&lt;/p&gt;

&lt;p&gt;But tkinter has this thing called &lt;code&gt;window_create()&lt;/code&gt; that lets you embed &lt;em&gt;any widget&lt;/em&gt; inside the text flow. Not on top of it. Not floating above it. &lt;em&gt;Inside&lt;/em&gt; it, like it's just another character.&lt;/p&gt;

&lt;p&gt;So instead of prepending "[08:52]" as plain text (boring, hard to style, breaks if the message wraps weird), I built a tiny canvas badge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# panel.py
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_make_time_badge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;badge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bg_panel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;highlightthickness&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;badge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_rectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#0d0f14&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;badge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_rectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#dc2626&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# left red bar
&lt;/span&gt;    &lt;span class="n"&gt;badge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_rectangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#dc2626&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# right red bar
&lt;/span&gt;    &lt;span class="n"&gt;badge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#374151&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;badge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%H:%M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                      &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#94a3b8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consolas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;badge&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dark background, red accent bars on each side, Consolas font, 7pt bold. It looks like a tiny terminal badge sitting in the chat.&lt;/p&gt;

&lt;p&gt;Then in &lt;code&gt;add_message()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;normal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hck_GPT:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;badge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_make_time_badge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;window_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;badge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;disabled&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;window_create("end", window=badge)&lt;/code&gt; is the whole trick. The canvas lives inside the text flow, scrolls with everything else, and costs almost nothing performance-wise.&lt;/p&gt;

&lt;p&gt;Small feature. One morning. Months overdue. Now every hck_GPT message says &lt;em&gt;when&lt;/em&gt; it happened. 08:52, not "a while ago."&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.amazonaws.com%2Fuploads%2Farticles%2Fw9zb3o4sepunzgjj5yv3.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%2Fw9zb3o4sepunzgjj5yv3.png" alt=" " width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Process Library — From "Unknown" to "Oh, That's What You Are"
&lt;/h2&gt;

&lt;p&gt;This one started in Blueprint #1 too. The idea was simple: when PC Workman mentions a process, you should know what it is without opening Google.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;process_library.json&lt;/code&gt; already had ~60 entries. But real usage kept surfacing gaps. hck_GPT would say "WmiPrvSE.exe is using 34% CPU" and the tooltip showed... nothing. Unknown process.&lt;/p&gt;

&lt;p&gt;This week I added 8 more entries, specifically the ones that kept showing up as unknowns during actual sessions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;wmiprvse.exe&lt;/code&gt; — WMI Provider Host. Every monitoring tool talks to this. Including PC Workman itself.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;msmpeng.exe&lt;/code&gt; — Windows Defender's scan engine. The one that randomly spikes CPU at 2 AM.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;registry&lt;/code&gt; — NT kernel process, no .exe extension. Easy to miss entirely.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;claude.exe&lt;/code&gt; — Yes, the Claude desktop app. I use it enough that it shows up in Top 5.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hitman.exe&lt;/code&gt;, &lt;code&gt;hitman2.exe&lt;/code&gt;, &lt;code&gt;hitman3.exe&lt;/code&gt; — HITMAN trilogy. Each one with different VRAM profiles.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;datatransfer.exe&lt;/code&gt; — Connected Devices Platform sync. Nobody knows what this is until it's eating RAM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each entry follows the same schema:&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;"msmpeng.exe"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Windows Defender Antimalware Service"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vendor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Security"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Core scan engine for Windows Defender. Periodic CPU spikes are normal during scheduled scans."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"power_usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium-high during scans"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"safety"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"safe — do not kill"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"typical_cpu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0-5% idle, 15-40% during scan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"typical_ram"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"150-300 MB"&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;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;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%2Fw2hfdv57rfaktba3g443.gif" 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%2Fw2hfdv57rfaktba3g443.gif" alt=" " width="600" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clean, queryable, and every field actually means something.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tooltips Everywhere, Not Just in Chat
&lt;/h3&gt;

&lt;p&gt;Before this week, the hover tooltip only worked inside hck_GPT's chat panel. If a process showed up in the main dashboard Top 5 panels, you were on your own.&lt;/p&gt;

&lt;p&gt;Fixed that. But it wasn't as simple as "just add a tooltip."&lt;/p&gt;

&lt;p&gt;The Top 5 panels update every render tick. Process names change constantly. If you capture the process name at widget creation time, the tooltip will show stale data within seconds.&lt;/p&gt;

&lt;p&gt;Solution: store the process name in a mutable dict that gets updated every tick:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# main_window_expanded.py
&lt;/span&gt;&lt;span class="n"&gt;widget_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;row&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name_lbl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cpu_bar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cpu_bar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cpu_val&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cpu_val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ram_bar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ram_bar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ram_val&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ram_val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;proc_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# updated every render tick
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_process_tooltip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_enter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;widget_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;pn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;proc_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;tt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_proc_lib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format_tooltip_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_process_tooltip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_leave&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_process_tooltip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;name_lbl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Enter&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_enter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Enter&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_enter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# whole row = bigger hit area
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in the render loop, one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;widget_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;proc_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;display_name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;wd=widget_data&lt;/code&gt; in the lambda captures by reference, not by value. So when the render loop updates &lt;code&gt;proc_name&lt;/code&gt;, the tooltip reads the fresh name. No timer, no polling, no auto-hide. Mouse in = tooltip. Mouse out = gone. User reads at their own pace.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. First Setup &amp;amp; Drivers — Building a Driver Booster From Scratch
&lt;/h2&gt;

&lt;p&gt;This was the big one. Not planned for Monday. Not planned for this week at all. Just... happened.&lt;/p&gt;

&lt;p&gt;I opened Driver Booster, IObit's tool, the one everyone installs when they get a new PC. And I thought: what does it actually &lt;em&gt;do&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;It reads your installed drivers. Checks versions. Shows you what's outdated. That's it. The "boost" part is just a download link.&lt;/p&gt;

&lt;p&gt;I can do that. Without internet. Without admin rights. Without a third-party API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reading Drivers From the Windows Registry
&lt;/h3&gt;

&lt;p&gt;Windows stores driver metadata in the registry under &lt;code&gt;SYSTEM\CurrentControlSet\Control\Class\{GUID}&lt;/code&gt;. Each device class (GPU, Audio, Network, USB) has its own GUID. You open the key, enumerate subkeys, and read three values: &lt;code&gt;DriverDesc&lt;/code&gt;, &lt;code&gt;DriverVersion&lt;/code&gt;, &lt;code&gt;DriverDate&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_read_class_driver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;guid&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;key_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;fr&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SYSTEM\CurrentControlSet\Control\Class\{guid}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OpenKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;QueryInfoKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
            &lt;span class="n"&gt;sn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;EnumKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;sn&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;OpenKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;desc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;QueryValueEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DriverDesc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_SKIP&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="k"&gt;continue&lt;/span&gt;
                &lt;span class="n"&gt;ver&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;QueryValueEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DriverVersion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;drv_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;QueryValueEx&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DriverDate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&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;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;drv_date&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No internet call. No admin popup. Just &lt;code&gt;winreg.OpenKey&lt;/code&gt; on &lt;code&gt;HKEY_LOCAL_MACHINE&lt;/code&gt;. Windows lets you &lt;em&gt;read&lt;/em&gt; this without elevation. You just can't &lt;em&gt;write&lt;/em&gt; to it.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;_SKIP&lt;/code&gt; list filters out virtual network adapters (Hyper-V, VPN clients, Docker). Without it, the page fills up with phantom devices nobody cares about.&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.amazonaws.com%2Fuploads%2Farticles%2Fpddbtk95lf4ah74pdxsz.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%2Fpddbtk95lf4ah74pdxsz.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Date Format Problem
&lt;/h3&gt;

&lt;p&gt;Driver dates come from the registry as strings. Sounds simple. Except Windows uses at least three different formats depending on... I honestly don't know what. Device class? Driver manufacturer? Phase of the moon?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MM-DD-YYYY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;YYYY-MM-DD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;YYYYMMDD&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;_driver_age_days()&lt;/code&gt; function tries all three. If none work, it returns &lt;code&gt;None&lt;/code&gt; and the health score takes a small penalty for "unknown age" instead of crashing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Health Score — Computed, Not Faked
&lt;/h3&gt;

&lt;p&gt;Driver Booster shows you a big number. "Your system health: 73%." Where does that number come from? Nobody knows.&lt;/p&gt;

&lt;p&gt;Mine is transparent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_compute_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;startup_count&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_driver_age_days&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;startup_count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;startup_count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Driver older than a year? Minus 20. Unknown date? Minus 6. Too many startup programs? Penalty. The formula is right there. You can read it, disagree with it, and fork it.&lt;/p&gt;

&lt;p&gt;The score renders as an arc gauge drawn with &lt;code&gt;canvas.create_arc()&lt;/code&gt;. 270° sweep, green→amber→red based on value. Nothing fancy. Nothing hidden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Actions
&lt;/h3&gt;

&lt;p&gt;The page also has a Quick Actions panel. One-click access to Device Manager, Services, System Info, and MSConfig. These are just &lt;code&gt;subprocess.Popen&lt;/code&gt; calls to &lt;code&gt;devmgmt.msc&lt;/code&gt;, &lt;code&gt;services.msc&lt;/code&gt;, &lt;code&gt;msinfo32.exe&lt;/code&gt;, and &lt;code&gt;msconfig.exe&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Sounds trivial. But I deep-researched what other tools in this space offer for first-time PC setup, and most of them... don't offer this. They focus on the driver scan and ignore the fact that someone setting up a new machine probably also wants quick access to system tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Architecture Bit
&lt;/h3&gt;

&lt;p&gt;The page itself is ~370 lines (&lt;code&gt;ui/pages/first_setup_drivers.py&lt;/code&gt;). UI builds immediately — instant render, no loading screen. The driver scan runs in a &lt;code&gt;threading.Thread&lt;/code&gt; and posts results back to the main thread via &lt;code&gt;sf.after(0, lambda: _apply(...))&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Startup programs come from two registry hives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;paths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HKEY_CURRENT_USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SOFTWARE\Microsoft\Windows\CurrentVersion\Run&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winreg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
     &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SOFTWARE\Microsoft\Windows\CurrentVersion\Run&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;System&lt;/span&gt;&lt;span class="sh"&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;User-level and system-level. Both matter.&lt;/p&gt;

&lt;p&gt;There's also a setup checklist that persists to &lt;code&gt;data/cache/setup_checklist.json&lt;/code&gt;. Toggle items on click, progress bar updates live. Small thing, but it makes the page feel like a tool you come back to, not a one-time scan.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Bug Nobody Noticed
&lt;/h2&gt;

&lt;p&gt;The "First Setup &amp;amp; Drivers" button in &lt;code&gt;yourpc_page.py&lt;/code&gt; was routing to the wrong page.&lt;/p&gt;

&lt;p&gt;Click "First Setup &amp;amp; Drivers" → opens the optimization wizard. Not the setup page. The optimization wizard worked fine, so nobody reported it. Including me. I was clicking through the sidebar, not through the yourpc page buttons.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before (wrong):
&lt;/span&gt;&lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_nav_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;optimization_wizard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# After (correct):
&lt;/span&gt;&lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_nav_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;first_setup&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One line. Probably been wrong since the button was created. The sidebar badge now also shows the live checklist state (e.g., "3/6 done"), loaded from JSON on every render.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Scars
&lt;/h2&gt;

&lt;p&gt;Every week has them. Here are this week's:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The scroll_frame width trap.&lt;/strong&gt; When you embed a &lt;code&gt;tk.Frame&lt;/code&gt; inside a &lt;code&gt;tk.Canvas&lt;/code&gt; via &lt;code&gt;create_window&lt;/code&gt;, the frame doesn't automatically fill the canvas width. Your entire page content renders in a narrow strip on the left. All your &lt;code&gt;fill="x"&lt;/code&gt; packs are filling a 1px-wide frame and you don't know why.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;win_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_window&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Configure&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;itemconfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;win_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One binding. Took me 10 minutes of staring at the screen to figure out. If you're doing scrollable frames in tkinter — bookmark this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The dead-code ghost.&lt;/strong&gt; Earlier in the project, I deleted a &lt;code&gt;_build_yourpc_page_OLD_REMOVED&lt;/code&gt; function. But a nested function inside it (&lt;code&gt;_build_sensors_page_placeholder&lt;/code&gt;) survived the edit because the first attempt only replaced the function header, leaving the body orphaned. 40 lines of dead code sitting there, not breaking anything, not doing anything. Just vibing. Had to go back and kill it properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The write tool rejection.&lt;/strong&gt; After writing ~370 lines for the new Setup &amp;amp; Drivers page, the file write failed because a linter touched the file between read and write. Had to re-read and re-issue the entire write. Not a code problem. Workflow problem. Lesson: on large files, write in one shot without anything touching the file in between.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Coming — The Week Plan (v1.7.2 → v1.7.4)
&lt;/h2&gt;

&lt;p&gt;This was the Monday Grind Blueprint #3 plan. Here's what's on the board:&lt;/p&gt;

&lt;h3&gt;
  
  
  Dashboard Button Redesign
&lt;/h3&gt;

&lt;p&gt;The buttons work. They look like 2015. PIL-generated gradients, canvas caching for button states, CSS-like hover system with state tracking. Zero FPS impact — gradients are pre-rendered once on init, then reused. The purple color scheme stays.&lt;/p&gt;

&lt;h3&gt;
  
  
  System Cleanup Utilities
&lt;/h3&gt;

&lt;p&gt;Temp files cleaner (&lt;code&gt;%temp%&lt;/code&gt;, &lt;code&gt;Windows\Temp&lt;/code&gt;, Prefetch, browser caches). Log file manager with archive-before-delete. Startup optimizer with enable/disable toggles and impact ratings (High/Medium/Low).&lt;/p&gt;

&lt;p&gt;One rule that won't change: &lt;strong&gt;nothing gets deleted without explicit user confirmation.&lt;/strong&gt; No "we cleaned 2.3 GB!" surprises. You see the size, you confirm, then it happens. Detailed log of everything that was removed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Complete "My PC" Health Tab
&lt;/h3&gt;

&lt;p&gt;Right now: pretty placeholder. This week: real hardware detection via WMI queries (&lt;code&gt;Win32_Processor&lt;/code&gt;, &lt;code&gt;Win32_VideoController&lt;/code&gt;), temperature warnings (&amp;gt;85°C yellow, &amp;gt;90°C red), uptime stats, and JSON export for the health report.&lt;/p&gt;

&lt;h3&gt;
  
  
  TURBO — Auto RAM Flush
&lt;/h3&gt;

&lt;p&gt;The one I'm most curious about. Advanced SystemCare and CCleaner claim 300-800 MB freed. What are they actually doing?&lt;/p&gt;

&lt;p&gt;Researching three approaches:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;EmptyStandbyList.exe&lt;/code&gt; (Sysinternals) — clears standby list&lt;/li&gt;
&lt;li&gt;Native Python via &lt;code&gt;ctypes&lt;/code&gt; (&lt;code&gt;SetSystemFileCacheSize&lt;/code&gt;) — direct kernel call&lt;/li&gt;
&lt;li&gt;Gentle per-process working set flush — least aggressive&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Trigger: RAM &amp;gt;75% for &amp;gt;30 seconds. Measure before/after. Show the user exactly how much was freed. Toggle on/off, threshold adjustable.&lt;/p&gt;

&lt;p&gt;If it works reliably without causing instability, it becomes the first real TURBO feature in PC Workman.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Version: 1.7.2&lt;/li&gt;
&lt;li&gt;Hours logged: 800+&lt;/li&gt;
&lt;li&gt;GitHub stars: 23&lt;/li&gt;
&lt;li&gt;Downloads: ~100&lt;/li&gt;
&lt;li&gt;Roadmap issues: 17 tracked, 4 done, 7 in review&lt;/li&gt;
&lt;li&gt;Retail shifts between coding sessions: 5 per week&lt;/li&gt;
&lt;li&gt;Microsoft Store: Q4 2026&lt;/li&gt;
&lt;li&gt;Sleep this week: not enough&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;I started PC Workman on a laptop hitting 94°C during compilation. Got fired three days before Christmas. Moved back to Poland. Started working at Żabka to pay bills while I keep building.&lt;/p&gt;

&lt;p&gt;This isn't a weekend project. It's 800+ hours of "I refuse to let another project die at 70%."&lt;/p&gt;

&lt;p&gt;v1.7.2 is the most feature-complete version yet. The First Setup &amp;amp; Drivers page alone competes with tools people pay for. The process library makes hck_GPT actually useful instead of just impressive. The timestamps make diagnostics real instead of vague.&lt;/p&gt;

&lt;p&gt;And we're not even at v2.0 yet.&lt;/p&gt;

&lt;p&gt;If you're building something solo, between shifts, between life — I see you. Keep shipping. Even the messy weeks count.&lt;/p&gt;

&lt;p&gt;Star the repo if you want to follow along: &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;github.com/HuckleR2003/PC_Workman_HCK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All my links: &lt;a href="https://linktr.ee/marcin_firmuga" rel="noopener noreferrer"&gt;linktr.ee/marcin_firmuga&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monday Grind Blueprint sets the bar.&lt;br&gt;
Wednesday Code Autopsy cuts it open.&lt;br&gt;
Friday Shipped &amp;amp; Scarred shows what actually happened.&lt;/p&gt;

&lt;p&gt;See you Wednesday.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;About the Author&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I'm Marcin Firmuga. Solo developer and founder of HCK_Labs. Building PC Workman — an open-source AI-powered system monitor — from scratch, publicly, honestly. Before this: game translations, IT technician internships, warehouse shifts in the Netherlands, and twelve failed projects I never finished. This one stuck.&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fnb6yo3bn8n0vc5t4vhvu.jpg" 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%2Fnb6yo3bn8n0vc5t4vhvu.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow the build: &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://x.com/hck_lab" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt; · &lt;a href="https://linkedin.com/in/marcinfirmuga" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; · &lt;a href="https://medium.com/@MarcinFirmuga" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>python</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>Friday Shipped &amp; Scarred #3: PC Workman 1.7.1, The Foundation Great Release</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Fri, 10 Apr 2026 08:32:02 +0000</pubDate>
      <link>https://forem.com/huckler/friday-shipped-scarred-3-pc-workman-171-the-foundation-great-release-10aj</link>
      <guid>https://forem.com/huckler/friday-shipped-scarred-3-pc-workman-171-the-foundation-great-release-10aj</guid>
      <description>&lt;p&gt;&lt;strong&gt;PC Workman v1.7.1 shipped this morning:&lt;/strong&gt;&lt;br&gt;
18 test cases rewritten (previously broken)&lt;br&gt;&lt;br&gt;
~130 lines dead code removed&lt;br&gt;
UI component refactor (AnimatedBar class)&lt;br&gt;&lt;br&gt;
3 chart bugs fixed (startup blank screen, filter lag, color inconsistency)&lt;br&gt;&lt;br&gt;
Process display redesign (readability improvements)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No new monitoring features.&lt;/strong&gt; That's the point. This is infrastructure for TURBO Mode (system optimization tools coming in 1.7.x series).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python, PyQt6, tkinter, psutil, SQLite&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Dev time:&lt;/strong&gt; Single morning (flow state after 9h retail shift)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Community impact:&lt;/strong&gt; Closed testing issue from @Mary-devz&lt;/p&gt;


&lt;h2&gt;
  
  
  The Plan vs The Reality
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Monday's roadmap:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 issues from 1.7.8 milestone&lt;/li&gt;
&lt;li&gt;UI button redesign&lt;/li&gt;
&lt;li&gt;Code optimization in hck_gpt/&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What actually happened:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tuesday-Wednesday: Schema.org validator debugging&lt;/li&gt;
&lt;li&gt;Thursday: 9h Żabka shift → 00:30 home → 5.5h sleep&lt;/li&gt;
&lt;li&gt;Friday 6 AM: Flow state activated → full release shipped&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Not what I planned. Better than what I planned.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Dead Code Archaeology
&lt;/h2&gt;

&lt;p&gt;Fast-moving projects accumulate technical debt. PC Workman went from simple psutil wrapper to multi-module platform in ~12 months. That speed left artifacts.&lt;/p&gt;
&lt;h3&gt;
  
  
  Example: main_window_expanded.py
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_build_yourpc_page_OLD_REMOVED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Old implementation of Your PC page.
    Extracted to ui/components/yourpc_page.py in v1.5.2
    ~130 lines of dead UI code
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# ... 130 lines that haven't been called in 4 months
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Not connected to anything. Never called. Just cognitive overhead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Delete. Entire function removed.&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.amazonaws.com%2Fuploads%2Farticles%2Fvajdzu08wz36dkgunass.gif" 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%2Fvajdzu08wz36dkgunass.gif" alt=" " width="1162" height="607"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Example: core/monitor.py
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;  &lt;span class="c1"&gt;# Used: never
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;    &lt;span class="c1"&gt;# Used: everywhere
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Remove unused import.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Example: requirements.txt
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tkinter
tk&amp;gt;=0.1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Both are stdlib. Neither is pip-installable. Silent failures on &lt;code&gt;pip install -r requirements.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Remove both. Document stdlib dependencies in README instead.&lt;/p&gt;


&lt;h2&gt;
  
  
  Test Suite Rewrite: From Broken to Verified
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Before (test_monitor.py):
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_monitor_has_read&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;monitor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;       &lt;span class="c1"&gt;# ❌ Method doesn't exist
&lt;/span&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cpu_percent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Actual method:&lt;/strong&gt; &lt;code&gt;monitor.read_snapshot()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This test has &lt;strong&gt;never passed.&lt;/strong&gt; It was never run.&lt;/p&gt;


&lt;h3&gt;
  
  
  After (test_monitor.py):
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;core.monitor.psutil.cpu_percent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;45.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;core.monitor.psutil.virtual_memory&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;core.monitor.psutil.disk_usage&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;core.monitor.psutil.net_io_counters&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_read_snapshot_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_net&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_disk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_mem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_cpu&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Snapshot contains all required keys with correct types&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;mock_mem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MagicMock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;62.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mock_disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MagicMock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;78.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mock_net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MagicMock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes_sent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes_recv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;monitor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_snapshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cpu_percent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cpu_percent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ram_percent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;psutil fully mocked (no live system dependency)&lt;/li&gt;
&lt;li&gt;Actual method name used&lt;/li&gt;
&lt;li&gt;Type validation added&lt;/li&gt;
&lt;li&gt;Runs in CI without hardware&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Test Coverage Summary
&lt;/h2&gt;
&lt;h3&gt;
  
  
  test_monitor.py (7 cases)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Snapshot key presence &amp;amp; types&lt;/li&gt;
&lt;li&gt;Process list parsing correctness&lt;/li&gt;
&lt;li&gt;Sort order (CPU, RAM)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;top_processes(n)&lt;/code&gt; limit enforcement&lt;/li&gt;
&lt;li&gt;Cache hit behavior&lt;/li&gt;
&lt;li&gt;Background thread population timing&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  test_analyzer.py (7 cases)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Zero-buffer edge case (should return zeroes)&lt;/li&gt;
&lt;li&gt;CPU average calculation accuracy&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;averages_now_1h_4h()&lt;/code&gt; structure validation&lt;/li&gt;
&lt;li&gt;Timestamp-based sample filtering&lt;/li&gt;
&lt;li&gt;Spike detection (clear jump vs stable values)&lt;/li&gt;
&lt;li&gt;Threshold sensitivity&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  test_avg_calculator.py (4 cases)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Missing file handling (empty list return)&lt;/li&gt;
&lt;li&gt;Single-day aggregation with known values&lt;/li&gt;
&lt;li&gt;Multi-day split (separate avg per date)&lt;/li&gt;
&lt;li&gt;Result dict key validation&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Total:&lt;/strong&gt; 18 test cases, all using &lt;code&gt;unittest.mock&lt;/code&gt;, zero live system dependencies.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; TURBO Mode features (coming soon) will mutate system state. Verified data pipeline baseline is essential.&lt;/p&gt;


&lt;h2&gt;
  
  
  UI Component: AnimatedBar
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;Bars updated instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before - instant jump
&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpu_bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relwidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;new_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Visually jarring when values change significantly (e.g., 20% → 75%).&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.amazonaws.com%2Fuploads%2Farticles%2Fiqu6jhfvkon2hf97sooh.gif" 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%2Fiqu6jhfvkon2hf97sooh.gif" alt=" " width="1162" height="607"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Solution: Ease-out Animation Component
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ui/components/led_bars.py
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AnimatedBar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bg_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#1e293b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_fill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bg_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_fill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rely&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relwidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relheight&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_animating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Set target percentage (0.0 to 1.0)&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pct&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_animating&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_animating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_step&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Animation frame (ease-out)&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_target&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_current&lt;/span&gt;

        &lt;span class="c1"&gt;# Snap threshold: 0.4%
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.004&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_target&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_fill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relwidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_animating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;

        &lt;span class="c1"&gt;# Ease factor: 18% of gap per frame
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_current&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.18&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_fill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;place&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relwidth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_current&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# ~60fps
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_fill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_step&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Design Choices
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;th&gt;Reasoning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease-out vs fixed-step&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Always converges, no oscillation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Snap threshold (0.4%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Prevents infinite micro-adjustments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;18% ease factor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast initial movement, smooth slow-down&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;16ms frame time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~60fps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Layout-agnostic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;bg_frame&lt;/code&gt; packs/grids anywhere&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Session Averages (3 bars)
&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpu_bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AnimatedBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#3b82f6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpu_bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bg_frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpu_bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_target&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.63&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 63%
&lt;/span&gt;
&lt;span class="c1"&gt;# TOP 5 Processes (10 bars × 2 panels = 20 instances)
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cpu_bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AnimatedBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#3b82f6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ram_bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AnimatedBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#fbbf24&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# ... layout logic
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; All bars in app use same component. Future bars = 2 lines of code.&lt;/p&gt;
&lt;/blockquote&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%2Flwsams2oto9i43ugmwpk.gif" 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%2Flwsams2oto9i43ugmwpk.gif" alt=" " width="1162" height="700"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Process Display Redesign
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before (22px tall):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. chrome.exe    [C ████░░ 12%] [R ██░░░░ 8%]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Issues:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single-char labels (&lt;code&gt;C&lt;/code&gt;, &lt;code&gt;R&lt;/code&gt;) unclear&lt;/li&gt;
&lt;li&gt;Name truncated at 14 chars (&lt;code&gt;EpicGamesLau...&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Cramped layout&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  After (36px tall):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. chrome.exe
   CPU ████████░░ 12%   |   RAM ████░░░░ 35%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Changes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two-line layout&lt;/li&gt;
&lt;li&gt;Full labels (CPU, RAM) in accent colors&lt;/li&gt;
&lt;li&gt;Name limit: 20 chars (covers most processes)&lt;/li&gt;
&lt;li&gt;Equal-width bars with visual divider&lt;/li&gt;
&lt;li&gt;Better hierarchy (name bold, metrics secondary)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Implementation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Row container
&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bg_panel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Line 1: Process name
&lt;/span&gt;&lt;span class="n"&gt;name_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;proc_name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bg_panel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;fg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consolas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bold&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;anchor&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;name_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Line 2: Metrics container
&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bg_panel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pady&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# CPU half
&lt;/span&gt;&lt;span class="n"&gt;cpu_frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bg_panel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;cpu_frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;left&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;both&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cpu_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpu_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CPU&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                     &lt;span class="n"&gt;fg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#3b82f6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consolas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;cpu_label&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;left&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cpu_bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AnimatedBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpu_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;#3b82f6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cpu_bar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bg_frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;left&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expand&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cpu_pct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpu_frame&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cpu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="n"&gt;fg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;muted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Consolas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;cpu_pct&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;right&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Divider
&lt;/span&gt;&lt;span class="n"&gt;divider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;THEME&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;muted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;divider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;side&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;left&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;padx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# RAM half (same pattern)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Processes now identifiable at a glance. No guessing what &lt;code&gt;C&lt;/code&gt; and &lt;code&gt;R&lt;/code&gt; mean.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Chart Fixes: Three Bugs, One Session
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Bug 1: Blank on Startup
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; &lt;code&gt;canvas.winfo_width()&lt;/code&gt; returns &lt;code&gt;1&lt;/code&gt; before tkinter paints widget. Retry logic was fragile.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Canonical tkinter pattern for "wait for real dimensions"
&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;realtime_canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Configure&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_on_chart_configure&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_on_chart_configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Fires when canvas gets real dimensions (or resizes)&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_chart_items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;  &lt;span class="c1"&gt;# Reset item pool
&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_schedule_chart_update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Immediate redraw
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Chart renders on first paint, every time.&lt;/p&gt;




&lt;h3&gt;
  
  
  Bug 2: Filter Lag
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Clicking &lt;code&gt;1H&lt;/code&gt; or &lt;code&gt;4H&lt;/code&gt; loaded data but chart didn't update until next 2-second tick.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_on_filter_click&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filter_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;User clicked 1H, 4H, or Live&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_current_filter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filter_name&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_load_chart_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_schedule_chart_update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# ← Added this line
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Instant visual feedback on filter change.&lt;/p&gt;




&lt;h3&gt;
  
  
  Bug 3: Color Inconsistency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Chart used &lt;code&gt;#1e3a8a&lt;/code&gt;, &lt;code&gt;#92400e&lt;/code&gt;, &lt;code&gt;#064e3b&lt;/code&gt; (dark navy, brown, dark green) — remnants from intermediate implementation.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Consistent palette used everywhere else in app
&lt;/span&gt;&lt;span class="n"&gt;CHART_COLORS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cpu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#3b82f6&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# Blue
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ram&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#fbbf24&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;# Amber
&lt;/span&gt;    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gpu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;#10b981&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;    &lt;span class="c1"&gt;# Green
&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;Result:&lt;/strong&gt; Visual consistency across entire interface.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Coming: TURBO Mode
&lt;/h2&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%2Fsvbwaqryrpwfn1ssvv2y.gif" 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%2Fsvbwaqryrpwfn1ssvv2y.gif" alt=" " width="1162" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The 1.7.x series builds toward &lt;strong&gt;TURBO Mode&lt;/strong&gt; — Windows system optimization tools triggered from dashboard.&lt;/p&gt;

&lt;h3&gt;
  
  
  Planned Features
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Stop Non-Essential Services
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Pseudocode
&lt;/span&gt;&lt;span class="n"&gt;essential&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Dhcp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Dnscache&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;EventLog&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...]&lt;/span&gt;
&lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_running_services&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;stoppable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;essential&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stoppable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpu_avg_7d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ram_avg_mb&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&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;Impact:&lt;/strong&gt; Free CPU/RAM from background services user doesn't need.&lt;/p&gt;




&lt;h4&gt;
  
  
  2. Unpark CPU Cores
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Windows parks cores under light load
# TURBO unpaks all physical cores
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cpu_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logical&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="nf"&gt;set_core_parked_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&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;Impact:&lt;/strong&gt; All cores available for compute-heavy tasks.&lt;/p&gt;




&lt;h4&gt;
  
  
  3. Auto Power Plan Switch
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Switch based on load threshold
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cpu_avg_5min&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;gpu_avg_5min&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;set_power_plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;High Performance&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;set_power_plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Balanced&lt;/span&gt;&lt;span class="sh"&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;Impact:&lt;/strong&gt; Performance when needed, power saving when idle.&lt;/p&gt;




&lt;h4&gt;
  
  
  4. RAM Flush (&amp;gt;75% usage)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Clear Windows standby list
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ram_percent&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;flush_standby_list&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# ctypes call to kernel32
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Reclaim cached RAM under memory pressure.&lt;/p&gt;




&lt;h4&gt;
  
  
  5. Suspend Inactive Processes
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Identify processes idle &amp;gt;10min
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;proc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;running_processes&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpu_time_last_10min&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suspend&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# psutil.Process.suspend()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Impact:&lt;/strong&gt; Free resources from backgrounded apps.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TURBO Mode touches Windows internals.&lt;/strong&gt; Incorrect implementation = system instability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Verified data pipeline (tests)&lt;/li&gt;
&lt;li&gt;Clean codebase (no dead code confusion)&lt;/li&gt;
&lt;li&gt;Stable UI components (AnimatedBar reusable)&lt;/li&gt;
&lt;li&gt;Bug-free monitoring (chart fixes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;v1.7.1 provides all of these.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When TURBO features land (1.7.2-1.7.8), they'll be built on solid foundation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Scarred: Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Sleep debt is real
&lt;/h3&gt;

&lt;p&gt;Flow state at 6 AM on 5.5h sleep? Lucky. Not sustainable.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Foundation work is invisible
&lt;/h3&gt;

&lt;p&gt;No screenshots. No new features. But when TURBO Mode doesn't crash Windows? This is why.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Community feedback → credibility
&lt;/h3&gt;

&lt;p&gt;Mary-devz raised testing issue. I shipped tests. Issue closed. Trust built.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Flow state doesn't wait
&lt;/h3&gt;

&lt;p&gt;Best coding happens when it happens. 9h retail shift → 5.5h sleep → flow state → full release.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Plan around energy, not calendar.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.7.2 scope (next week):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI button redesign (original roadmap item)&lt;/li&gt;
&lt;li&gt;Possibly auto-update check (#14 - quick win)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;1.7.x series:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TURBO Mode implementation (features listed above)&lt;/li&gt;
&lt;li&gt;Complete "My PC" health tab&lt;/li&gt;
&lt;li&gt;Microsoft Store preparation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Long-term:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;v1.7.8 feature-complete&lt;/li&gt;
&lt;li&gt;Store submission Q3 2026&lt;/li&gt;
&lt;li&gt;v2.0 with full TURBO suite&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Core&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Python 3.8+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UI Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PyQt6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy UI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;tkinter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;psutil&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQLite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;unittest + unittest.mock&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PyInstaller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Signing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sigstore&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PC Workman v1.7.1:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK/releases/tag/v1.7.1" rel="noopener noreferrer"&gt;Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK#readme" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK/releases/latest" rel="noopener noreferrer"&gt;Download Latest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Follow development:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X: &lt;a href="https://twitter.com/hck_lab" rel="noopener noreferrer"&gt;@hck_lab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://linkedin.com/in/marcinfirmuga" rel="noopener noreferrer"&gt;Marcin Firmuga&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dev.to: &lt;a href="https://dev.to/huckler"&gt;@huckler&lt;/a&gt;
&lt;a href="https://ko-fi.com/hhlabs" rel="noopener noreferrer"&gt;COFFE? - And All Where I am :)&lt;/a&gt;
&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%2F3pxw2awrjdszgdw1l2tw.jpg" 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%2F3pxw2awrjdszgdw1l2tw.jpg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Friday Shipped &amp;amp; Scarred continues next week.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Marcin Firmuga (HCK_Labs)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Building PC Workman in public. One release at a time.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>github</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Monday Grind Blueprint #2: 80 Processes Explained, 3 Issues Targeted, 1 Week to Ship</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Mon, 06 Apr 2026 22:05:17 +0000</pubDate>
      <link>https://forem.com/huckler/monday-grind-blueprint-2-80-processes-explained-3-issues-targeted-1-week-to-ship-785</link>
      <guid>https://forem.com/huckler/monday-grind-blueprint-2-80-processes-explained-3-issues-targeted-1-week-to-ship-785</guid>
      <description>&lt;h3&gt;
  
  
  Nobody needs another AI feature.
&lt;/h3&gt;

&lt;p&gt;They need to know if svchost.exe is safe or a virus.&lt;br&gt;
I spent Easter weekend building something embarrassingly simple: a JSON file that explains what 80+ Windows processes actually do.&lt;br&gt;
Not machine learning. Not blockchain integration. Not "AI-powered insights."&lt;br&gt;
Just context.&lt;br&gt;
And it works better than I expected.&lt;/p&gt;

&lt;p&gt;The Problem: Task Manager Shows Data, Not Understanding&lt;br&gt;
Open Task Manager right now. You'll see:&lt;/p&gt;

&lt;p&gt;svchost.exe — 6 instances, 800MB RAM&lt;br&gt;
dwm.exe — 40% CPU spike&lt;br&gt;
RuntimeBroker.exe — Random activity&lt;br&gt;
System — Always at the top&lt;/p&gt;

&lt;p&gt;What do you do?&lt;br&gt;
Google "is svchost.exe a virus?"&lt;br&gt;
Read 10 forum threads.&lt;br&gt;
Still not sure.&lt;br&gt;
Maybe kill the process.&lt;br&gt;
Break something.&lt;br&gt;
PC_Workman now solves this in 0.5 seconds:&lt;br&gt;
Hover on svchost.exe in the chat →&lt;br&gt;
Service Host Process&lt;br&gt;
Microsoft Corporation&lt;br&gt;
Hosts Windows services. Multiple instances are normal.&lt;br&gt;
Power: Low-Medium&lt;br&gt;
Safety: Safe (part of Windows)&lt;br&gt;
CPU: 1-15% per instance&lt;br&gt;
RAM: 50-200MB per instance&lt;br&gt;
Done.&lt;br&gt;
No Google. No paranoia. Just facts.&lt;/p&gt;

&lt;p&gt;Easter Weekend: From "Too Tired" to "Shipped"&lt;br&gt;
Context:&lt;br&gt;
Week 1 at Żabka retail: 5:30 AM starts, solo store shifts by day 5, 20 zł/h (~$5/hour).&lt;br&gt;
Monday plan: Process library + timestamps + 2 articles&lt;br&gt;
Tuesday-Friday reality: Too exhausted to code after 9-hour shifts&lt;br&gt;
Saturday-Sunday: Redemption arc&lt;br&gt;
What shipped:&lt;/p&gt;

&lt;p&gt;process_library.json — 80+ process definitions&lt;br&gt;
process_library.py — Loader with lookups&lt;br&gt;
tooltip.py — Hover UI widget&lt;br&gt;
Integration in panel.py — Regex binding for chat&lt;/p&gt;

&lt;p&gt;Time: ~4 hours total&lt;br&gt;
Difficulty: Medium (Tkinter events + regex)&lt;br&gt;
Impact: HIGH (users finally understand what processes are)&lt;/p&gt;

&lt;p&gt;What I Built: The Process Library System&lt;br&gt;
File 1: process_library.json (The Data)&lt;br&gt;
Location: PC_Workman_HCK/data/process_library.json&lt;br&gt;
Size: 80+ definitions (will grow to 150+)&lt;br&gt;
Categories:&lt;/p&gt;

&lt;p&gt;System: explorer.exe, svchost.exe, dwm.exe, csrss.exe&lt;br&gt;
Browsers: chrome.exe, firefox.exe, edge.exe, opera.exe, brave.exe&lt;br&gt;
Gaming: steam.exe, valorant.exe, leagueoflegends.exe, fortnite.exe, minecraft.exe&lt;br&gt;
Development: python.exe, node.exe, code.exe, docker.exe, git.exe&lt;br&gt;
Communication: discord.exe, teams.exe, zoom.exe, slack.exe&lt;br&gt;
Media: spotify.exe, vlc.exe, obs64.exe, photoshop.exe&lt;br&gt;
Productivity: excel.exe, word.exe, notion.exe, outlook.exe&lt;br&gt;
Utilities: 7zfm.exe, winrar.exe, everything.exe&lt;br&gt;
Virtualization: vmware.exe, virtualbox.exe&lt;/p&gt;

&lt;p&gt;Structure:&lt;br&gt;
&lt;code&gt;json{&lt;br&gt;
  "chrome.exe": {&lt;br&gt;
    "name": "Google Chrome",&lt;br&gt;
    "vendor": "Google LLC",&lt;br&gt;
    "category": "browser",&lt;br&gt;
    "description": "Web browser. RAM usage increases with open tabs.",&lt;br&gt;
    "power_usage": "high",&lt;br&gt;
    "safety": "safe",&lt;br&gt;
    "typical_cpu": "5-25%",&lt;br&gt;
    "typical_ram": "200-800MB per window"&lt;br&gt;
  },&lt;br&gt;
  "svchost.exe": {&lt;br&gt;
    "name": "Service Host Process",&lt;br&gt;
    "vendor": "Microsoft Corporation",&lt;br&gt;
    "category": "system",&lt;br&gt;
    "description": "Hosts Windows services. Multiple instances are normal.",&lt;br&gt;
    "power_usage": "low_medium",&lt;br&gt;
    "safety": "safe",&lt;br&gt;
    "typical_cpu": "1-15% per instance",&lt;br&gt;
    "typical_ram": "50-200MB per instance"&lt;br&gt;
  }&lt;br&gt;
}&lt;/code&gt;&lt;br&gt;
No AI-generated descriptions. All written in plain English, human-verified.&lt;/p&gt;

&lt;p&gt;File 2: process_library.py (The Loader)&lt;br&gt;
Location: PC_Workman_HCK/hck_gpt/process_library.py&lt;br&gt;
What it does:&lt;/p&gt;

&lt;p&gt;Loads JSON on startup&lt;br&gt;
Provides case-insensitive lookups&lt;br&gt;
Formats tooltip text for display&lt;/p&gt;

&lt;p&gt;Implementation:&lt;br&gt;
pythonclass ProcessLibrary:&lt;br&gt;
`    """Loads process definitions from JSON and provides lookups"""&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def __init__(self):
    self.processes = {}
    self._load_library()

def _load_library(self):
    """Load process_library.json"""
    lib_path = os.path.join(
        os.path.dirname(__file__), 
        '..', 
        'data', 
        'process_library.json'
    )

    if os.path.exists(lib_path):
        with open(lib_path, 'r', encoding='utf-8') as f:
            self.processes = json.load(f)
        print(f"[ProcessLibrary] Loaded {len(self.processes)} process definitions")

def get_process_info(self, process_name):
    """Case-insensitive lookup"""
    return self.processes.get(process_name.lower().strip())

def format_tooltip_text(self, process_name):
    """Format for display"""
    info = self.get_process_info(process_name)
    if not info:
        return None

    return f"""📦 {info['name']}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;{info['vendor']}&lt;/p&gt;

&lt;p&gt;{info['description']}&lt;/p&gt;

&lt;p&gt;Power: {info['power_usage']}&lt;br&gt;
Safety: {info['safety']}&lt;br&gt;
CPU: {info['typical_cpu']}&lt;br&gt;
RAM: {info['typical_ram']}"""&lt;/p&gt;
&lt;h1&gt;
  
  
  Singleton instance
&lt;/h1&gt;

&lt;p&gt;process_library = ProcessLibrary()`&lt;br&gt;
Why singleton? One load at startup, shared across all components.&lt;/p&gt;

&lt;p&gt;File 3: tooltip.py (The UI Widget)&lt;br&gt;
Location: PC_Workman_HCK/hck_gpt/tooltip.py&lt;br&gt;
What it does:&lt;/p&gt;

&lt;p&gt;Creates borderless tooltip window&lt;br&gt;
Positions near mouse cursor&lt;br&gt;
Displays formatted process information&lt;br&gt;
Auto-hides on mouse leave&lt;/p&gt;

&lt;p&gt;Implementation:&lt;br&gt;
pythonclass ProcessTooltip:&lt;br&gt;
`    """Shows tooltip on hover over process names"""&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def __init__(self, parent):
    self.parent = parent
    self.tooltip_window = None

def show(self, event, process_name, tooltip_text):
    """Show tooltip at mouse position"""
    if not tooltip_text:
        return

    self.hide()  # Destroy old tooltip

    # Create borderless window
    self.tooltip_window = tk.Toplevel(self.parent)
    self.tooltip_window.wm_overrideredirect(True)
    self.tooltip_window.wm_attributes("-topmost", True)

    # Position near mouse
    x = event.x_root + 20
    y = event.y_root + 10
    self.tooltip_window.wm_geometry(f"+{x}+{y}")

    # Styled frame + label
    frame = tk.Frame(
        self.tooltip_window,
        bg=THEME["bg_panel"],
        highlightbackground=THEME["accent2"],
        highlightthickness=2,
        padx=12,
        pady=8
    )
    frame.pack()

    label = tk.Label(
        frame,
        text=tooltip_text,
        bg=THEME["bg_panel"],
        fg=THEME["text"],
        font=("Consolas", 9),
        justify="left"
    )
    label.pack()

def hide(self):
    """Destroy tooltip"""
    if self.tooltip_window:
        self.tooltip_window.destroy()
        self.tooltip_window = None`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Positioning logic: +20px right, +10px down from cursor to avoid blocking text.&lt;/p&gt;

&lt;p&gt;File 4: panel.py (The Integration)&lt;br&gt;
Location: PC_Workman_HCK/hck_gpt/panel.py&lt;br&gt;
What changed:&lt;/p&gt;

&lt;p&gt;Import process library:&lt;br&gt;
`&lt;br&gt;
pythonimport re&lt;/p&gt;

&lt;p&gt;try:&lt;br&gt;
    from hck_gpt.process_library import process_library&lt;br&gt;
    from hck_gpt.tooltip import ProcessTooltip&lt;br&gt;
    HAS_PROCESS_LIBRARY = True&lt;br&gt;
except ImportError:&lt;br&gt;
    HAS_PROCESS_LIBRARY = False&lt;br&gt;
    print("[hck_GPT] Process library not available")&lt;/p&gt;

&lt;p&gt;Initialize tooltip in &lt;strong&gt;init&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;python# Tooltip system&lt;br&gt;
self.tooltip = ProcessTooltip(parent) if HAS_PROCESS_LIBRARY else None&lt;/p&gt;

&lt;p&gt;Bind tooltips method:&lt;/p&gt;

&lt;p&gt;pythondef _bind_process_tooltips(self):&lt;br&gt;
    """Scan chat text for process names and bind hover events"""&lt;br&gt;
    if not HAS_PROCESS_LIBRARY or not self.tooltip:&lt;br&gt;
        return&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Get all text
content = self.log.get("1.0", "end-1c")

# Search for .exe patterns
exe_pattern = r'\b\w+\.exe\b'

for match in re.finditer(exe_pattern, content, re.IGNORECASE):
    process_name = match.group(0)

    # Check if process exists in library
    info = process_library.get_process_info(process_name)

    if info:
        # Create unique tag
        tag_name = f"process_{process_name}_{match.start()}"

        # Add tag to text
        # (Tkinter text index conversion logic here)
        self.log.tag_add(tag_name, start_pos, end_pos)

        # Style the tag (underline, color)
        self.log.tag_config(
            tag_name,
            foreground=THEME["accent2"],
            underline=True
        )

        # Bind hover events
        tooltip_text = process_library.format_tooltip_text(process_name)

        self.log.tag_bind(
            tag_name,
            "&amp;lt;Enter&amp;gt;",
            lambda e, pn=process_name, tt=tooltip_text: 
                self.tooltip.show(e, pn, tt)
        )

        self.log.tag_bind(
            tag_name,
            "&amp;lt;Leave&amp;gt;",
            lambda e: self.tooltip.hide()
        )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Call after adding messages:&lt;/p&gt;

&lt;p&gt;pythondef add_message(self, msg):&lt;br&gt;
    # ... add text to chat&lt;br&gt;
    self._bind_process_tooltips()  # Scan and bind`&lt;br&gt;
Regex pattern: r'\b\w+.exe\b' matches word boundaries + .exe extension (case-insensitive)&lt;br&gt;
Why unique tags? Same process can appear multiple times in chat — each occurrence needs separate hover binding.&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.amazonaws.com%2Fuploads%2Farticles%2Fy1jcqd21nc0mwrfcdvo3.gif" 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%2Fy1jcqd21nc0mwrfcdvo3.gif" alt=" " width="1162" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why This Matters&lt;br&gt;
Before process library:&lt;br&gt;
User: "epicgames.exe is using 40% CPU — is that normal?"&lt;br&gt;
Action: Google → Reddit → forum threads → paranoia → maybe kill process&lt;br&gt;
After process library:&lt;br&gt;
User hovers on epicgames.exe&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Epic Games Launcher
Epic Games, Inc.
Game distribution platform. Updates games in background.
Power: Medium-High
Safety: Safe
CPU: 10-40% (during updates)
RAM: 300-800MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;User: "Oh, it's updating games. That's fine."&lt;br&gt;
Result: Informed decision instead of guessing.&lt;/p&gt;

&lt;p&gt;This Week's Plan: 3 Issues from Roadmap 1.7.8&lt;br&gt;
Full roadmap: &lt;a href="https://github.com/users/HuckleR2003/projects/3/views/2?pane=issue&amp;amp;itemId=166508113&amp;amp;issue=HuckleR2003%7CPC_Workman_HCK%7C17" rel="noopener noreferrer"&gt;https://github.com/users/HuckleR2003/projects/3/views/2?pane=issue&amp;amp;itemId=166508113&amp;amp;issue=HuckleR2003%7CPC_Workman_HCK%7C17&lt;/a&gt;&lt;br&gt;
Total issues to v1.7.8: 17&lt;br&gt;
Selected for this week: 3&lt;/p&gt;

&lt;p&gt;Issue #1: Missing tests, discussions, packaging&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.amazonaws.com%2Fuploads%2Farticles%2F898fwsboi2e5vprq50d0.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%2F898fwsboi2e5vprq50d0.png" alt=" " width="800" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: GitHub issue from Mary-devz (community feedback)&lt;br&gt;
Problem:&lt;/p&gt;

&lt;p&gt;No automated tests yet&lt;br&gt;
Need discussion about update mechanisms&lt;br&gt;
Packaging strategy unclear&lt;/p&gt;

&lt;p&gt;Plan:&lt;/p&gt;

&lt;p&gt;Set up pytest framework&lt;br&gt;
Create test suite for core modules&lt;br&gt;
Discuss auto-update vs manual download strategy&lt;br&gt;
Define packaging requirements for Microsoft Store&lt;/p&gt;

&lt;p&gt;Why this matters: Community feedback = roadmap priorities&lt;/p&gt;

&lt;p&gt;Issue #2: [UI] Main dashboard button graphics redesign&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.amazonaws.com%2Fuploads%2Farticles%2Fhl26mjgg5ycf2mxlc1a9.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%2Fhl26mjgg5ycf2mxlc1a9.png" alt=" " width="800" height="47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: Own issue&lt;br&gt;
Problem:&lt;/p&gt;

&lt;p&gt;Current buttons functional but inconsistent&lt;br&gt;
Need final visual style before Store submission&lt;br&gt;
Button states (normal/hover/active) need polish&lt;/p&gt;

&lt;p&gt;Plan:&lt;/p&gt;

&lt;p&gt;Finalize button style guide&lt;br&gt;
Redesign primary controls (Start Monitoring, Settings, Reports)&lt;br&gt;
Implement hover animations&lt;br&gt;
Ensure accessibility (contrast ratios, click targets)&lt;/p&gt;

&lt;p&gt;Why this matters: UI = first impression for new users&lt;/p&gt;

&lt;p&gt;Issue #3: [Code] Optimize hck_gpt/ modules&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.amazonaws.com%2Fuploads%2Farticles%2Fqrv6wa2xdqwqidcp9x75.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%2Fqrv6wa2xdqwqidcp9x75.png" alt=" " width="800" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source: Own issue&lt;br&gt;
Problem:&lt;/p&gt;

&lt;p&gt;Multiple small files in hck_gpt/ folder&lt;br&gt;
Some code duplication&lt;br&gt;
Performance could be better&lt;/p&gt;

&lt;p&gt;Plan:&lt;/p&gt;

&lt;p&gt;Analyze module dependencies&lt;br&gt;
Consolidate related functionality&lt;br&gt;
Remove duplicate code&lt;br&gt;
Profile performance bottlenecks&lt;br&gt;
Document optimization decisions&lt;/p&gt;

&lt;p&gt;Why this matters: Clean code = easier maintenance = faster feature development&lt;/p&gt;

&lt;p&gt;Build-in-Public Philosophy&lt;br&gt;
Why share the struggle?&lt;br&gt;
Because "I planned X, did Y" is more valuable than "look at my perfect progress."&lt;br&gt;
Week 1 reality:&lt;/p&gt;

&lt;p&gt;Monday: Ambitious plan&lt;br&gt;
Tuesday-Friday: Too tired after Żabka&lt;br&gt;
Saturday-Sunday: Catch-up sprint&lt;br&gt;
Monday: Selective focus on 3 issues&lt;/p&gt;

&lt;p&gt;Not shipping everything. Shipping what matters.&lt;br&gt;
The gap between plan and execution = the actual content.&lt;/p&gt;

&lt;p&gt;Current State &amp;amp; Goals&lt;br&gt;
Today:&lt;/p&gt;

&lt;p&gt;Day job: Żabka retail (20 zł/h, 1-2 months bridge)&lt;br&gt;
Dev time: Weekends + evenings when possible&lt;br&gt;
PC_Workman: v1.7.0 (process library shipped)&lt;/p&gt;

&lt;p&gt;This week:&lt;/p&gt;

&lt;p&gt;Close 3 issues from roadmap&lt;br&gt;
Build momentum toward v1.7.8&lt;/p&gt;

&lt;p&gt;April target:&lt;/p&gt;

&lt;p&gt;v1.7.8 feature-complete&lt;br&gt;
All critical issues resolved&lt;/p&gt;

&lt;p&gt;Q3 2026:&lt;/p&gt;

&lt;p&gt;Microsoft Store submission&lt;br&gt;
Public release v2.0&lt;/p&gt;

&lt;p&gt;June-July 2026:&lt;/p&gt;

&lt;p&gt;Exit Żabka → Junior dev role&lt;/p&gt;

&lt;p&gt;What's Next&lt;br&gt;
Process library expansion:&lt;/p&gt;

&lt;p&gt;Target: 150+ definitions by v1.7.8&lt;br&gt;
Community contributions (submit PRs with process definitions)&lt;br&gt;
Auto-categorization for unknown processes (future)&lt;/p&gt;

&lt;p&gt;This week deliverables:&lt;/p&gt;

&lt;p&gt;Test framework setup + initial tests&lt;br&gt;
UI button redesign completed&lt;br&gt;
hck_gpt/ optimization documented&lt;/p&gt;

&lt;p&gt;Long-term vision:&lt;/p&gt;

&lt;p&gt;Microsoft Store release&lt;br&gt;
Cross-platform support (Linux, macOS)&lt;br&gt;
Process behavior learning (detect unusual patterns)&lt;/p&gt;

&lt;p&gt;Try It Yourself&lt;br&gt;
PC_Workman v1.7.0:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;https://github.com/HuckleR2003/PC_Workman_HCK&lt;/a&gt;&lt;br&gt;
Free, open source, portable .exe&lt;br&gt;
Windows 10/11&lt;/p&gt;

&lt;p&gt;Process library:&lt;/p&gt;

&lt;p&gt;JSON format (easy to extend)&lt;br&gt;
MIT license&lt;br&gt;
Contributions welcome&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.amazonaws.com%2Fuploads%2Farticles%2Frxn9ppboqqbvgp0ma3l0.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%2Frxn9ppboqqbvgp0ma3l0.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, here :)&lt;br&gt;
&lt;a href="https://linktr.ee/marcin_firmuga" rel="noopener noreferrer"&gt;All my links here :)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About the Author&lt;br&gt;
I’m Marcin Firmuga. Solo developer and founder of HCK_Labs.&lt;/p&gt;

&lt;p&gt;I created PC Workman , an open-source, AI-powered&lt;br&gt;
PC resource monitor&lt;br&gt;
built entirely from scratch on dying hardware during warehouse&lt;br&gt;
shifts in the Netherlands.&lt;br&gt;
This is the first time I’ve given one of my projects a real, dedicated home.&lt;/p&gt;

&lt;p&gt;Before this: game translations, PC technician internships, warehouse operations in multiple countries, and countless failed projects I never finished.&lt;/p&gt;

&lt;p&gt;But this one? This one stuck.&lt;br&gt;
800+ hours of code. 4 complete UI rebuilds. 16,000 lines deleted.&lt;br&gt;
3 AM all-nighters. Energy drinks and toast.&lt;/p&gt;

&lt;p&gt;And finally, an app I wouldn’t close in 5 seconds.&lt;br&gt;
That’s the difference between building and shipping.&lt;/p&gt;

&lt;p&gt;PC_Workman is the result.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>buildinpublic</category>
      <category>devops</category>
    </item>
    <item>
      <title>Friday Shipped &amp; Scarred #1: The Day git --force Deleted 130 PC Workman Commits (I Got 90 Back)</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Fri, 27 Mar 2026 13:03:34 +0000</pubDate>
      <link>https://forem.com/huckler/friday-shipped-scarred-1-the-day-git-force-deleted-130-pc-workman-commits-i-got-90-back-1947</link>
      <guid>https://forem.com/huckler/friday-shipped-scarred-1-the-day-git-force-deleted-130-pc-workman-commits-i-got-90-back-1947</guid>
      <description>&lt;h1&gt;
  
  
  Friday Shipped &amp;amp; Scarred #1: The Day git --force Deleted 130 Commits (And How I Got 90 Back)
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;First in a weekly series tracking PC_Workman development. The good, the broken, the lessons learned.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Monday: My Heart Stopped
&lt;/h2&gt;

&lt;p&gt;I ran &lt;code&gt;git push --force&lt;/code&gt; on PC_Workman.&lt;br&gt;
130 commits became 1 commit.&lt;/p&gt;

&lt;p&gt;Eight months of development history disappeared.&lt;br&gt;
Not the code. The code was fine. But the &lt;strong&gt;story&lt;/strong&gt; was gone.&lt;/p&gt;

&lt;p&gt;Every "Fixed memory leak" commit. Every "Rebuilt UI (again)" message. Every timestamp proving this project wasn't slapped together over a weekend.&lt;br&gt;
Gone.&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.amazonaws.com%2Fuploads%2Farticles%2F8thxnyxvdo253iip18dg.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%2F8thxnyxvdo253iip18dg.png" alt=" " width="800" height="158"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Panic
&lt;/h2&gt;

&lt;p&gt;First reaction: freeze.&lt;br&gt;
Second reaction: check GitHub.&lt;/p&gt;

&lt;p&gt;One commit. Master branch. That's it.&lt;br&gt;
&lt;strong&gt;Reflog?&lt;/strong&gt; Empty.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Old branches?&lt;/strong&gt; None with the history.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub API endpoints?&lt;/strong&gt; Nothing recoverable.&lt;/p&gt;

&lt;p&gt;I'd read about this happening to others. "Always backup before git surgery" they said.&lt;br&gt;
I didn't backup this time...&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.amazonaws.com%2Fuploads%2Farticles%2Fx03cw8486g6k0hn3viys.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%2Fx03cw8486g6k0hn3viys.png" alt=" " width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  The Recovery: An Accidental Save
&lt;/h2&gt;

&lt;p&gt;Then I remembered something.&lt;/p&gt;

&lt;p&gt;Three weeks ago, I created an &lt;code&gt;archive&lt;/code&gt; branch.&lt;/p&gt;

&lt;p&gt;Not for backup. Just to keep old files around for reference. Old UI screenshots. Deprecated features. That kind of thing.&lt;/p&gt;

&lt;p&gt;I checked it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;90 commits.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not the full 130. But 90 commits with complete history dating back months.&lt;/p&gt;

&lt;p&gt;The archive had saved me.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I Lost (And What I Kept)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Lost:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;40 commits (most recent work)&lt;/li&gt;
&lt;li&gt;Detailed messages about recent bugfixes&lt;/li&gt;
&lt;li&gt;Exact timeline of last month's changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kept:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;90 commits showing project evolution&lt;/li&gt;
&lt;li&gt;Proof of 8 months of development&lt;/li&gt;
&lt;li&gt;Complete rebuild history (I did 4 complete UI rebuilds - that's documented)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Could have lost:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;90 out of 130 = 69% recovery rate.&lt;/p&gt;

&lt;p&gt;Not perfect. But infinitely better than 1 out of 130.&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.amazonaws.com%2Fuploads%2Farticles%2Fc05kiexe2yns1svnly8i.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%2Fc05kiexe2yns1svnly8i.png" alt=" " width="800" height="733"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  This Week: Cleaning Up What The Disaster Exposed
&lt;/h2&gt;

&lt;p&gt;The git crisis had a silver lining: it forced me to look closely at the repository.&lt;/p&gt;

&lt;p&gt;And I found... problems.&lt;/p&gt;
&lt;h3&gt;
  
  
  Problem 1: Missing CONTRIBUTING.md
&lt;/h3&gt;

&lt;p&gt;Someone opened an issue: "CONTRIBUTING.md link is broken"&lt;br&gt;
I checked. The file was gone.&lt;br&gt;
Lost in the git chaos. Never recovered from the archive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Rewrote it from scratch. Better this time. Clearer guidelines. Actual examples.&lt;br&gt;
&lt;strong&gt;Result:&lt;/strong&gt; Contributor can now actually contribute.&lt;/p&gt;


&lt;h3&gt;
  
  
  Problem 2: AI-Generated Patterns in README
&lt;/h3&gt;

&lt;p&gt;Last week I posted on Reddit asking why my project looked "AI-generated."&lt;br&gt;
Got brutal, honest feedback:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Empty bullet points (&lt;code&gt;-&lt;/code&gt; with no text)&lt;/li&gt;
&lt;li&gt;Emoji bullets (everywhere)&lt;/li&gt;
&lt;li&gt;AI-style phrasing ("Why it's different" with arrow format)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Removed all empty bullets&lt;/li&gt;
&lt;li&gt;Removed emoji formatting
&lt;/li&gt;
&lt;li&gt;Rewrote descriptions in plain English&lt;/li&gt;
&lt;li&gt;Added actual technical depth from CHANGELOG&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitors your PC&lt;/li&gt;
&lt;li&gt;Shows graphs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
Real-time CPU, GPU, RAM tracking with historical analysis.&lt;br&gt;
Dashboard loads optimized from 800ms to 200ms through widget reuse pattern.&lt;/p&gt;

&lt;p&gt;Specific. Technical. No fluff.&lt;/p&gt;


&lt;h3&gt;
  
  
  Problem 3: Polish UI Text (In An English Project)
&lt;/h3&gt;

&lt;p&gt;I thought I'd translated everything.&lt;br&gt;
I was wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Found Polish text in:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status messages ("Ładowanie..." = "Loading...")&lt;/li&gt;
&lt;li&gt;Dashboard labels ("Użycie CPU" = "CPU Usage")
&lt;/li&gt;
&lt;li&gt;Error messages&lt;/li&gt;
&lt;li&gt;Placeholder tooltips&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Files changed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ui/windows/main_window.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ui/windows/main_window_expanded.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ui/components/fan_dashboard.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ui/components/sidebar_nav.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ui/pages/fan_control/usage_stats.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ui/pages/fan_control/hardware_info.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;6 more files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time spent:&lt;/strong&gt; 6 hours&lt;br&gt;
&lt;strong&gt;Times I thought I was done:&lt;/strong&gt; 3&lt;br&gt;
&lt;strong&gt;Times I actually was done:&lt;/strong&gt; 1&lt;/p&gt;


&lt;h3&gt;
  
  
  Problem 4: Marketing Docstrings
&lt;/h3&gt;

&lt;p&gt;Early code had docstrings like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_dashboard&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Revolutionary real-time dashboard update system.
    Leverages advanced widget reuse patterns for optimal performance.
    Seamlessly integrates with monitoring engine.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# ... actual code
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nobody talks like this in real code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;After cleanup:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_dashboard&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Update dashboard widgets. Reuses existing widgets instead of recreating.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# ... actual code
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boring. Accurate. Better.&lt;/p&gt;

&lt;p&gt;Removed from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main window files&lt;/li&gt;
&lt;li&gt;Fan dashboard&lt;/li&gt;
&lt;li&gt;All page components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Code reads like code, not a sales pitch.&lt;/p&gt;




&lt;h3&gt;
  
  
  Problem 5: Guide-AI Repository (Side Project)
&lt;/h3&gt;

&lt;p&gt;While cleaning PC_Workman, noticed Guide-AI repo was stale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No screenshots (people can't see what it does)&lt;/li&gt;
&lt;li&gt;No tags&lt;/li&gt;
&lt;li&gt;Outdated description&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fixed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added QR code demo screenshots&lt;/li&gt;
&lt;li&gt;Added proper GitHub topics (react, supabase, ai, qr-codes)&lt;/li&gt;
&lt;li&gt;Rewrote description with actual value prop
Not perfect. But visible now.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Shipped This Week
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repository cleanup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CONTRIBUTING.md rewritten&lt;/li&gt;
&lt;li&gt;README cleanup&lt;/li&gt;
&lt;li&gt;12 files Polish -&amp;gt; English translation&lt;/li&gt;
&lt;li&gt;Marketing docstrings -&amp;gt; technical docstrings&lt;/li&gt;
&lt;li&gt;Guide-AI repo updated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;90+ commits recovered and visible&lt;/li&gt;
&lt;li&gt;0 empty bullet points remaining&lt;/li&gt;
&lt;li&gt;0 Polish UI strings remaining
&lt;/li&gt;
&lt;li&gt;0 "leverages advanced" phrases remaining&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Broke
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Git recovery wasn't perfect:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lost 40 commits&lt;/li&gt;
&lt;li&gt;Lost detailed timeline of February changes&lt;/li&gt;
&lt;li&gt;Had to manually recreate some documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Translation took 3x longer than expected:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Found Polish text in 12 files (thought it was 4)&lt;/li&gt;
&lt;li&gt;Each pass found more hidden strings&lt;/li&gt;
&lt;li&gt;Final check: found 3 more files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Time management:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Planned: 2 hours for cleanup&lt;/li&gt;
&lt;li&gt;Actual: 8 hours across 3 days&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Before ANY risky git operation:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch backup-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5 seconds. Could save months.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. "Clean" code has layers
&lt;/h3&gt;

&lt;p&gt;First pass: obvious issues&lt;br&gt;&lt;br&gt;
Second pass: hidden patterns&lt;br&gt;&lt;br&gt;
Third pass: still finding things&lt;/p&gt;

&lt;p&gt;Clean once isn't enough.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Accidental backups count as backups
&lt;/h3&gt;

&lt;p&gt;That &lt;code&gt;archive&lt;/code&gt; branch saved me.&lt;br&gt;
Wasn't intentional. Still worked.&lt;br&gt;
Lesson: Keep old branches longer than you think necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Reddit feedback hurts but helps
&lt;/h3&gt;

&lt;p&gt;Being told your project "looks AI-generated" stings.&lt;br&gt;
But it pushed me to actually clean up the issues.&lt;br&gt;
Feedback &amp;lt;3.&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.amazonaws.com%2Fuploads%2Farticles%2Fiuom6r3qa5vrwjmd2h0k.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%2Fiuom6r3qa5vrwjmd2h0k.png" alt=" " width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Week:
&lt;/h2&gt;

&lt;p&gt;-Monday Blueprint Grind #1&lt;br&gt;
-Wednesday Code Autopsy #2&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Topic:&lt;/strong&gt; Process aggregation - how PC_Workman tracks per-process CPU/RAM usage without destroying performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Format:&lt;/strong&gt; Technical deep-dive into &lt;code&gt;hck_stats_engine/process_aggregator.py&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also coming:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First YouTube Short (Code Autopsy video format)&lt;/li&gt;
&lt;li&gt;v1.7.0 planning (TURBO mode research)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PC_Workman current state:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version: 1.6.8&lt;/li&gt;
&lt;li&gt;Commits visible: 90+ (recovered)&lt;/li&gt;
&lt;li&gt;Development time: 800+ hours&lt;/li&gt;
&lt;li&gt;Next milestone: v2.0 → Microsoft Store (Q3 2026)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This week's time investment:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git recovery: 2 hours&lt;/li&gt;
&lt;li&gt;README cleanup: 1 hour
&lt;/li&gt;
&lt;li&gt;Code translation: 6 hours&lt;/li&gt;
&lt;li&gt;Documentation: 1 hour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total: 10 hours&lt;/strong&gt; (planned 4, actual 10)&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It / Break It / Fix It
&lt;/h2&gt;

&lt;p&gt;PC_Workman is open source. MIT licensed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;github.com/HuckleR2003/PC_Workman_HCK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK/releases" rel="noopener noreferrer"&gt;Latest release&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow the journey:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;X: &lt;a href="https://x.com/hck_lab" rel="noopener noreferrer"&gt;@hck_lab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://linkedin.com/in/marcinfirmuga" rel="noopener noreferrer"&gt;Marcin Firmuga&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Everything: &lt;a href="https://linktr.ee/marcin_firmuga" rel="noopener noreferrer"&gt;linktr.ee/marcin_firmuga&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Building in public. Shipped &amp;amp; Scarred every Friday.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Questions, comments, roasts? Hit me up.&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Facm4yq1cf2oj061ut53d.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%2Facm4yq1cf2oj061ut53d.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About the Author
&lt;/h2&gt;

&lt;p&gt;I’m Marcin Firmuga. Solo developer and founder of HCK_Labs.&lt;/p&gt;

&lt;p&gt;I created PC Workman , an open-source, AI-powered&lt;br&gt;
PC resource monitor&lt;br&gt;
built entirely from scratch on dying hardware during warehouse&lt;br&gt;
shifts in the Netherlands.&lt;br&gt;
This is the first time I’ve given one of my projects a real, dedicated home.&lt;/p&gt;

&lt;p&gt;Before this: game translations, PC technician internships, warehouse operations in multiple countries, and countless failed projects I never finished.&lt;/p&gt;

&lt;p&gt;But this one? This one stuck.&lt;br&gt;
800+ hours of code. 4 complete UI rebuilds. 16,000 lines deleted.&lt;br&gt;
3 AM all-nighters. Energy drinks and toast.&lt;/p&gt;

&lt;p&gt;And finally, an app I wouldn’t close in 5 seconds.&lt;br&gt;
That’s the difference between building and shipping.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PC_Workman is the result.&lt;/p&gt;
&lt;/blockquote&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%2Fhkivpgr2w38bq5fuzpum.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%2Fhkivpgr2w38bq5fuzpum.png" alt=" " width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;



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

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

&lt;/div&gt;

</description>
      <category>git</category>
      <category>buildinpublic</category>
      <category>opensource</category>
      <category>python</category>
    </item>
    <item>
      <title>My first series of Wednesday Code Autopsy!
Every wednesday :)</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Wed, 25 Mar 2026 20:23:34 +0000</pubDate>
      <link>https://forem.com/huckler/my-first-series-of-wednesday-code-autopsyevery-wednesday--348n</link>
      <guid>https://forem.com/huckler/my-first-series-of-wednesday-code-autopsyevery-wednesday--348n</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/huckler/code-autopsy-1-how-90-lines-turned-system-monitoring-into-a-conversation-2jh8" class="crayons-story__hidden-navigation-link"&gt;Code Autopsy #1: How ~90 Lines Turned System Monitoring Into A Conversation&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/huckler" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3693207%2F6a4682e6-273e-4a98-9ce7-653391a5abcc.png" alt="huckler profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/huckler" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Marcin Firmuga
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Marcin Firmuga
                
              
              &lt;div id="story-author-preview-content-3403990" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/huckler" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3693207%2F6a4682e6-273e-4a98-9ce7-653391a5abcc.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Marcin Firmuga&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/huckler/code-autopsy-1-how-90-lines-turned-system-monitoring-into-a-conversation-2jh8" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/huckler/code-autopsy-1-how-90-lines-turned-system-monitoring-into-a-conversation-2jh8" id="article-link-3403990"&gt;
          Code Autopsy #1: How ~90 Lines Turned System Monitoring Into A Conversation
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/python"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;python&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/buildinpublic"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;buildinpublic&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/huckler/code-autopsy-1-how-90-lines-turned-system-monitoring-into-a-conversation-2jh8" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/huckler/code-autopsy-1-how-90-lines-turned-system-monitoring-into-a-conversation-2jh8#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>python</category>
      <category>opensource</category>
      <category>buildinpublic</category>
      <category>ai</category>
    </item>
    <item>
      <title>Code Autopsy #1: How ~90 Lines Turned System Monitoring Into A Conversation</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Wed, 25 Mar 2026 16:08:57 +0000</pubDate>
      <link>https://forem.com/huckler/code-autopsy-1-how-90-lines-turned-system-monitoring-into-a-conversation-2jh8</link>
      <guid>https://forem.com/huckler/code-autopsy-1-how-90-lines-turned-system-monitoring-into-a-conversation-2jh8</guid>
      <description>&lt;h1&gt;
  
  
  Code Autopsy #1: How 30 Lines Turned System Monitoring Into A Conversation
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Part of the PC_Workman build-in-public series. Code Autopsy drops every Wednesday.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: Numbers Without Answers
&lt;/h2&gt;

&lt;p&gt;You open Task Manager.&lt;/p&gt;

&lt;p&gt;"CPU: 87%"&lt;/p&gt;

&lt;p&gt;Cool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But WHY 87%?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Is that normal? Should you worry? What process caused it? When did it start?&lt;/p&gt;

&lt;p&gt;Task Manager doesn't answer. HWMonitor doesn't answer. MSI Afterburner doesn't answer.&lt;/p&gt;

&lt;p&gt;They show you WHAT is happening. Never WHY.&lt;/p&gt;

&lt;p&gt;That's the gap PC_Workman fills.&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.amazonaws.com%2Fuploads%2Farticles%2Fljbtnzyq2zhtazorw48a.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%2Fljbtnzyq2zhtazorw48a.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PC Workman 1.6.8 - hck_GPT in action. Service Setup - quick access to disable useless services, or services what you don't will use (Bluetooth, Print, fax). Today Report - Info about correctly collecting data by sessions. Daily usage averages. And Alerts from suspected spikes/moments by temperatures or voltage.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Solution: EventDetector
&lt;/h2&gt;

&lt;p&gt;After 800 hours building PC_Workman (most of it on a laptop that peaks at 94°C), I realized: &lt;strong&gt;users don't need more data. They need context.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built EventDetector.&lt;/p&gt;

&lt;p&gt;30 lines of Python that turn monitoring into a conversation.&lt;/p&gt;

&lt;p&gt;Here's how it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Track YOUR Baseline (Not Generic Averages)
&lt;/h2&gt;

&lt;p&gt;Most tools compare against hardcoded thresholds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"50% CPU is normal"&lt;/li&gt;
&lt;li&gt;"60% RAM is high"&lt;/li&gt;
&lt;li&gt;"80°C is warm"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Your normal isn't my normal.&lt;/p&gt;

&lt;p&gt;A gaming PC idling at 30% CPU? Normal.&lt;br&gt;&lt;br&gt;
A lightweight laptop idling at 30% CPU? Something's wrong.&lt;/p&gt;

&lt;p&gt;EventDetector tracks YOUR baseline from the last 10 minutes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_get_baseline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get recent baseline averages from minute_stats.
    Cached for 60 seconds to avoid excessive queries.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;cutoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;SPIKE_BASELINE_WINDOW&lt;/span&gt;  &lt;span class="c1"&gt;# 10 minutes
&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        SELECT AVG(cpu_avg) as cpu_avg, 
               AVG(ram_avg) as ram_avg,
               AVG(gpu_avg) as gpu_avg,
               AVG(cpu_temp) as cpu_temp, 
               AVG(gpu_temp) as gpu_temp
        FROM minute_stats
        WHERE timestamp &amp;gt;= ?
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cutoff&lt;/span&gt;&lt;span class="p"&gt;,)).&lt;/span&gt;&lt;span class="nf"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;baseline_cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key insight:&lt;/strong&gt; The baseline is YOU. Not everyone. Just you.&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.amazonaws.com%2Fuploads%2Farticles%2Fbg3li9zl2kem7yh5bxvl.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%2Fbg3li9zl2kem7yh5bxvl.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PC Workman 1.6.8 - Events detector for hck_GPT insights. Based on long-term monitoring: CPU, GPU, RAM. EventDetector code with highlights on baseline, delta, rate limiting, severity
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: Calculate Delta (Current vs YOUR Normal)
&lt;/h2&gt;

&lt;p&gt;Once we have YOUR baseline, detecting spikes is simple math:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_check_metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                  &lt;span class="n"&gt;baseline_val&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Check if a metric exceeds its threshold above baseline&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_val&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;baseline_val&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;  &lt;span class="c1"&gt;# No spike - you're within YOUR normal range
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Your CPU baseline (last 10 min): 42%&lt;/li&gt;
&lt;li&gt;Current CPU: 87%&lt;/li&gt;
&lt;li&gt;Delta: +45%&lt;/li&gt;
&lt;li&gt;Threshold: 20%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Spike detected. But we're not done yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Rate Limiting (No Alert Spam)
&lt;/h2&gt;

&lt;p&gt;Early versions of EventDetector had a problem: &lt;strong&gt;alert spam.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Chrome spikes CPU every 30 seconds? You'd get 120 alerts per hour.&lt;/p&gt;

&lt;p&gt;Useless.&lt;/p&gt;

&lt;p&gt;Solution: Rate limiting.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Rate limiting: {metric_name: last_event_timestamp}
&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_last_event_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_check_metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...):&lt;/span&gt;
    &lt;span class="c1"&gt;# ... delta calculation ...
&lt;/span&gt;
    &lt;span class="c1"&gt;# Rate limiting
&lt;/span&gt;    &lt;span class="n"&gt;last_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_last_event_time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;last_time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;SPIKE_COOLDOWN&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# 5 minutes
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt;  &lt;span class="c1"&gt;# Too soon since last alert
&lt;/span&gt;
    &lt;span class="c1"&gt;# Log the event
&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_last_event_time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Max 1 alert per metric per 5 minutes. No spam.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Severity Levels (Critical vs Warning vs Info)
&lt;/h2&gt;

&lt;p&gt;Not all spikes are equal.&lt;/p&gt;

&lt;p&gt;CPU spiking 21% above baseline? Worth noting.&lt;br&gt;&lt;br&gt;
CPU spiking 60% above baseline? &lt;strong&gt;Drop everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;EventDetector categorizes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Determine severity
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;critical&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;  &lt;span class="c1"&gt;# 🔴
&lt;/span&gt;&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;warning&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;   &lt;span class="c1"&gt;# ⚠️
&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;info&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;      &lt;span class="c1"&gt;# ℹ️
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example thresholds:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU threshold: 20%&lt;/li&gt;
&lt;li&gt;Delta 40%+: Critical&lt;/li&gt;
&lt;li&gt;Delta 30%+: Warning&lt;/li&gt;
&lt;li&gt;Delta 20-29%: Info&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Alerts match urgency.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Final Output: Context, Not Just Numbers
&lt;/h2&gt;

&lt;p&gt;Here's what you see in PC_Workman when a spike happens:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before (Task Manager):&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;CPU: 87%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After (PC_Workman):&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;⚠️ CPU spike: 87% (baseline: 42%, delta: +45%)
Chrome.exe - started 3 hours ago
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Same data. Different story.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One gives you anxiety. The other gives you action.&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.amazonaws.com%2Fuploads%2Farticles%2Fzhln3qorhsofbhzqm1o3.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%2Fzhln3qorhsofbhzqm1o3.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PC Workman 1.6.8 - My PC - Center of Actions.
STATS &amp;amp; ALERTS - Long term monitoring your components usage, process usage. And mainly time-travel TEMP and Voltages alerts about spikes, or suspected moments. Optimization &amp;amp; Services - For optimize and improve your PC performance. First Setup &amp;amp; Drivers - All for setup your new device/new os. Stability Tests - For check about correctly working of PC Workman and Database check. Your Account-Details - Soon :)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Implementation Notes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Handles 5 Metrics With Same Logic
&lt;/h3&gt;

&lt;p&gt;The beauty of this design: &lt;strong&gt;reusable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Same &lt;code&gt;_check_metric&lt;/code&gt; function handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;RAM usage&lt;/li&gt;
&lt;li&gt;GPU usage
&lt;/li&gt;
&lt;li&gt;CPU temperature&lt;/li&gt;
&lt;li&gt;GPU temperature
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_and_log_spike&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpu_avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ram_avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gpu_avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="n"&gt;cpu_temp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gpu_temp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;baseline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_get_baseline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Check each metric with same logic
&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_check_metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cpu&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpu_avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                      &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cpu_avg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
                      &lt;span class="n"&gt;SPIKE_THRESHOLD_CPU&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;CPU usage&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_check_metric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ram&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ram_avg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                      &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ram_avg&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                      &lt;span class="n"&gt;SPIKE_THRESHOLD_RAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RAM usage&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# ... and so on
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean. Maintainable. Scalable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance: Cached Baselines
&lt;/h3&gt;

&lt;p&gt;Baseline queries hit SQLite. Could be slow.&lt;/p&gt;

&lt;p&gt;Solution: 60-second cache.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_baseline_cache_time&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_baseline_cache&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_baseline_cache&lt;/span&gt;  &lt;span class="c1"&gt;# Use cached data
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Query once per minute, not once per second.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage: SQLite Events Table
&lt;/h3&gt;

&lt;p&gt;All events logged to database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
 &lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;process_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&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;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Historical tracking (what spiked last week?)&lt;/li&gt;
&lt;li&gt;Pattern detection (Chrome spikes every Tuesday?)&lt;/li&gt;
&lt;li&gt;Exportable data&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What I Learned Building This
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Users Don't Need More Data
&lt;/h3&gt;

&lt;p&gt;Early versions of PC_Workman showed 20+ metrics.&lt;/p&gt;

&lt;p&gt;Users ignored them all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Context, no quantity.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Rate Limiting Is User Experience
&lt;/h3&gt;

&lt;p&gt;First version: no rate limiting.&lt;br&gt;&lt;br&gt;
Result: 500 alerts per hour. Unusable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Silence is a feature.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Personalization.
&lt;/h3&gt;

&lt;p&gt;"50% CPU is high" works for nobody.&lt;br&gt;&lt;br&gt;
YOUR 50% vs MY 50% = different stories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Baselines must be personal.&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%2F27iyquw0l4vc8gm69u8w.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%2F27iyquw0l4vc8gm69u8w.png" alt=" "&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PC Workman 1.6.8 - hck_GPT Insights
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EventDetector stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;~30 lines core logic&lt;/li&gt;
&lt;li&gt;Handles 5 metrics&lt;/li&gt;
&lt;li&gt;Max 1 alert per metric per 5 min&lt;/li&gt;
&lt;li&gt;Baseline cached 60 sec&lt;/li&gt;
&lt;li&gt;3 severity levels&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PC_Workman stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;800+ hours development&lt;/li&gt;
&lt;li&gt;Built on 94°C laptop&lt;/li&gt;
&lt;li&gt;v1.6.8 current (v2.0 -&amp;gt; Microsoft Store, Q3 2026)&lt;/li&gt;
&lt;li&gt;60+ downloads&lt;/li&gt;
&lt;li&gt;17 stars&lt;/li&gt;
&lt;li&gt;Open source, MIT licensed&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;PC_Workman is open source.&lt;/p&gt;

&lt;p&gt;EventDetector is in &lt;code&gt;hck_stats_engine/events.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Download, run, break it, improve it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;github.com/HuckleR2003/PC_Workman_HCK&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;File what I show you:&lt;/strong&gt; &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK/blob/main/hck_stats_engine/events.py" rel="noopener noreferrer"&gt;PC_Workman_HCK/hck_stats_engine/events.py&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building in public.&lt;/strong&gt; Code Autopsy every Wednesday.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow the journey:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter: &lt;a href="https://twitter.com/hck_lab" rel="noopener noreferrer"&gt;@hck_lab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://linkedin.com/in/marcinfirmuga" rel="noopener noreferrer"&gt;Marcin Firmuga&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Everything: &lt;a href="https://linktr.ee/marcin_firmuga" rel="noopener noreferrer"&gt;linktr.ee/marcin_firmuga&lt;/a&gt;
&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%2F2zaryuy4bs91p4bpk7yn.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%2F2zaryuy4bs91p4bpk7yn.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Week: Wednesday Code Autopsy #2
&lt;/h2&gt;

&lt;p&gt;Topic: ProcessAggregator - how PC_Workman tracks which apps eat your CPU without destroying performance.&lt;br&gt;
See you Wednesday.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions? Comments? Roasts? I'm building in public. Feedback welcome.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  About the Author
&lt;/h3&gt;

&lt;p&gt;I’m &lt;strong&gt;Marcin Firmuga&lt;/strong&gt;. Solo developer and founder of HCK_Labs.&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.amazonaws.com%2Fuploads%2Farticles%2Fv5uvx9rspkvr86r98je9.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%2Fv5uvx9rspkvr86r98je9.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created PC Workman , an open-source, AI-powered&lt;br&gt;
PC resource monitor&lt;br&gt;
built entirely from scratch on dying hardware during warehouse&lt;br&gt;
shifts in the Netherlands.&lt;/p&gt;

&lt;p&gt;This is the first time I’ve given one of my projects a real, dedicated home.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before this:&lt;/strong&gt; game translations, PC technician internships, warehouse operations in multiple countries, and countless failed projects I never finished.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But this one?&lt;/strong&gt; This one stuck.&lt;br&gt;
800+ hours of code. 4 complete UI rebuilds. 16,000 lines deleted.&lt;br&gt;
3 AM all-nighters. Energy drinks and toast.&lt;/p&gt;

&lt;p&gt;And finally, an app I wouldn’t close in 5 seconds.&lt;br&gt;
That’s the difference between building and shipping.&lt;/p&gt;

&lt;p&gt;PC_Workman is the result.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>buildinpublic</category>
      <category>ai</category>
    </item>
    <item>
      <title>PC_Workman: Building a System Monitor for Microsoft Store</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Wed, 18 Mar 2026 00:44:13 +0000</pubDate>
      <link>https://forem.com/huckler/pcworkman-building-a-system-monitor-for-microsoft-store-337g</link>
      <guid>https://forem.com/huckler/pcworkman-building-a-system-monitor-for-microsoft-store-337g</guid>
      <description>&lt;h1&gt;
  
  
  PC_Workman: Building a System Monitor for Microsoft Store
&lt;/h1&gt;

&lt;p&gt;Eight months. 680 hours. 80 downloads.&lt;/p&gt;

&lt;p&gt;Now: preparing for Microsoft Store.&lt;br&gt;
Here's what's changing, what's staying, and why the Store matters.&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.amazonaws.com%2Fuploads%2Farticles%2Fcv4uryxc47sfjgeeoc2t.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%2Fcv4uryxc47sfjgeeoc2t.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Current State
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PC_Workman v1.6.8&lt;/strong&gt; shipped February 2026.&lt;/p&gt;

&lt;p&gt;Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time CPU/GPU/RAM monitoring&lt;/li&gt;
&lt;li&gt;AI diagnostics (hck_GPT)&lt;/li&gt;
&lt;li&gt;SQLite-backed stats engine&lt;/li&gt;
&lt;li&gt;Historical data tracking&lt;/li&gt;
&lt;li&gt;Fan curve control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tech:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.9+&lt;/li&gt;
&lt;li&gt;PyQt5 (UI)&lt;/li&gt;
&lt;li&gt;psutil/GPUtil (telemetry)&lt;/li&gt;
&lt;li&gt;OpenAI API (AI assistant)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Distribution:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub releases (.exe installer)&lt;/li&gt;
&lt;li&gt;Sourceforge listing&lt;/li&gt;
&lt;li&gt;80 downloads since January&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problem: &lt;strong&gt;Limited discovery.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most users don't browse GitHub for system monitors.&lt;br&gt;
They search Microsoft Store.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Microsoft Store
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Discovery:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1+ billion Windows users&lt;/li&gt;
&lt;li&gt;Built-in trust (Microsoft verification)&lt;/li&gt;
&lt;li&gt;Automatic updates&lt;/li&gt;
&lt;li&gt;One-click install&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Legitimacy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No SmartScreen warnings&lt;/li&gt;
&lt;li&gt;Code signing included&lt;/li&gt;
&lt;li&gt;Privacy policy required (forces transparency)&lt;/li&gt;
&lt;li&gt;Age ratings (shows it's vetted)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Competition:&lt;/strong&gt;&lt;br&gt;
MSI Afterburner, HWMonitor, Core Temp - none on Store.&lt;br&gt;
There's a gap.&lt;/p&gt;




&lt;h2&gt;
  
  
  v1.7.9 Roadmap (Before Store)
&lt;/h2&gt;

&lt;p&gt;16 features planned March-June 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Updates
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Auto-update checker&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check GitHub releases on startup&lt;/li&gt;
&lt;li&gt;Show banner if newer version exists&lt;/li&gt;
&lt;li&gt;User choice: update now or later&lt;/li&gt;
&lt;li&gt;No forced updates, no telemetry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dashboard graphics refresh&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New icon set&lt;/li&gt;
&lt;li&gt;Purple → blue gradients&lt;/li&gt;
&lt;li&gt;Hover animations&lt;/li&gt;
&lt;li&gt;Better visual hierarchy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code optimization pass #2&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10-15% line reduction&lt;/li&gt;
&lt;li&gt;Better performance (built on 94°C laptop, optimization isn't optional)&lt;/li&gt;
&lt;li&gt;Type hints + docstrings&lt;/li&gt;
&lt;li&gt;Remove dead code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  TURBO BOOST Mode (The Big One)
&lt;/h3&gt;

&lt;p&gt;Research from ASC, Razer Cortex, CCleaner, Wise optimizers.&lt;br&gt;
16 optimization features tested:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Auto RAM flush&lt;/strong&gt; - Clear standby memory when &amp;gt;75%&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process sleeper&lt;/strong&gt; - Suspend inactive apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service killer&lt;/strong&gt; - Stop non-essential Windows services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU unparking&lt;/strong&gt; - Unlock parked cores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power plan switch&lt;/strong&gt; - Auto "High Performance" mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Game mode&lt;/strong&gt; - Windows Game Mode auto-enable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network optimizer&lt;/strong&gt; - TCP tweaks, DNS flush&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temp cleaner&lt;/strong&gt; - Auto cleanup every X hours&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSD trim&lt;/strong&gt; - Automatic TRIM, defrag only HDD&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup optimizer&lt;/strong&gt; - Disable non-essential startup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time tune-up&lt;/strong&gt; - AI decides what to boost when&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser cache&lt;/strong&gt; - Clear without closing browser&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority manager&lt;/strong&gt; - Boost game process priority&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto detection&lt;/strong&gt; - Detect fullscreen game → trigger boost&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thermal prevention&lt;/strong&gt; - Kill processes at &amp;gt;85°C&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Battery mode&lt;/strong&gt; - Economy mode on battery&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Status:&lt;/strong&gt; Research phase.&lt;br&gt;
Testing each on dying laptop.&lt;br&gt;
Only features that actually work ship.&lt;/p&gt;

&lt;p&gt;Target: v1.7.5 (first 5), v1.7.9 (all 16)&lt;/p&gt;

&lt;h3&gt;
  
  
  Tab Completions
&lt;/h3&gt;

&lt;p&gt;Finishing placeholder pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My PC → Health Report (component diagnostics)&lt;/li&gt;
&lt;li&gt;My PC → Cleanup (temp files, logs, cache)&lt;/li&gt;
&lt;li&gt;Stability Tests (file integrity, engine status)&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%2F6vpbtmppyiz511295syp.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%2F6vpbtmppyiz511295syp.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  v2.0: Microsoft Store Preparation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Technical requirements:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MSIX packaging&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Convert .exe → .appx/msix&lt;/li&gt;
&lt;li&gt;Handle app sandboxing&lt;/li&gt;
&lt;li&gt;Limited file access (Store apps are restricted)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Code signing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires certificate (~$200-400/year)&lt;/li&gt;
&lt;li&gt;Signs app as verified developer&lt;/li&gt;
&lt;li&gt;Removes SmartScreen warnings&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Privacy policy&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required by Store&lt;/li&gt;
&lt;li&gt;PC_Workman doesn't collect data&lt;/li&gt;
&lt;li&gt;Policy explains what's monitored (local only)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Store listing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 char description&lt;/li&gt;
&lt;li&gt;4-5 screenshots&lt;/li&gt;
&lt;li&gt;High-res icon (1024x1024)&lt;/li&gt;
&lt;li&gt;Category: Utilities &amp;amp; Tools&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Challenges:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; Code signing isn't free&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxing:&lt;/strong&gt; Might break some features (needs testing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review time:&lt;/strong&gt; Can take weeks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft cut:&lt;/strong&gt; Store takes % of sales (PC_Workman is free, so irrelevant)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Alternative:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sideload MSIX (users install without Store)&lt;/li&gt;
&lt;li&gt;GitHub releases remain primary&lt;/li&gt;
&lt;li&gt;Store as secondary discovery channel&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Changes (And What Doesn't)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Changing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Distribution (GitHub + Store)&lt;/li&gt;
&lt;li&gt;Package format (.exe → MSIX)&lt;/li&gt;
&lt;li&gt;Update mechanism (Store handles it)&lt;/li&gt;
&lt;li&gt;Code signing (required)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NOT changing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free and open source (MIT license stays)&lt;/li&gt;
&lt;li&gt;No data collection (privacy-first)&lt;/li&gt;
&lt;li&gt;Core features (monitoring, AI, TURBO)&lt;/li&gt;
&lt;li&gt;GitHub development (Store is just distribution)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Timeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;March 2026: v1.7.0-1.7.3
- Auto-update
- Dashboard refresh
- Code optimization

April-May: v1.7.4-1.7.6
- TURBO features (wave 1)
- Tab completions

June: v1.7.7-1.7.9
- TURBO complete (all 16 features)
- Final optimization
- Code freeze

Q3 2026: v2.0
- MSIX packaging
- Microsoft Store submission
- Local AI integration (Ollama/LM Studio)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not promises. Goals.&lt;br&gt;
Things break. Laptops die. Life happens.&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.amazonaws.com%2Fuploads%2Farticles%2Fms7zyzjgoe26qeqf1til.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%2Fms7zyzjgoe26qeqf1til.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm Building This
&lt;/h2&gt;

&lt;p&gt;Nine months in Netherlands warehouse.&lt;br&gt;
15km daily. Scanning barcodes.&lt;br&gt;
Lost job December 22.&lt;/p&gt;

&lt;p&gt;Started rebuild #4 that night.&lt;br&gt;
Shipped first .exe three weeks later.&lt;/p&gt;

&lt;p&gt;Not talent. Stubbornness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PC_Workman exists because:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MSI Afterburner shows "CPU: 87%" - doesn't explain WHY&lt;/li&gt;
&lt;li&gt;HWMonitor logs data - doesn't help you optimize&lt;/li&gt;
&lt;li&gt;Task Manager is reactive - not proactive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Needed tool that EXPLAINS, not just SHOWS.&lt;br&gt;
Built on 94°C laptop.&lt;br&gt;
Optimized for real-world constraints.&lt;/p&gt;

&lt;p&gt;Microsoft Store = next step in making it accessible.&lt;/p&gt;




&lt;h2&gt;
  
  
  Follow Development
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/HuckleR2003" rel="noopener noreferrer"&gt;GitHub: click!&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/users/HuckleR2003/projects/3/views/1" rel="noopener noreferrer"&gt;Roadmap: click&lt;/a&gt;&lt;br&gt;
&lt;a href="https://x.com/hck_lab" rel="noopener noreferrer"&gt;Twitter: hck_lab&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/marcinfirmuga/" rel="noopener noreferrer"&gt;LinkedIn: here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ko-fi.com/hhlabs" rel="noopener noreferrer"&gt;KO-FI ❤ — Coffe?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's build.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Marcin Firmuga | Warehouse worker -&amp;gt; Indie developer | Building in public&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>javascript</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Just an great steps :)
8 months of unstoppable working. Full build in public.
Income? 0$ but don't care</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Mon, 23 Feb 2026 11:30:26 +0000</pubDate>
      <link>https://forem.com/huckler/just-an-great-steps-8-months-of-unstoppable-working-full-build-in-public-income-0-but-e4n</link>
      <guid>https://forem.com/huckler/just-an-great-steps-8-months-of-unstoppable-working-full-build-in-public-income-0-but-e4n</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/huckler" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3693207%2F6a4682e6-273e-4a98-9ce7-653391a5abcc.png" alt="huckler"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/huckler/pcworkman-168-when-quick-fix-took-3-weeks-data-engine-ai-context-70-performance-2d9l" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;PC_Workman 1.6.8: When "Quick Fix" Took 3 Weeks (Data Engine + AI Context + 70% Performance)&lt;/h2&gt;
      &lt;h3&gt;Marcin Firmuga ・ Feb 22&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#buildinpublic&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>python</category>
      <category>opensource</category>
      <category>buildinpublic</category>
      <category>showdev</category>
    </item>
    <item>
      <title>PC_Workman 1.6.8: When "Quick Fix" Took 3 Weeks (Data Engine + AI Context + 70% Performance)</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Sun, 22 Feb 2026 23:00:36 +0000</pubDate>
      <link>https://forem.com/huckler/pcworkman-168-when-quick-fix-took-3-weeks-data-engine-ai-context-70-performance-2d9l</link>
      <guid>https://forem.com/huckler/pcworkman-168-when-quick-fix-took-3-weeks-data-engine-ai-context-70-performance-2d9l</guid>
      <description>&lt;h1&gt;
  
  
  PC_Workman 1.6.8: When "Quick Fix" Became the Biggest Update Since Alpha
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;How I rebuilt the data engine, added AI context awareness, gained 70% performance, and learned that scope creep isn't always bad&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://linktr.ee/marcin_firmuga" rel="noopener noreferrer"&gt;// Marcin Firmuga&lt;/a&gt; | Solo Developer | HCK_Labs
&lt;/h2&gt;

&lt;p&gt;Version 1.6.8 wasn't supposed to be this big.&lt;/p&gt;

&lt;p&gt;The plan was simple: fix the temporary chart system that couldn't show historical data. Maybe two days of work. Update the changelog. Push to testers. Done.&lt;/p&gt;

&lt;p&gt;Three weeks later, I'd rebuilt the entire data aggregation engine, added context-aware AI that learns your patterns, optimized performance by 70%, fixed two critical bugs, polished the UI, and deleted 500+ lines of dead code.&lt;/p&gt;

&lt;p&gt;This is that story. Technical deep-dive, honest struggles, lessons learned. The works.&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.amazonaws.com%2Fuploads%2Farticles%2Ft4ik0a128b81uf8b4w3l.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%2Ft4ik0a128b81uf8b4w3l.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem That Started Everything
&lt;/h2&gt;

&lt;p&gt;PC_Workman alpha shipped in January. Seven testers across different hardware. Bug reports coming in. Most were small - UI glitches, missing labels, the usual polish stuff.&lt;/p&gt;

&lt;p&gt;Then one tester asked: "Can I see what happened yesterday? Like, what was eating CPU at 3 PM?"&lt;/p&gt;

&lt;p&gt;No. The app couldn't do that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Because I'd built the chart system using temporary in-memory data structures. Great for showing "right now." Terrible for "what about three hours ago."&lt;/p&gt;

&lt;p&gt;The charts were literally fake. Placeholder data that looked good in screenshots but had no historical persistence. Classic MVP shortcut that became a blocker.&lt;/p&gt;

&lt;p&gt;I could've dismissed it. "Alpha feature, coming later." But the request made sense. A system monitor that can't look back in time isn't really monitoring - it's just displaying the present.&lt;/p&gt;

&lt;p&gt;So I decided to fix it. "Two days," I told myself. "Build proper data persistence, hook it to the charts, done."&lt;/p&gt;

&lt;p&gt;I was wrong about the timeline. But right about needing to fix it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building HCK_STATS_ENGINE: The Data Foundation
&lt;/h2&gt;

&lt;p&gt;The core problem: &lt;strong&gt;how do you store months of system telemetry without killing the database?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PC_Workman collects data every second. CPU usage, RAM, GPU, temperatures, processes, everything. That's 86,400 data points per day per metric. Multiply by 10-20 metrics. That's nearly 2 million rows per day if you're naive about it.&lt;/p&gt;

&lt;p&gt;SQLite can handle that, but querying becomes slow. And I was building this on a 2014 laptop that hits 94°C under load. Can't afford bloat.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Aggregation Pipeline
&lt;/h3&gt;

&lt;p&gt;The solution: &lt;strong&gt;in-memory accumulation + tiered aggregation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's how it works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 1: In-Memory Accumulator&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Structure: {(hour_timestamp, process_name): {metrics}}
&lt;/span&gt;&lt;span class="n"&gt;accumulator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1738368000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chrome.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cpu_sum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;245.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# Total CPU seconds
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cpu_max&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;45.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;# Peak usage
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ram_sum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;# Total RAM bytes
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;count&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;# Sample count
&lt;/span&gt;        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;active_secs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3543&lt;/span&gt;    &lt;span class="c1"&gt;# Seconds active
&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;&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%2Fjlap8iwxujc1kp6qxrza.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%2Fjlap8iwxujc1kp6qxrza.png" alt=" " width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every second, &lt;code&gt;accumulate_second()&lt;/code&gt; updates the dict. Lightweight. Just dict operations. No I/O.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Level 2: Hourly Flush&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;flush_hourly_processes&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# At hour boundary (00:00, 01:00, etc.)
&lt;/span&gt;    &lt;span class="c1"&gt;# Write accumulator → process_hourly_stats table
&lt;/span&gt;    &lt;span class="c1"&gt;# Clear accumulator
&lt;/span&gt;    &lt;span class="c1"&gt;# If crash mid-write → transaction rollback, data safe
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Level 3: Daily Aggregation&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;aggregate_daily_processes&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# At day boundary (midnight)
&lt;/span&gt;    &lt;span class="c1"&gt;# Sum hourly stats → process_daily_stats
&lt;/span&gt;    &lt;span class="c1"&gt;# Keep hourly data for 7 days
&lt;/span&gt;    &lt;span class="c1"&gt;# Keep daily data forever (or until disk full)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: &lt;strong&gt;Real historical data. Queryable. Fast. Safe.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stability First
&lt;/h3&gt;

&lt;p&gt;The engine runs on the scheduler thread. Separate from UI. Every operation wrapped in try/except. If SQLite fails (disk full, permission issue, cosmic ray), the app doesn't crash. It falls back to CSV logging like before.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stats engine failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;fallback_to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# App still works
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this matters:&lt;/strong&gt; System monitoring tools can't afford to crash. If your monitoring crashes, you're blind. So we built defense in depth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WAL mode (write-ahead logging) - concurrent reads/writes&lt;/li&gt;
&lt;li&gt;Atomic transactions (crash-safe)&lt;/li&gt;
&lt;li&gt;Graceful degradation (SQLite fail → CSV works)&lt;/li&gt;
&lt;li&gt;No new dependencies (sqlite3 is Python stdlib)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Files added:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hck_stats_engine/constants.py&lt;/code&gt; - config, table schemas&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hck_stats_engine/db_manager.py&lt;/code&gt; - connection pooling, migrations&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hck_stats_engine/aggregator.py&lt;/code&gt; - core aggregation logic&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hck_stats_engine/process_aggregator.py&lt;/code&gt; - process-specific stats&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hck_stats_engine/query_api.py&lt;/code&gt; - read interface for UI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hck_stats_engine/events.py&lt;/code&gt; - anomaly detection hooks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Six new files. ~1,200 lines of code. But now the charts show real data going back weeks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Making AI Actually Intelligent
&lt;/h2&gt;

&lt;p&gt;While building the data engine, I kept opening hck_GPT (the AI assistant panel) for testing. Every time, it greeted me the same way:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Hello! I'm hck_GPT, your PC companion. How can I help?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Static. Boring. Useless.&lt;/p&gt;

&lt;p&gt;I'd just implemented a system that knows &lt;strong&gt;everything&lt;/strong&gt; about the computer's behavior. CPU spikes. Heavy apps. Gaming sessions. Work patterns. And the AI assistant was ignoring all of it.&lt;/p&gt;

&lt;p&gt;That felt wrong. So I fixed it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context Awareness: InsightsEngine
&lt;/h3&gt;

&lt;p&gt;The breakthrough was realizing: &lt;strong&gt;timing matters more than data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's not enough to know Chrome used 40% CPU. You need to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When? (During work hours? Gaming time?)&lt;/li&gt;
&lt;li&gt;Context? (Is this normal for this time of day?)&lt;/li&gt;
&lt;li&gt;Pattern? (Does this happen every Tuesday at 3 PM?)&lt;/li&gt;
&lt;li&gt;Action? (Should I suggest closing tabs? Or is this expected?)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enter &lt;code&gt;InsightsEngine&lt;/code&gt; - 300 lines of pattern recognition and contextual intelligence.&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.amazonaws.com%2Fuploads%2Farticles%2Fi1oszie8kirz7tu0aczf.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%2Fi1oszie8kirz7tu0aczf.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fqwm0d1j1oqnpay9492ti.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%2Fqwm0d1j1oqnpay9492ti.png" alt=" " width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Time-aware greetings:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_greeting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;hour&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Morning. Coffee loaded? CPU looking good at 8%.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;hour&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Afternoon. RAM at 52%, up from morning. Chrome again?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Evening - check for gaming patterns
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_detect_game_pattern&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Evening. Ready for another round of Battlefield? GPU warmed up.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Evening. System&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s quiet. 12% CPU, 45% RAM.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Real-time spike detection:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_spike&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Get 7-day baseline
&lt;/span&gt;    &lt;span class="n"&gt;baseline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_get_baseline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;baseline&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;  &lt;span class="c1"&gt;# 50% above normal
&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;current_value&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Find cause
&lt;/span&gt;        &lt;span class="n"&gt;heavy_process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_get_top_process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; SPIKE: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;current_value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;% (normal: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;baseline&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%). &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;heavy_process&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is the cause.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Process categorization:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;CATEGORIES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gaming&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;battlefield&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cod&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cyberpunk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;steam&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;browser&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chrome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;firefox&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;edge&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dev_tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vscode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pycharm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;docker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;node&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;categorize_process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;CATEGORIES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;keywords&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Pattern learning (7-day habit tracking):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_teaser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Evening gaming pattern detected
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_is_evening&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_played_game_last_3_days&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;battlefield&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ready for another round of Battlefield? GPU&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s warmed up.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Morning work pattern
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_is_morning&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_opened_vscode_last_5_days&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VS Code from yesterday still open. Pick up where you left off?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  UI Integration
&lt;/h3&gt;

&lt;p&gt;The panel now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opens with context:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Morning: mentions coffee, shows overnight stats&lt;/li&gt;
&lt;li&gt;Afternoon: references morning activity&lt;/li&gt;
&lt;li&gt;Evening: suggests gaming if pattern detected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Dynamic banner:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Normal: "CPU 12% | RAM 45% | All quiet"&lt;/li&gt;
&lt;li&gt;Spike: "CPU 87% SPIKE | Chrome (3.2GB RAM)"&lt;/li&gt;
&lt;li&gt;Gaming: "Battlefield running | GPU 78%"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;New commands:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;stats&lt;/code&gt; - 7-day habit summary&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alerts&lt;/code&gt; - anomaly report (24h)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;insights&lt;/code&gt; - what's notable right now&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;teaser&lt;/code&gt; - proactive suggestion based on patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Color-coded reports&lt;/strong&gt; (directly in chat, no separate window):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU values: red&lt;/li&gt;
&lt;li&gt;GPU values: blue
&lt;/li&gt;
&lt;li&gt;RAM values: yellow&lt;/li&gt;
&lt;li&gt;Category badges: [Gaming] red, [Browser] blue, [Development] green&lt;/li&gt;
&lt;li&gt;Alert status: yellow banner&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Difference
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;User: "What's using CPU?"&lt;br&gt;&lt;br&gt;
hck_GPT: "Chrome is using 42% CPU."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;[Auto-greeting at 7 PM]&lt;/em&gt;&lt;br&gt;&lt;br&gt;
hck_GPT: "Evening. Battlefield pattern detected - last 3 nights, 7-10 PM. GPU ready at 45°C. RAM at 54%, up from afternoon (Chrome still open with 15 tabs)."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;That's intelligence.&lt;/strong&gt; Not just answering questions. Anticipating needs based on learned patterns.&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.amazonaws.com%2Fuploads%2Farticles%2F83ypi45mnfi6dr34pue5.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%2F83ypi45mnfi6dr34pue5.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Performance Crisis Nobody Saw
&lt;/h2&gt;

&lt;p&gt;While testing the new data engine and AI context, I noticed something embarrassing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PC_Workman was using 15-20% CPU.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A system monitoring tool. That monitors CPU usage. Was itself eating 15-20% CPU.&lt;/p&gt;

&lt;p&gt;The irony wasn't lost on me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Finding the Bottlenecks
&lt;/h3&gt;

&lt;p&gt;I profiled the app. The culprits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Main loop cadence: 300ms&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI updated every 0.3 seconds&lt;/li&gt;
&lt;li&gt;200 updates/minute&lt;/li&gt;
&lt;li&gt;Unnecessary for human perception&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solution: 1000ms (1 second)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Still smooth&lt;/li&gt;
&lt;li&gt;70% less overhead&lt;/li&gt;
&lt;li&gt;Nobody notices the difference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Widget destruction hell:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Old way (every 2 seconds):
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top5_panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;winfo_children&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Expensive!
&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top_processes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;create_new_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# More expensive!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Destroying and recreating 5 widgets every 2 seconds = memory fragmentation + CPU waste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution: Widget pooling&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# New way:
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process_widgets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# First time: create 5 reusable widgets
&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process_widgets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;create_widget&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c1"&gt;# Every update: just update text
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process_widgets&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;top_processes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reuse &amp;gt; recreate. Performance improved by orders of magnitude.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Redundant syscalls:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Old way (every update):
&lt;/span&gt;&lt;span class="n"&gt;cpu_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Why call this every second?
&lt;/span&gt;&lt;span class="n"&gt;total_ram&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;  &lt;span class="c1"&gt;# This never changes!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hardware doesn't change at runtime. Cache it once at startup.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# New way:
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HardwareConstants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;CPU_COUNT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Once
&lt;/span&gt;    &lt;span class="n"&gt;TOTAL_RAM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;  &lt;span class="c1"&gt;# Once
&lt;/span&gt;
    &lt;span class="nd"&gt;@classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_cpu_percent_per_core&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CPU_COUNT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Chart rendering nightmare:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The old chart system used &lt;code&gt;PhotoImage&lt;/code&gt; pixel manipulation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Old: ~70,000 iterations per frame
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;should_draw_pixel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Slowwww
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution: Canvas object reuse&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# New: Create objects once
&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chart_lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;red&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num_datapoints&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Update: Just move coordinates
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chart_lines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datapoints&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Fast!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Orders of magnitude faster. Literally.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. UI thread blocking:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Heavy telemetry collection (iterating 200+ processes) was blocking the UI thread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution: Background daemon&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Startup: Launch background thread
&lt;/span&gt;&lt;span class="n"&gt;telemetry_thread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;collect_telemetry_loop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;  &lt;span class="c1"&gt;# Dies with main app
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;telemetry_thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# UI thread: Just read snapshot (non-blocking)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_ui&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;telemetry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_snapshot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Instant
&lt;/span&gt;    &lt;span class="nf"&gt;render_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No more drag lag. No more freezes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Results
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main loop: 300ms&lt;/li&gt;
&lt;li&gt;CPU usage: 15-20%&lt;/li&gt;
&lt;li&gt;Chart updates: laggy&lt;/li&gt;
&lt;li&gt;Widget updates: memory spikes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Main loop: 1000ms (70% reduction)&lt;/li&gt;
&lt;li&gt;CPU usage: 3-5% (75% improvement)&lt;/li&gt;
&lt;li&gt;Chart updates: smooth&lt;/li&gt;
&lt;li&gt;Widget updates: stable memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The lesson:&lt;/strong&gt; Building on a dying 94°C laptop forced optimization thinking. Constraints = innovation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bug Fixes Nobody Sees (But Everyone Benefits From)
&lt;/h2&gt;

&lt;p&gt;Two critical bugs fixed in 1.6.8. Not sexy. But important.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bug A: Data Aggregation Overlap
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; &lt;code&gt;get_summary_stats()&lt;/code&gt; was double-counting data.&lt;/p&gt;

&lt;p&gt;When computing "lifetime uptime," it would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sum daily stats (past days)&lt;/li&gt;
&lt;li&gt;Sum hourly stats (today)&lt;/li&gt;
&lt;li&gt;Sum minute stats (current hour)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But hourly stats &lt;strong&gt;include&lt;/strong&gt; minute stats. And daily stats &lt;strong&gt;include&lt;/strong&gt; hourly stats. Double-counting everywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Lifetime uptime showed 847 hours when real time was 423 hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Multi-tier fallback with overlap prevention:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_summary_stats&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Layer 1: Daily (complete days only)
&lt;/span&gt;    &lt;span class="n"&gt;daily_sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;daily_stats&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# Exclude today
&lt;/span&gt;
    &lt;span class="c1"&gt;# Layer 2: Hourly (today, complete hours only)
&lt;/span&gt;    &lt;span class="n"&gt;hourly_sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hourly_stats&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# Exclude current hour
&lt;/span&gt;
    &lt;span class="c1"&gt;# Layer 3: Minute (current hour, real-time)
&lt;/span&gt;    &lt;span class="n"&gt;minute_sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minute_stats&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# No overlap: daily + hourly + minute = accurate
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;daily_sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;hourly_sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;minute_sum&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now lifetime uptime is accurate from the first session.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bug B: System Noise Pollution
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; System processes triggering false alerts.&lt;/p&gt;

&lt;p&gt;"System Idle Process" would show 800% CPU (8 cores * 100% idle). "Memory Compression" would spike to 90% RAM during compaction. "Interrupts" would randomly hit 1000% (kernel threads).&lt;/p&gt;

&lt;p&gt;These aren't problems. They're normal system behavior. But InsightsEngine was treating them as anomalies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Strict filtering at multiple layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Layer 1: Telemetry (process_aggregator.py)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;SYSTEM_NOISE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system idle process&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system interrupts&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory compression&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;registry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dwm.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Desktop Window Manager
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_system_noise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;noise&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;process_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
               &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;noise&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SYSTEM_NOISE&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;Layer 2: Insights (InsightsEngine)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_is_system_noise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;process_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Additional filter for user-facing alerts
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;is_system_noise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;

    &lt;span class="c1"&gt;# Cap at 100% per process (prevent overflow display)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;process_cpu&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;process_cpu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process_cpu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Clean telemetry. No false alerts. Accurate health checks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Polish: The Details That Matter
&lt;/h2&gt;

&lt;p&gt;Big features get headlines. Polish gets ignored. But polish is what makes software feel professional vs amateur.&lt;/p&gt;

&lt;h3&gt;
  
  
  UI Refinements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Info Section redesign:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Height: 50px (compact, not cramped)&lt;/li&gt;
&lt;li&gt;Accent color: #a78bfa (purple, not blue)&lt;/li&gt;
&lt;li&gt;Font: Consolas (mono, technical readability)&lt;/li&gt;
&lt;li&gt;Typewriter animation: 70ms typing, 3-char burst deletion, longer hold time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Consolas?&lt;/strong&gt; Monospaced fonts make numbers align. "CPU: 8%" lines up with "RAM: 64%" visually. Small detail. Huge readability improvement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboard-only updates:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_update_hardware_cards&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_view&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dashboard&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;  &lt;span class="c1"&gt;# Don't update if not visible
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eliminates errors from updating widgets that don't exist. Defensive coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;winfo_exists()&lt;/code&gt; guards everywhere:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_update_widget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;widget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;winfo_exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;  &lt;span class="c1"&gt;# Widget destroyed, skip update
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prevents crashes when closing panels mid-update.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cleanup: Less Is More
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Deleted:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;60 LOC: &lt;code&gt;_animate_button_shimmer()&lt;/code&gt; (CPU overhead, nobody noticed)&lt;/li&gt;
&lt;li&gt;3 modules: file_utils, net_utils, system_info (unused)&lt;/li&gt;
&lt;li&gt;1 component: ExpandableProcessList (replaced by widget pooling)&lt;/li&gt;
&lt;li&gt;settings/ directory (obsolete configs)&lt;/li&gt;
&lt;li&gt;System artifacts: _nul, nul (Windows junk)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why cleanup matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster builds (less to compile)&lt;/li&gt;
&lt;li&gt;Less cognitive overhead (fewer files to track)&lt;/li&gt;
&lt;li&gt;Maintainability (obvious what's actually used)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The philosophy:&lt;/strong&gt; Every line of code is a liability. If it's not pulling weight, delete it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned (The Real Value)
&lt;/h2&gt;

&lt;p&gt;1.6.8 taught me more than any previous update. Here's what stuck:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Scope Creep Can Be Good
&lt;/h3&gt;

&lt;p&gt;Started with: Fix chart data persistence.&lt;/p&gt;

&lt;p&gt;Ended with: New data engine + AI context + 70% performance + bug fixes + polish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Sometimes the "quick fix" reveals deeper problems. Don't fight the scope creep if it's making the product better. Just communicate the timeline honestly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Constraints Force Innovation
&lt;/h3&gt;

&lt;p&gt;Building on a 94°C laptop isn't ideal. But it forced me to optimize obsessively. Widget pooling, background threading, canvas reuse - these weren't optional. They were necessary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Constraints aren't obstacles. They're forcing functions for creativity. Unlimited resources = lazy solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Context &amp;gt; Features
&lt;/h3&gt;

&lt;p&gt;hck_GPT gained intelligence not from more features, but from using existing data contextually. Time-of-day + process patterns + user habits = proactive assistant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Before adding features, ask: "Am I using existing data optimally?" Context multiplies value without adding complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Measure, Then Optimize
&lt;/h3&gt;

&lt;p&gt;I guessed the main loop was slow. Profiling showed widget destruction was the real bottleneck. Guessing = wasted effort. Measuring = targeted fixes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Profile first. Optimize second. Never guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Stability Is a Feature
&lt;/h3&gt;

&lt;p&gt;Try/except everywhere. Graceful degradation. Defensive coding. These aren't "nice to haves." They're the difference between a tool people trust vs one they uninstall after the first crash.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; System monitoring tools can't afford to crash. Build defense in depth.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Real Users = Real Priorities
&lt;/h3&gt;

&lt;p&gt;The "show me yesterday's data" request came from a tester. Not from my roadmap. But it was the right priority.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Ship early. Listen closely. Real feedback &amp;gt; imagined use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Technical Debt Compounds
&lt;/h3&gt;

&lt;p&gt;Temporary charts were a 2-hour shortcut to ship alpha. Fixing them properly took 3 weeks. The 2-hour shortcut cost 21 days later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Pay tech debt early. It only gets more expensive.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;1.6.8 is live for testers now. Two-week stability testing window. Collecting feedback. Handling bug reports (same-day turnaround).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coming in future updates:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;InsightsEngine v2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deeper pattern learning (monthly trends, not just weekly)&lt;/li&gt;
&lt;li&gt;Predictive suggestions ("Battlefield usually crashes after 2h, save your game")&lt;/li&gt;
&lt;li&gt;Anomaly alerts (SMS/email when system spikes while you're away)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cross-platform:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;macOS support (different syscalls, same architecture)&lt;/li&gt;
&lt;li&gt;Linux support (easier than macOS, tbh)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Plugin system:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Community extensions&lt;/li&gt;
&lt;li&gt;Custom metrics (track your own apps)&lt;/li&gt;
&lt;li&gt;Share configs (gaming profile, work profile, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mobile companion:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View stats remotely&lt;/li&gt;
&lt;li&gt;Get alerts on phone&lt;/li&gt;
&lt;li&gt;Start/stop monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;But first:&lt;/strong&gt; Stability. Performance. Polish. The boring work that makes software reliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;PC_Workman is open source. Free forever. MIT license.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;github.com/HuckleR2003/PC_Workman_HCK&lt;/a&gt;&lt;br&gt;
It would be perfect, when you send me star!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt; Alpha available on GitHub Releases + SourceForge&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;System requirements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows 10/11 (macOS/Linux coming)&lt;/li&gt;
&lt;li&gt;Python 3.9+ (if running from source)&lt;/li&gt;
&lt;li&gt;.exe available (no Python needed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verified security:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VirusTotal scanned (70 engines, clean)&lt;/li&gt;
&lt;li&gt;Sigstore signed (cryptographic proof of authenticity)&lt;/li&gt;
&lt;li&gt;CodeQL analyzed (GitHub security scanning)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Want to contribute?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bug reports: GitHub Issues&lt;/li&gt;
&lt;li&gt;Feature requests: GitHub Discussions&lt;/li&gt;
&lt;li&gt;Code: Pull requests welcome&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Follow the build-in-public journey:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitter/X: Updates, screenshots, lessons&lt;/li&gt;
&lt;li&gt;Medium: Long-form technical articles&lt;/li&gt;
&lt;li&gt;Dev.to: Tutorials, deep-dives&lt;/li&gt;
&lt;li&gt;Hashnode: Build-in-public series&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%2Frbgsnzrgugdb0gn8uyhr.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%2Frbgsnzrgugdb0gn8uyhr.png" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Story
&lt;/h2&gt;

&lt;p&gt;1.6.8 wasn't planned. It emerged from fixing one thing, discovering another, and following the thread.&lt;/p&gt;

&lt;p&gt;Started: "Fix charts in 2 days"&lt;/p&gt;

&lt;p&gt;Ended: "Rebuilt data engine, added AI intelligence, gained 70% performance in 3 weeks"&lt;/p&gt;

&lt;p&gt;Was it scope creep? &lt;strong&gt;Yes&lt;/strong&gt;.&lt;br&gt;
Was it worth it? &lt;strong&gt;Absolutely&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is what building in public looks like. Not the polished "I had a vision" narrative. The messy "I found a bug, then another, then realized the whole system needed rethinking" reality.&lt;/p&gt;

&lt;p&gt;PC_Workman is better because I didn't stick to the plan. I followed the problems to their root and fixed them properly.&lt;/p&gt;

&lt;p&gt;Next update might be small. Might be huge. Don't know yet. That's the fun part.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Python 3.9, PyQt5, SQLite (WAL mode), psutil, Threading, Canvas rendering&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development time:&lt;/strong&gt; 3 weeks (estimated 2 days, lol)&lt;br&gt;
&lt;strong&gt;Lines added:&lt;/strong&gt; ~1,500&lt;br&gt;
&lt;strong&gt;Lines deleted:&lt;/strong&gt; ~500&lt;br&gt;
&lt;strong&gt;Laptop temperature during build:&lt;/strong&gt; Still 94°C, still alive&lt;br&gt;
&lt;strong&gt;Coffee consumed:&lt;/strong&gt; Too much&lt;br&gt;
&lt;strong&gt;Lessons learned:&lt;/strong&gt; Infinite&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Building PC_Workman on a dying laptop between warehouse shifts. Documenting everything. Shipping weekly. This is update 1.6.8.&lt;/em&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fnw5arcibkx580xl30oe0.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%2Fnw5arcibkx580xl30oe0.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
About the Author&lt;br&gt;
Marcin Firmuga | Solo Developer | HCK_Labs Founder&lt;/p&gt;

&lt;p&gt;I built PC_Workman from scratch on dying hardware during warehouse shifts in the Netherlands.&lt;/p&gt;

&lt;p&gt;Before this:&lt;/p&gt;

&lt;p&gt;Game translations for Polish communities&lt;br&gt;
IT technician internships (2 months, 2022)&lt;br&gt;
Warehouse operations (Poland, Netherlands, multiple contracts)&lt;br&gt;
Twelve failed projects (all quit at 70–85%)&lt;br&gt;
But this one stuck.&lt;/p&gt;

&lt;p&gt;680+ hours of code. 4 complete UI rebuilds. 16,000 lines deleted. 3 AM sessions. Energy drinks and toast #7.&lt;/p&gt;

&lt;p&gt;And finally: an app I wouldn’t close in 5 seconds.&lt;br&gt;
That’s the difference between building and shipping.&lt;/p&gt;

&lt;p&gt;PC_Workman is the result.&lt;br&gt;
Currently: Searching for first tech role while building in public.&lt;/p&gt;

&lt;p&gt;Warehouse to Developer | Building Despite Everything | HCK_Labs&lt;/p&gt;

&lt;p&gt;If you want to be first person, who support me:&lt;br&gt;
&lt;a href="https://linktr.ee/marcin_firmuga" rel="noopener noreferrer"&gt;IM HERE &amp;lt;3 - CLICK&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fyul800261hqmenuhvb4p.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%2Fyul800261hqmenuhvb4p.png" alt=" " width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>buildinpublic</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How to Sign Your Python .exe With Sigstore (No Certificate Required)</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Sun, 15 Feb 2026 19:48:32 +0000</pubDate>
      <link>https://forem.com/huckler/how-to-sign-your-python-exe-with-sigstore-no-certificate-required-m5l</link>
      <guid>https://forem.com/huckler/how-to-sign-your-python-exe-with-sigstore-no-certificate-required-m5l</guid>
      <description>&lt;h1&gt;
  
  
  How to Sign Your Python .exe With Sigstore (No Certificate Required)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; You built an open-source app. Users download your &lt;code&gt;.exe&lt;/code&gt;. How do they know it's actually from you and hasn't been tampered with?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Traditional solution:&lt;/strong&gt; Buy a code signing certificate. Cost: $200-400/year.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Better solution:&lt;/strong&gt; Sigstore. Free, open source, cryptographically secure.&lt;/p&gt;

&lt;p&gt;This is how I sign every PC_Workman release. Takes 8 minutes to set up, 30 seconds per release.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Someone could:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone your GitHub repo&lt;/li&gt;
&lt;li&gt;Add malware to your code&lt;/li&gt;
&lt;li&gt;Compile a fake &lt;code&gt;.exe&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Distribute it claiming it's yours&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Users have no way to verify authenticity without code signing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sigstore solves this:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Proves the file came from your GitHub account&lt;/li&gt;
&lt;li&gt;✅ Proves it hasn't been modified since signing&lt;/li&gt;
&lt;li&gt;✅ Provides cryptographic proof anyone can verify&lt;/li&gt;
&lt;li&gt;✅ Completely free&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%2Fod222budqkgwhtuh8odl.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%2Fod222budqkgwhtuh8odl.png" alt=" " width="800" height="331"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;Want to Star? &amp;lt;3&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python project compiled to &lt;code&gt;.exe&lt;/code&gt; (PyInstaller, Nuitka, etc.)&lt;/li&gt;
&lt;li&gt;GitHub account&lt;/li&gt;
&lt;li&gt;8 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. No credit card, no certificate purchase, no annual fees.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Install Sigstore
&lt;/h2&gt;

&lt;p&gt;pip install sigstore&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.amazonaws.com%2Fuploads%2Farticles%2Fl57x97g621oiyrwlcfw1.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%2Fl57x97g621oiyrwlcfw1.png" alt=" " width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the entire installation. Sigstore is a Python package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify installation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;sigstore --version&lt;/p&gt;

&lt;p&gt;Expected output: &lt;code&gt;sigstore, version X.X.X&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Generate GitHub Token
&lt;/h2&gt;

&lt;p&gt;Sigstore authenticates via GitHub OAuth, but you need a token first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub → Settings → Developer settings → Personal access tokens → Tokens (classic)&lt;/strong&gt;&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.amazonaws.com%2Fuploads%2Farticles%2Fc7c63resblaonu2peg5y.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%2Fc7c63resblaonu2peg5y.png" alt=" " width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;"Generate new token (classic)"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Required scopes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;read:user&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;user:email&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Token expiration:&lt;/strong&gt; Set to "No expiration" (for ongoing releases)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy the token.&lt;/strong&gt; You'll only see it once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Store it securely:&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Linux/Mac
&lt;/h1&gt;

&lt;p&gt;export GITHUB_TOKEN="your_token_here"&lt;/p&gt;

&lt;h1&gt;
  
  
  Windows (PowerShell)
&lt;/h1&gt;

&lt;p&gt;$env:GITHUB_TOKEN="your_token_here"&lt;/p&gt;

&lt;p&gt;Or save in password manager and paste when needed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Sign Your .exe
&lt;/h2&gt;

&lt;p&gt;Navigate to your release directory:&lt;/p&gt;

&lt;p&gt;cd /path/to/your/releases&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sign the file:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;sigstore sign \&lt;br&gt;
  --bundle sigstore-bundle.json \&lt;br&gt;
  PC_Workman_HCK.exe&lt;/p&gt;

&lt;p&gt;Replace &lt;code&gt;PC_Workman_HCK.exe&lt;/code&gt; with your filename.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sigstore opens browser for GitHub OAuth&lt;/li&gt;
&lt;li&gt;You authorize the app&lt;/li&gt;
&lt;li&gt;Sigstore generates cryptographic signature&lt;/li&gt;
&lt;li&gt;Creates &lt;code&gt;sigstore-bundle.json&lt;/code&gt; (the signature file)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Time:&lt;/strong&gt; ~30 seconds&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PC_Workman_HCK.exe&lt;/code&gt; (unchanged)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sigstore-bundle.json&lt;/code&gt; (signature proof)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Step 4: Upload Both Files to GitHub Release
&lt;/h2&gt;

&lt;p&gt;When creating a GitHub release:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Files to include:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;PC_Workman_HCK.exe&lt;/code&gt; (your executable)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sigstore-bundle.json&lt;/code&gt; (signature)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VERIFICATION.md&lt;/code&gt; (instructions for users - see below)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example release structure:&lt;/strong&gt;&lt;br&gt;
PC_Workman_v1.6.4/&lt;br&gt;
├── PC_Workman_HCK.exe&lt;br&gt;
├── sigstore-bundle.json&lt;br&gt;
├── VERIFICATION.md&lt;br&gt;
└── README.md&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Create Verification Instructions for Users
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;VERIFICATION.md&lt;/code&gt; in your release:&lt;/p&gt;

&lt;h1&gt;
  
  
  Verifying This Release
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Install Sigstore
&lt;/h2&gt;

&lt;p&gt;pip install sigstore&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify Signature
&lt;/h2&gt;

&lt;p&gt;sigstore verify github PC_Workman_HCK.exe \&lt;br&gt;
  --bundle sigstore-bundle.json \&lt;br&gt;
  --cert-identity &lt;a href="https://github.com/YourUsername" rel="noopener noreferrer"&gt;https://github.com/YourUsername&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Expected Output
&lt;/h2&gt;

&lt;p&gt;Signature verified successfully&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Proves
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ File came from @YourUsername GitHub account&lt;/li&gt;
&lt;li&gt;✅ File hasn't been modified since signing&lt;/li&gt;
&lt;li&gt;✅ Signing happened on [date]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Replace &lt;code&gt;YourUsername&lt;/code&gt; with your actual GitHub username.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Verification Works (User Side)
&lt;/h2&gt;

&lt;p&gt;Your users run:&lt;br&gt;
sigstore verify github your-app.exe \&lt;br&gt;
  --bundle sigstore-bundle.json \&lt;br&gt;
  --cert-identity &lt;a href="https://github.com/YourUsername" rel="noopener noreferrer"&gt;https://github.com/YourUsername&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sigstore checks:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Certificate identity:&lt;/strong&gt; Does the signature match the claimed GitHub account?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrity:&lt;/strong&gt; Has the file been modified since signing?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timestamp:&lt;/strong&gt; When was this signed?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Success output:&lt;/strong&gt;&lt;br&gt;
Verified OK: PC_Workman_HCK.exe&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failure output:&lt;/strong&gt;&lt;br&gt;
Verification failed: signature invalid&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No trust required.&lt;/strong&gt; Pure cryptography.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Example: PC_Workman
&lt;/h2&gt;

&lt;p&gt;Every PC_Workman release includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The executable&lt;/strong&gt; (&lt;code&gt;PC_Workman_HCK.exe&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sigstore bundle&lt;/strong&gt; (&lt;code&gt;sigstore-bundle.json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security report&lt;/strong&gt; (VirusTotal scan results)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification guide&lt;/strong&gt; (how to verify)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;My release checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Build executable
&lt;/h1&gt;

&lt;p&gt;pyinstaller main.py&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Sign with Sigstore
&lt;/h1&gt;

&lt;p&gt;sigstore sign --bundle sigstore-bundle.json dist/PC_Workman_HCK.exe&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Scan on VirusTotal
&lt;/h1&gt;

&lt;h1&gt;
  
  
  (manual upload to virustotal.com)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  4. Create GitHub release
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Upload: .exe + bundle + security report
&lt;/h1&gt;

&lt;h1&gt;
  
  
  5. Update documentation
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Link to verification guide
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Time per release:&lt;/strong&gt; 5-10 minutes total.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beyond Basic Signing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Automated Signing in CI/CD
&lt;/h3&gt;

&lt;p&gt;You can integrate Sigstore into GitHub Actions:&lt;br&gt;
name: Release&lt;/p&gt;

&lt;p&gt;on:&lt;br&gt;
  release:&lt;br&gt;
    types: [created]&lt;/p&gt;

&lt;p&gt;jobs:&lt;br&gt;
  sign-release:&lt;br&gt;
    runs-on: ubuntu-latest&lt;br&gt;
    steps:&lt;br&gt;
      - uses: actions/checkout@v3&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  - name: Install Sigstore
    run: pip install sigstore

  - name: Sign executable
    run: |
      sigstore sign \
        --bundle sigstore-bundle.json \
        dist/your-app.exe
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  - name: Upload signed files
    uses: actions/upload-artifact@v3
    with:
      name: signed-release
      path: |
        dist/your-app.exe
        sigstore-bundle.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Every release = automatically signed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding More Trust Signals
&lt;/h2&gt;

&lt;p&gt;Sigstore proves the file came from your GitHub. But how do users know YOU'RE legitimate?&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ORCID iD (Persistent Identity)
&lt;/h3&gt;

&lt;p&gt;Register at &lt;a href="https://orcid.org" rel="noopener noreferrer"&gt;orcid.org&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent digital identity for researchers/developers&lt;/li&gt;
&lt;li&gt;Link to GitHub profile&lt;/li&gt;
&lt;li&gt;Proves you're a real person&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. GitHub Developer Program
&lt;/h3&gt;

&lt;p&gt;Apply at &lt;a href="https://github.com/developer" rel="noopener noreferrer"&gt;github.com/developer&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shows commitment to open source&lt;/li&gt;
&lt;li&gt;Requires public profile + active projects&lt;/li&gt;
&lt;li&gt;Free membership&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. OpenSSF Best Practices Badge
&lt;/h3&gt;

&lt;p&gt;Apply at &lt;a href="https://bestpractices.coreinfrastructure.org" rel="noopener noreferrer"&gt;bestpractices.coreinfrastructure.org&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;60+ security criteria&lt;/li&gt;
&lt;li&gt;Comprehensive security audit&lt;/li&gt;
&lt;li&gt;Industry-recognized badge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Together:&lt;/strong&gt; These create a web of trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Issues &amp;amp; Fixes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "GitHub OAuth failed"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Check your GitHub token has &lt;code&gt;read:user&lt;/code&gt; and &lt;code&gt;user:email&lt;/code&gt; scopes.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Bundle file not found"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Make sure &lt;code&gt;--bundle&lt;/code&gt; filename matches what you upload to releases.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Verification failed: certificate identity mismatch"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; &lt;code&gt;--cert-identity&lt;/code&gt; must match exact GitHub URL. Use &lt;code&gt;https://github.com/YourUsername&lt;/code&gt;, not &lt;code&gt;github.com/YourUsername&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Command not found: sigstore"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Activate the Python environment where you installed Sigstore, or install globally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Actually Did This
&lt;/h2&gt;

&lt;p&gt;I was tired of people asking "how do I know this is safe?"&lt;/p&gt;

&lt;p&gt;Not because they're paranoid. Because they're smart. Running &lt;code&gt;.exe&lt;/code&gt; files from unknown people IS risky.&lt;/p&gt;

&lt;p&gt;Sigstore gives users the option to verify. No blind trust required. Just math.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup time:&lt;/strong&gt; 8 minutes&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Per-release time:&lt;/strong&gt; 30 seconds&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cost:&lt;/strong&gt; $0&lt;br&gt;&lt;br&gt;
&lt;strong&gt;User confidence:&lt;/strong&gt; Significantly improved  &lt;/p&gt;

&lt;p&gt;Worth it.&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.amazonaws.com%2Fuploads%2Farticles%2Fig2vjdfeundumlvteki7.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%2Fig2vjdfeundumlvteki7.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Complete Security Stack
&lt;/h2&gt;

&lt;p&gt;For PC_Workman, I combine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;VirusTotal scanning&lt;/strong&gt; (70 antivirus engines) - Part 1 article
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sigstore signing&lt;/strong&gt; (this article)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeQL analysis&lt;/strong&gt; (GitHub security scanning)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenSSF Best Practices&lt;/strong&gt; (working toward badge) - Part 3 coming soon&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;None of this prevents bugs.&lt;/strong&gt; None of it proves bug-free code.&lt;/p&gt;

&lt;p&gt;But it proves &lt;strong&gt;I'm serious about security and transparency.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Users can verify for themselves. That's what matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;5-minute challenge:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Sigstore: &lt;code&gt;pip install sigstore&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a test file: &lt;code&gt;echo "test" &amp;gt; test.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sign it: &lt;code&gt;sigstore sign --bundle test-bundle.json test.txt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Verify it: &lt;code&gt;sigstore verify github test.txt --bundle test-bundle.json --cert-identity https://github.com/YourUsername&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;You just cryptographically signed your first file.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now apply this to your actual releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Official Sigstore docs:&lt;/strong&gt; &lt;a href="https://docs.sigstore.dev" rel="noopener noreferrer"&gt;docs.sigstore.dev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub integration guide:&lt;/strong&gt; &lt;a href="https://docs.sigstore.dev/cosign/github_actions/" rel="noopener noreferrer"&gt;GitHub + Sigstore&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;PC_Workman releases (examples):&lt;/strong&gt; &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK/releases" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions?&lt;/strong&gt; Drop them below. I'll answer every one.&lt;/p&gt;

&lt;h2&gt;
  
  
  About This Series
&lt;/h2&gt;

&lt;p&gt;This is &lt;strong&gt;Part 2 of 3&lt;/strong&gt; in the PC_Workman Security Series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 1:&lt;/strong&gt; VirusTotal Scanning &amp;amp; CodeQL Analysis &lt;em&gt;(link when published on Dev.to)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 2:&lt;/strong&gt; Sigstore Signing (this article)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 3:&lt;/strong&gt; OpenSSF Best Practices Badge (coming soon)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;I'm Marcin, solo developer building &lt;a href="https://github.com/HuckleR2003/PC_Workman_HCK" rel="noopener noreferrer"&gt;PC_Workman&lt;/a&gt; — an open-source system monitoring tool.&lt;/p&gt;

&lt;p&gt;Built on a dying 2014 laptop during warehouse shifts in the Netherlands. 700+ hours, 4 complete rebuilds, finally shipped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow my build-in-public journey:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/HuckleR2003" rel="noopener noreferrer"&gt;@HuckleR2003&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter: &lt;a href="https://x.com/hck_lab" rel="noopener noreferrer"&gt;https://x.com/hck_lab&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Everything about me: &lt;a href="https://linktr.ee/marcin_firmuga" rel="noopener noreferrer"&gt;https://linktr.ee/marcin_firmuga&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Building in public. Documenting everything. Shipping weekly.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  sigstore #python #security #opensource #buildinpublic
&lt;/h1&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>opensource</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How I built an AI Manual Assistant between warehouse shifts (and why it hallucinated about charcoal)</title>
      <dc:creator>Marcin Firmuga</dc:creator>
      <pubDate>Thu, 05 Feb 2026 12:50:03 +0000</pubDate>
      <link>https://forem.com/huckler/how-i-built-an-ai-manual-assistant-between-warehouse-shifts-and-why-it-hallucinated-about-charcoal-20j7</link>
      <guid>https://forem.com/huckler/how-i-built-an-ai-manual-assistant-between-warehouse-shifts-and-why-it-hallucinated-about-charcoal-20j7</guid>
      <description>&lt;p&gt;Marcin Firmuga - 22 years (Poland)&lt;/p&gt;

&lt;h2&gt;
  
  
  The physical world is still stuck in the 90s.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I spend my days picking orders in a warehouse&lt;/strong&gt;, surrounded by machinery and heavy boxes. But my nights belong to my laptop.&lt;br&gt;
For the past few months, I’ve been obsessed with one question:&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.amazonaws.com%2Fuploads%2Farticles%2Fo2wl5h1910mhp0kkk2gd.jpg" 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%2Fo2wl5h1910mhp0kkk2gd.jpg" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why are we still using 100-page paper manuals in 2026?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I decided to fix this by building GuideAI :)&lt;/p&gt;

&lt;h2&gt;
  
  
  The Concept
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The idea is simple:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a PDF manual.&lt;/li&gt;
&lt;li&gt;AI parses the data into a knowledge base.&lt;/li&gt;
&lt;li&gt;Generate a QR code for the physical device.
*&lt;em&gt;Scan and chat with the machine in plain English or Polish.
*&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The "Charcoal" Incident (Hallucinations are real)
&lt;/h2&gt;

&lt;p&gt;While stress-testing the logic with Llama 3 (via Groq),&lt;br&gt;
I asked the assistant how to fix a modern Beko washing machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The AI confidently told me to "refill the charcoal tray"&lt;/strong&gt; and check for soot buildup. Apparently, my LLM thought I was living in the 19th century.&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%2Fuo01q4hxav348oxar595.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%2Fuo01q4hxav348oxar595.png" alt=" " width="800" height="714"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This taught me a huge lesson:&lt;/strong&gt;&lt;br&gt;
Garbage in, garbage out. Fine-tuning the RAG (Retrieval-Augmented Generation) and switching to more precise models like GPT-4o-mini became my top priority to ensure users don't start putting BBQ briquettes in their laundry rooms.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;As a solo dev, I had to choose a stack that lets me move fast:&lt;br&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: React + Tailwind CSS.&lt;br&gt;
&lt;strong&gt;Backend&lt;/strong&gt;/Auth: &lt;strong&gt;Supabase **&lt;br&gt;
(Recently finished a deep dive into Google OAuth and RLS).&lt;br&gt;
**AI Pipeline&lt;/strong&gt;: Groq (for speed) and OpenAI (for precision).&lt;br&gt;
&lt;strong&gt;Deployment&lt;/strong&gt;: Vercel.&lt;/p&gt;

&lt;p&gt;I've spent over 700 hours on my projects, deleted &amp;gt;20,000 lines of code. It was brutal, but for the first time,&lt;br&gt;
I have a product that actually ships.&lt;br&gt;
&lt;em&gt;(payment is still not configured :) )&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands now
&lt;/h2&gt;

&lt;p&gt;The MVP is live at &lt;br&gt;
&lt;a href="https://guide-ai-gold.vercel.app/#" rel="noopener noreferrer"&gt;https://guide-ai-gold.vercel.app/#&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Full Dashboard: Manage your "fleet" of devices.&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.amazonaws.com%2Fuploads%2Farticles%2Fvh71sagna8d0blz30xyd.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%2Fvh71sagna8d0blz30xyd.png" alt=" " width="800" height="605"&gt;&lt;/a&gt;&lt;br&gt;
Scan Analytics: See how many times people actually scanned your QR.&lt;/p&gt;

&lt;p&gt;GDPR Ready: Just finished the Terms and Privacy pages to make it "official."&lt;/p&gt;

&lt;h2&gt;
  
  
  I need your "Dev" eyes
&lt;/h2&gt;

&lt;p&gt;I’m looking for fellow builders to:&lt;br&gt;
Try to break the AI: Upload a weird manual and see if it still talks about coal.&lt;br&gt;
UX Review: Does the QR-to-Mobile flow feel smooth?&lt;/p&gt;

&lt;p&gt;Roast my stack: Is there a better way to handle the PDF-to-Knowledge-Base pipeline?&lt;/p&gt;

&lt;p&gt;I’m building this in public as HCK_Labs. From the warehouse floor to the cloud—it’s been a wild ride.&lt;/p&gt;

&lt;p&gt;Check it out: GuideAI&lt;/p&gt;

&lt;p&gt;And... If you want to be my first $1 after months of work :)&lt;br&gt;
I'm and my socials is here. THANKS YOU MATE :)&lt;br&gt;
&lt;a href="https://linktr.ee/marcin_firmuga" rel="noopener noreferrer"&gt;https://linktr.ee/marcin_firmuga&lt;/a&gt;&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.amazonaws.com%2Fuploads%2Farticles%2F9lwrso74f3zftwno18e0.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%2F9lwrso74f3zftwno18e0.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About the Author
&lt;/h2&gt;

&lt;p&gt;I’m Marcin Firmuga. Solo developer and founder of HCK_Labs.&lt;/p&gt;

&lt;p&gt;My journey started with PC Workman, an open-source, AI-powered PC resource monitor built entirely from scratch on dying hardware during warehouse shifts in the Netherlands.&lt;br&gt;
It was the first time I gave my code a real home.&lt;/p&gt;

&lt;p&gt;Before this: game translations, PC technician internships, warehouse operations in multiple countries, and countless failed projects. But something changed. I stopped just building; I started shipping.&lt;/p&gt;

&lt;p&gt;After 700+ hours of code on my previous tools, GuideAI is my next big step. It’s the result of the same 3 AM all-nighters, energy drinks, and the refusal to let “good enough” be the end. I’m still the guy from the warehouse, but now I’m making the physical world talk.&lt;/p&gt;

&lt;h1&gt;
  
  
  BuildInPublic #IndieDev #SaaS #AI #HCK_Labs #GuideAI
&lt;/h1&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%2Fhnhzjcya8i35j8v3ue4t.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%2Fhnhzjcya8i35j8v3ue4t.png" alt=" " width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>programming</category>
      <category>react</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
