<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rashad Husanli</title>
    <description>The latest articles on DEV Community by Rashad Husanli (@modoldern).</description>
    <link>https://dev.to/modoldern</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%2F3929305%2Fa76fd4bf-4371-4019-8070-5d1d636d1573.png</url>
      <title>DEV Community: Rashad Husanli</title>
      <link>https://dev.to/modoldern</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/modoldern"/>
    <language>en</language>
    <item>
      <title>Cleaning Up "Dirty" AI-Generated CSS: Why I Built My Own Autonomous Tailwind Linter</title>
      <dc:creator>Rashad Husanli</dc:creator>
      <pubDate>Mon, 18 May 2026 20:17:35 +0000</pubDate>
      <link>https://dev.to/modoldern/cleaning-up-dirty-ai-generated-css-why-i-built-my-own-autonomous-tailwind-linter-2gjm</link>
      <guid>https://dev.to/modoldern/cleaning-up-dirty-ai-generated-css-why-i-built-my-own-autonomous-tailwind-linter-2gjm</guid>
      <description>&lt;p&gt;Recently, to speed up my frontend workflow, I started relying on AI (LLMs) to generate UI components. The code worked, and it looked fine on the screen. But when I looked at the source code, it was an architectural dump.&lt;/p&gt;

&lt;p&gt;The AI kept using hardcoded pixel values like &lt;code&gt;w-[321px]&lt;/code&gt; or &lt;code&gt;text-[14px]&lt;/code&gt;, and randomly hallucinating HEX colors like &lt;code&gt;bg-[#ff0000]&lt;/code&gt; that weren't even in my design system.&lt;/p&gt;

&lt;p&gt;Normally, the solution is simple: go back to the chat and say, &lt;em&gt;"Fix this to match my Tailwind standards."&lt;/em&gt; But doing this for every component meant &lt;strong&gt;burning through my AI quota (and my money)&lt;/strong&gt;. My focus should be on getting the logic to work. "Grunt work" like standardizing pixels shouldn't require thinking, and it shouldn't be delegated to an expensive AI prompt. It should be handled by a local, autonomous tool.&lt;/p&gt;

&lt;p&gt;Existing linters didn't solve these highly specific UI architectural issues out-of-the-box. So, I built my own zero-dependency autonomous gatekeeper: &lt;strong&gt;aura-lint&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the Autonomous Auto-Fix Engine Works (--fix)
&lt;/h3&gt;

&lt;p&gt;Aura-lint doesn't just find errors and yell at you. When you run it with the &lt;code&gt;--fix&lt;/code&gt; flag, it dives into your code and cleans up the mess left by AI (or careless developers).&lt;/p&gt;

&lt;p&gt;For example, to solve the recurring pixel (&lt;code&gt;px&lt;/code&gt;) issue, I wrote a formula based on Tailwind's default 4-point grid system. When the engine sees a value written in &lt;code&gt;px&lt;/code&gt;, it runs this simple but effective math in the background:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;twClass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pxVal&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isInteger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;twClass&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;replacement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;twClass&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;replacement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;twClass&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&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;What does this mean?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the AI write &lt;code&gt;p-[16px]&lt;/code&gt;? Aura-lint divides it by 4, sees it's an integer, and instantly converts it to &lt;code&gt;p-4&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Did the AI invent a weird value like &lt;code&gt;w-[18px]&lt;/code&gt;? It divides 18 by 4 (4.5), rounds it up, and standardizes it to &lt;code&gt;w-5&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures you never have &lt;code&gt;-[px]&lt;/code&gt; spaghetti in your codebase; everything aligns perfectly with standard Tailwind spacing.&lt;/p&gt;

&lt;h3&gt;
  
  
  You Are in Control: auralint.json
&lt;/h3&gt;

&lt;p&gt;When designing Aura-lint, I wanted the setup and management to be incredibly simple. You can control everything with a single &lt;code&gt;auralint.json&lt;/code&gt; file in your project root:&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;"theme_path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"app.css"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hex_to_tailwind_map"&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;"static_rules"&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;"must_not_have"&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;"must_have"&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="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugin_rules"&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="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;Thanks to this file, the tool reads your &lt;code&gt;app.css&lt;/code&gt; and dynamically learns your theme's CSS variables. You can define your color transformations (&lt;code&gt;hex_to_tailwind_map&lt;/code&gt;) and specify classes that must or must not exist in your codebase (&lt;code&gt;static_rules&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Set Your Own Boundaries: The Plugin Architecture
&lt;/h3&gt;

&lt;p&gt;Every project and every team has its own unique standards. That's why I didn't build Aura-lint as a closed black box, but as a fully extensible architecture.&lt;/p&gt;

&lt;p&gt;You can write custom rules specific to your project in your &lt;code&gt;plugins&lt;/code&gt; folder and inject them into the engine via the &lt;code&gt;plugin_rules&lt;/code&gt; array.&lt;/p&gt;

&lt;p&gt;In fact, I believe this is the true spirit of open source. If you write an awesome plugin that solves a common UI problem for your team, please send a Pull Request (PR) to our &lt;code&gt;develop&lt;/code&gt; branch on GitHub. I would be thrilled to merge great solutions so everyone can benefit from them!&lt;/p&gt;

&lt;p&gt;If you want to stop wasting your AI quotas on fixing CSS and start automating your UI architecture, check out Aura-lint on GitHub and drop a star to support the project:&lt;br&gt;
👉 &lt;a href="https://github.com/modoldern/aura-lint" rel="noopener noreferrer"&gt;https://github.com/modoldern/aura-lint&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>css</category>
      <category>tailwindcss</category>
      <category>tooling</category>
    </item>
    <item>
      <title>I Hate Waiting for the Backend: Why I Built My Own Zero-Dependency Mock Server</title>
      <dc:creator>Rashad Husanli</dc:creator>
      <pubDate>Mon, 18 May 2026 19:45:00 +0000</pubDate>
      <link>https://dev.to/modoldern/i-hate-waiting-for-the-backend-why-i-built-my-own-zero-dependency-mock-server-18bk</link>
      <guid>https://dev.to/modoldern/i-hate-waiting-for-the-backend-why-i-built-my-own-zero-dependency-mock-server-18bk</guid>
      <description>&lt;p&gt;It all started with a simple thought experiment while I was building the backend architecture for my project. &lt;/p&gt;

&lt;p&gt;I was working as a solo full-stack developer, but I couldn't help but think: &lt;em&gt;"If I were working with a frontend team right now, they would be sitting idle, waiting for me to finish the APIs."&lt;/em&gt; I started looking for tools that would allow frontend developers to move forward without waiting for the backend. What I wanted was simple: a tool that required no backend coding and didn't exhaust me with complex configuration files. The existing tools were either too bloated or required too much setup boilerplate.&lt;/p&gt;

&lt;p&gt;And that's how the idea for &lt;strong&gt;nullmock&lt;/strong&gt; was born.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why "Zero-Dependency"?
&lt;/h3&gt;

&lt;p&gt;My spiritual mentor in programming, &lt;strong&gt;&lt;a href="https://medium.com/@tayfunerbilen/npm-paketinden-nas%C4%B1l-hacklendim-50154c292a49" rel="noopener noreferrer"&gt;Tayfun Erbilen&lt;/a&gt;&lt;/strong&gt; (the person whose videos taught me how to code), recently suffered an npm supply chain attack. That incident made me seriously reconsider things. Whenever we install a tool, we are secretly downloading hundreds of unknown dependencies behind the scenes. I wanted to minimize the developer paranoia of &lt;em&gt;"Is there something malicious hiding inside the package I'm about to download?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Because of this, I built Nullmock with &lt;strong&gt;absolutely zero external dependencies&lt;/strong&gt;, relying purely on native Node.js power. It is a secure sandbox you can install and run with complete peace of mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Does Nullmock Do?
&lt;/h3&gt;

&lt;p&gt;Instead of writing complex route files, Nullmock uses the &lt;strong&gt;folder-based routing&lt;/strong&gt; logic we all know and love from frameworks like Next.js.&lt;/p&gt;

&lt;p&gt;For example, just create a file named &lt;code&gt;mocks/api/users/[id]/GET.json&lt;/code&gt;. The server instantly recognizes this route. Furthermore, writing static JSON is boring, so I added "magic strings" for smart data generation:&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{uuid}}"&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;"{{firstName:en}} {{lastName:en}}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{{number:18-65}}"&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;When you write this, Nullmock autonomously generates dynamic, localized (i18n supported) data for you on every request. If you want to test network latency on the frontend, simply append &lt;code&gt;?_delay=2000&lt;/code&gt; to your URL, or &lt;code&gt;?_status=500&lt;/code&gt; to simulate server errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Just the Tip of the Iceberg
&lt;/h3&gt;

&lt;p&gt;What I've explained here is just a brief summary of what the engine can do. Nullmock doesn't leave you with a blank slate. When you visit the repository, you'll see that it comes out-of-the-box with &lt;strong&gt;industry-standard architectural examples and ready-to-use boilerplate&lt;/strong&gt; that you can directly integrate into your workflow.&lt;/p&gt;

&lt;p&gt;If you are tired of complex setups, a &lt;code&gt;node_modules&lt;/code&gt; black hole full of security risks, and just want to spin up a dynamic API in seconds, give Nullmock a try.&lt;/p&gt;

&lt;p&gt;You can check out the repo, explore the architecture, and drop a star to support the project here:&lt;br&gt;
👉 &lt;a href="https://github.com/modoldern/nullmock" rel="noopener noreferrer"&gt;https://github.com/modoldern/nullmock&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>showdev</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
