<?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: Utkarsh Bansal</title>
    <description>The latest articles on DEV Community by Utkarsh Bansal (@utkarsh_bansal_01).</description>
    <link>https://dev.to/utkarsh_bansal_01</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%2F1663345%2Fe0945f29-8f37-4410-bb5b-f13b59b0ec84.png</url>
      <title>DEV Community: Utkarsh Bansal</title>
      <link>https://dev.to/utkarsh_bansal_01</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/utkarsh_bansal_01"/>
    <language>en</language>
    <item>
      <title>What's the most over-engineered AI solution you've seen for a problem a linter already solves?
We added AI to write code. Then AI to review code. Then AI to verify code.
The thing that actually reduced incidents? ESLint.</title>
      <dc:creator>Utkarsh Bansal</dc:creator>
      <pubDate>Wed, 10 Jun 2026 15:54:26 +0000</pubDate>
      <link>https://dev.to/utkarsh_bansal_01/whats-the-most-over-engineered-ai-solution-youve-seen-for-a-problem-a-linter-already-solves-we-1o55</link>
      <guid>https://dev.to/utkarsh_bansal_01/whats-the-most-over-engineered-ai-solution-youve-seen-for-a-problem-a-linter-already-solves-we-1o55</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/utkarsh_bansal_01/you-dont-need-another-agent-you-need-a-linter-1b9i" class="crayons-story__hidden-navigation-link"&gt;You Don't Need Another Agent. You Need a Linter.&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="/utkarsh_bansal_01" 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%2F1663345%2Fe0945f29-8f37-4410-bb5b-f13b59b0ec84.png" alt="utkarsh_bansal_01 profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/utkarsh_bansal_01" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Utkarsh Bansal
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Utkarsh Bansal
                
              
              &lt;div id="story-author-preview-content-3865958" 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="/utkarsh_bansal_01" 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%2F1663345%2Fe0945f29-8f37-4410-bb5b-f13b59b0ec84.png" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Utkarsh Bansal&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/utkarsh_bansal_01/you-dont-need-another-agent-you-need-a-linter-1b9i" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 10&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/utkarsh_bansal_01/you-dont-need-another-agent-you-need-a-linter-1b9i" id="article-link-3865958"&gt;
          You Don't Need Another Agent. You Need a Linter.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&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;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&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/utkarsh_bansal_01/you-dont-need-another-agent-you-need-a-linter-1b9i" 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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/utkarsh_bansal_01/you-dont-need-another-agent-you-need-a-linter-1b9i#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;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;
            9 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

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

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>discuss</category>
      <category>javascript</category>
      <category>tooling</category>
    </item>
    <item>
      <title>You Don't Need Another Agent. You Need a Linter.</title>
      <dc:creator>Utkarsh Bansal</dc:creator>
      <pubDate>Wed, 10 Jun 2026 15:49:20 +0000</pubDate>
      <link>https://dev.to/utkarsh_bansal_01/you-dont-need-another-agent-you-need-a-linter-1b9i</link>
      <guid>https://dev.to/utkarsh_bansal_01/you-dont-need-another-agent-you-need-a-linter-1b9i</guid>
      <description>&lt;p&gt;In my last post I complained — a lot — about product managers and how they made my life hell with vibe code. PS: apologies, manager, if you're reading this — but it's true.&lt;/p&gt;

&lt;p&gt;Now, I'm not here just to complain. There were a lot of learning opportunities too, like how to handle legacy / vibe code. Because at the end of the day, both are the same: no one knows how they work, but somehow they keep working. Touching them is like defusing a bomb — you never know how your change might cascade and break the core logic.&lt;/p&gt;

&lt;p&gt;The good news is that vibe code is much simpler than legacy. AI, in all its glory, tries to write perfect-looking code — proper function names, comments, the works — not like legacy code where a single function runs 500 lines, with spaghetti names all over that make no sense and comments that are out of date.&lt;/p&gt;

&lt;p&gt;And that makes it something I can actually handle. I still don't have a perfect, step-by-step playbook — but I've got pieces.&lt;/p&gt;

&lt;p&gt;The first one. The cheapest and the oldest one. The one the industry solved decades ago and the whole "AI built my app in a day" crowd somehow forgot exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A linter.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes, you heard me right. A linter. ESLint.&lt;/p&gt;

&lt;p&gt;Most people who've been in this industry already know it. It's the most boring, reliable tool in the box.&lt;/p&gt;

&lt;p&gt;But in an era where the answer to every problem is "add another AI," it's worth saying out loud why the boring tool still wins.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a linter actually is
&lt;/h2&gt;

&lt;p&gt;If you vibe-coded your way into this world, or you're new to web dev in general and have never heard the word "lint", here's the honest version.&lt;/p&gt;

&lt;p&gt;A linter is a set of rules you add to your repo. It reads your code without running it, checks it against those rules, and flags everything that's broken, sloppy, or about to bite you in production.&lt;/p&gt;

&lt;p&gt;The detail people get wrong: it's not a &lt;code&gt;grep&lt;/code&gt; for bad words.&lt;/p&gt;

&lt;p&gt;A real linter parses your code into a syntax tree and actually reasons about its structure — what's imported, what's called, what's reachable, what types flow where.&lt;/p&gt;

&lt;p&gt;That's why a rule like &lt;code&gt;no-unused-vars&lt;/code&gt; can tell "you imported this and never used it" apart from "you used this without importing it."&lt;/p&gt;

&lt;p&gt;It's also why &lt;code&gt;eslint-plugin-unicorn&lt;/code&gt; can quietly rewrite &lt;code&gt;array.indexOf(x) !== -1&lt;/code&gt; into &lt;code&gt;array.includes(x)&lt;/code&gt; (&lt;code&gt;unicorn/prefer-includes&lt;/code&gt;), or flag a &lt;code&gt;new Array(...)&lt;/code&gt; call that's going to bite you — without ever executing a single line.&lt;/p&gt;

&lt;p&gt;Three properties matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It doesn't run your code.&lt;/strong&gt; No side effects, no flaky network, no "works on my machine."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's deterministic.&lt;/strong&gt; Same code in, same result out, every single time. No temperature, no vibes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It costs nothing.&lt;/strong&gt; No tokens. No API bill. It runs in seconds on a laptop or a CI box.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In 2026, that last one is the whole argument.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more than it used to
&lt;/h2&gt;

&lt;p&gt;We have AI to write code. AI to review code. AI to verify code. Agents stacked on agents, each one quietly spending tokens to do something a free tool already did better.&lt;/p&gt;

&lt;p&gt;And honestly? Most of those agents are re-solving problems that were solved long before "agent" meant what it means today.&lt;/p&gt;

&lt;p&gt;You do not need a language model to notice that you left a debug log in production (&lt;code&gt;no-console&lt;/code&gt;). Or imported a module you never used (&lt;code&gt;unused-imports/no-unused-imports&lt;/code&gt;). Or wrote a function nobody calls (&lt;code&gt;knip&lt;/code&gt;). Or forgot to &lt;code&gt;await&lt;/code&gt; a promise (&lt;code&gt;@typescript-eslint/no-floating-promises&lt;/code&gt;). Or made two files import each other in a circle (&lt;code&gt;import/no-cycle&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;A linter catches every one of those instantly, deterministically, for free — before any AI even wakes up.&lt;/p&gt;

&lt;p&gt;So before you bolt another agent onto your pipeline, ask the boring question: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Does the free, battle-tested tool already do this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Usually it does.&lt;/p&gt;

&lt;p&gt;Use what already exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  A linter is a &lt;strong&gt;Quality Gate&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This is the real reason linters matter. Whether you're a big company or a freelancer just starting out.&lt;/p&gt;

&lt;p&gt;A linter is a quality gate. A line in the sand that says: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This code does not get in unless it clears the bar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Where I work, we wired this straight into the pull-request flow. A check a PR &lt;em&gt;has&lt;/em&gt; to pass before it can merge.&lt;/p&gt;

&lt;p&gt;Not a suggestion. Not "we'll clean it up later." A hard gate on the merge button.&lt;/p&gt;

&lt;p&gt;The result was the kind of number that sounds made up until you live it: production issues and bad merges dropped by roughly 80%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Magic?&lt;/strong&gt; No.&lt;/p&gt;

&lt;p&gt;Most of our incidents were the same boring handful — an unhandled promise that swallowed an error, a stray debug log left in, a circular import that only broke in prod. The gate caught every one of them at the door — we just stopped letting broken code through.&lt;/p&gt;

&lt;p&gt;That's the whole trick. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A gate doesn't make anyone smarter. It just raises the floor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A tip if you're at a big company: when you introduce the ESLint check, you'll hear a lot of pushback from devs — especially at a startup or midsize company. So be ready for a fight, and roll it out gradually: a warning gate first, then an error gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  It doesn't stop at "missing semicolon"
&lt;/h2&gt;

&lt;p&gt;Here's the common misconception people hit when they first add ESLint and see all those errors: "this thing is bad, it just nags me like my annoying brother." That's a huge underestimation.&lt;/p&gt;

&lt;p&gt;Once you treat the linter as a real gate instead of a nag, you can teach it your specific mistakes. And it never forgets them.&lt;/p&gt;

&lt;p&gt;Every painful bug in an AI-assisted codebase is also a &lt;em&gt;pattern&lt;/em&gt;. And patterns are exactly what static analysis is good at.&lt;/p&gt;

&lt;p&gt;A surprising amount of this is one config file away. Modern ESLint flat config plus a few community plugins covers most of it:&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="c1"&gt;// eslint.config.js — a starter "quality gate", not a missing-semicolon nag&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;unusedImports&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eslint-plugin-unused-imports&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;importPlugin&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eslint-plugin-import&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;unicorn&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eslint-plugin-unicorn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unused-imports&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unusedImports&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;import&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;importPlugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unicorn&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;languageOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// type-aware rules need the TS program, not just the syntax tree&lt;/span&gt;
      &lt;span class="na"&gt;parserOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;projectService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// ~100 perf + hidden-bug rules in one line; downgrade the churny ones&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;unicorn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;flat/recommended&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unicorn/filename-case&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Vue files are PascalCase by convention&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unicorn/prevent-abbreviations&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;off&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// trips on `ref`, `props`, store names&lt;/span&gt;
      &lt;span class="c1"&gt;// dead code the model left behind — auto-fixable&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unused-imports/no-unused-imports&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unused-imports/no-unused-vars&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;warn&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// the silent killer (see the circular-deps post) — crank maxDepth up&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;import/no-cycle&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;maxDepth&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="na"&gt;ignoreExternal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="c1"&gt;// dropped awaits that swallow errors — needs the type info above&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@typescript-eslint/no-floating-promises&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@typescript-eslint/no-misused-promises&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="c1"&gt;// dynamic code execution: off by default in eslint:recommended, turn them on&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-eval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-implied-eval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-new-func&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;no-script-url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="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;That's the floor.&lt;/p&gt;

&lt;p&gt;On top of it, every time something hurt us, we added a rule so it could only hurt us once. Three of them earned their place the hard way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Circular dependencies&lt;/strong&gt; — &lt;code&gt;import/no-cycle&lt;/code&gt; with &lt;code&gt;maxDepth: 10&lt;/code&gt; (the default of &lt;code&gt;1&lt;/code&gt; only sees direct A↔B cycles), backed by &lt;code&gt;dependency-cruiser&lt;/code&gt; for the whole-graph view. AI refactors &lt;em&gt;love&lt;/em&gt; making two modules import each other until the build breaks only in prod. It's the single most common AI-induced bug I've seen — enough that it deserves a post of its own.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dropped awaits&lt;/strong&gt; — &lt;code&gt;@typescript-eslint/no-floating-promises&lt;/code&gt; and &lt;code&gt;no-misused-promises&lt;/code&gt;. A missing &lt;code&gt;await&lt;/code&gt; on a file or network call silently swallows the error, and you find out when a user does. Needs &lt;em&gt;type-aware&lt;/em&gt; linting (&lt;code&gt;parserOptions.projectService&lt;/code&gt;) — the one setup cost worth paying.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The free-wins pack&lt;/strong&gt; — &lt;code&gt;eslint-plugin-unicorn&lt;/code&gt;'s &lt;code&gt;flat/recommended&lt;/code&gt;: ~100 rules for one import. A mix of performance wins (&lt;code&gt;prefer-includes&lt;/code&gt;, &lt;code&gt;prefer-set-has&lt;/code&gt;), real hidden-bug catches (&lt;code&gt;no-array-push-push&lt;/code&gt;, &lt;code&gt;no-thenable&lt;/code&gt;), and some opinionated style. Turn off the churn (&lt;code&gt;unicorn/filename-case&lt;/code&gt;, &lt;code&gt;unicorn/prevent-abbreviations&lt;/code&gt;, &lt;code&gt;unicorn/no-null&lt;/code&gt;) and keep the rest. Best caught-mistakes-to-config ratio you'll find.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest are quieter, but each one caught something once. Skim them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dead code&lt;/strong&gt; — &lt;code&gt;eslint-plugin-unused-imports&lt;/code&gt; sweeps the imports the model added for an approach it then abandoned (auto-fixed on &lt;code&gt;--fix&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No &lt;code&gt;eval&lt;/code&gt;&lt;/strong&gt; — &lt;code&gt;no-eval&lt;/code&gt;, &lt;code&gt;no-implied-eval&lt;/code&gt;, &lt;code&gt;no-new-func&lt;/code&gt;, &lt;code&gt;no-script-url&lt;/code&gt;. Off by default; zero legit uses, infinite ways for generated code to sneak one in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;XSS sinks&lt;/strong&gt; — &lt;code&gt;vue/no-v-html&lt;/code&gt; / &lt;code&gt;react/no-danger&lt;/code&gt;, plus &lt;code&gt;eslint-plugin-no-unsanitized&lt;/code&gt; for raw &lt;code&gt;innerHTML&lt;/code&gt;. Any HTML injection has to pass through a sanitizer, enforced at lint time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardcoded strings&lt;/strong&gt; — &lt;code&gt;eslint-plugin-i18next&lt;/code&gt;, so the day you add a language nothing's baked into the markup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test hygiene&lt;/strong&gt; — &lt;code&gt;no-focused-tests&lt;/code&gt; as an &lt;strong&gt;error&lt;/strong&gt;, so a stray &lt;code&gt;it.only&lt;/code&gt; can't silently shrink the CI suite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leaked secrets&lt;/strong&gt; — &lt;code&gt;eslint-plugin-no-secrets&lt;/code&gt; flags high-entropy literals that look like committed tokens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design drift&lt;/strong&gt; (custom) — a ~40-line AST script that fails the build when a raw hex/size/shadow shows up where a named token should be.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layer boundaries&lt;/strong&gt; — &lt;code&gt;eslint-plugin-boundaries&lt;/code&gt; to stop one layer importing another, plus a custom rule forcing risky mutations through a single function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these is a lesson we only had to learn once.&lt;/p&gt;

&lt;p&gt;After that, the linter remembers it for us. Forever, for free, on every commit, for every contributor — human or AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trick that keeps the gate from being annoying
&lt;/h2&gt;

&lt;p&gt;Most people give up on linting for one reason. They turn on every rule at &lt;code&gt;error&lt;/code&gt; on day one, drown in ten thousand warnings, and rage-quit.&lt;/p&gt;

&lt;p&gt;Don't do that.&lt;/p&gt;

&lt;p&gt;Run new rules &lt;strong&gt;warn-first&lt;/strong&gt;. Let them report without blocking. Get the count to zero on your own schedule. &lt;em&gt;Then&lt;/em&gt; ratchet that rule up to &lt;code&gt;error&lt;/code&gt; so it can never regress.&lt;/p&gt;

&lt;p&gt;Here's the reframe that matters: those warnings aren't a to-do list you owe the linter today. They're a map of where the mines are buried. You freeze the count, stop anyone from planting new ones, and clear the field at your own pace.&lt;/p&gt;

&lt;p&gt;For the handful of legacy offenders you can't fix today, keep an explicit allowlist. And treat adding to that allowlist as the thing you're not allowed to do.&lt;/p&gt;

&lt;p&gt;The list only ever shrinks.&lt;/p&gt;

&lt;p&gt;That's how a gate stays strict without crying wolf — and how you tame inherited code without it blowing up in your face.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A linter only sees what's static.&lt;/strong&gt; Dynamic imports, string-built code, and values resolved at runtime are invisible to it. Know the blind spots. A green lint is not "provably correct."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;--fix&lt;/code&gt; is not free thinking.&lt;/strong&gt; Auto-fix is great for unused imports and formatting. It is not great at deciding whether a flagged thing was a real mistake. Read the diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gate on the trend, not the absolute count.&lt;/strong&gt; Failing CI because the repo has &lt;em&gt;any&lt;/em&gt; warnings is untenable in a vibe-coded codebase. Fail when the count grows past the baseline. That's actionable. "Be perfect" isn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A rule you suppress everywhere is a rule you deleted.&lt;/strong&gt; If every other line has a disable comment, you didn't pass the gate — you removed it. Fix the code or kill the rule honestly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The mild jab
&lt;/h2&gt;

&lt;p&gt;Here's the irony I can already see coming. You've read this whole piece on why bolting AI onto already-solved problems is wasteful — and your very next move is to open a chat window and type &lt;em&gt;"add ESLint and all the plugins to my repo."&lt;/em&gt; Or worse: &lt;em&gt;"build me a code-review agent that flags unused imports and circular deps."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Stop.&lt;/p&gt;

&lt;p&gt;Both are the wrong move. The first one drops you into a rabbit hole of 1000+ errors you'll be digging out of forever. Start with the base recommendation, then slowly work toward the rest.&lt;/p&gt;

&lt;p&gt;As for the code-review agent — I'll pretend I didn't hear that. We just spent this whole article on why a linter beats an AI reviewer here. So why are you still reaching for it? Look, if you hate your tokens that much — if you're really itching to spend them on a problem a free, decades-old tool already solves &lt;em&gt;deterministically&lt;/em&gt; — just send them my way. I'll put them to better use.&lt;/p&gt;

&lt;p&gt;AI is genuinely good at the fuzzy stuff — turning an idea into reality, that dopamine hit of making something from nothing. Let it do that. Leave the heavy judgement of code quality to linter.&lt;/p&gt;

&lt;p&gt;And let me be honest about the other side: a linter won't fix your architecture, won't catch a wrong business rule, won't tell you the feature was a bad idea. That part is still on you. What it &lt;em&gt;will&lt;/em&gt; do is take the boring, mechanical, never-ending category of mistakes off your plate — so your brain is free for the part that actually needs one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;A linter is the cheapest reviewer on your team. Free, deterministic, tireless, and completely unimpressed by hype.&lt;/p&gt;

&lt;p&gt;Make it a hard gate on merge, and you raise the floor for everyone at once.&lt;/p&gt;

&lt;p&gt;Then teach it your own recurring mistakes — token drift, hardcoded strings, circular deps, unsafe HTML, dropped awaits — one custom rule per bug class, warn-first then ratcheted to error.&lt;/p&gt;

&lt;p&gt;Add the linter first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Then&lt;/em&gt;, if you still want an agent, at least it's reviewing code that already cleared the bar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cheapest reviewer you'll ever hire has been sitting in your repo the whole time.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Frontend Is Not That Simple</title>
      <dc:creator>Utkarsh Bansal</dc:creator>
      <pubDate>Thu, 21 May 2026 19:15:01 +0000</pubDate>
      <link>https://dev.to/utkarsh_bansal_01/frontend-is-not-that-simple-199n</link>
      <guid>https://dev.to/utkarsh_bansal_01/frontend-is-not-that-simple-199n</guid>
      <description>&lt;p&gt;I guess most of you already have a pretty basic idea of what this post is about — Frontend Engineering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why frontend?&lt;/strong&gt;&lt;br&gt;
“We have AI now. It can create a website in a day. Why do you even care about frontend anymore? Post something about AI blah blah blah…”&lt;/p&gt;

&lt;p&gt;I hear you.&lt;/p&gt;

&lt;p&gt;But the real question is: &lt;strong&gt;Do you actually understand frontend?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every day, I see product managers and designers trying their hands at AI — creating MVPs in a day and celebrating like, “We don’t need engineers anymore. We can do everything ourselves now.”&lt;/p&gt;

&lt;p&gt;And honestly? That part is impressive.&lt;/p&gt;

&lt;p&gt;But then that same code gets handed over to engineers for optimization, scalability, maintainability, performance, accessibility, security, deployment, and production readiness.&lt;/p&gt;

&lt;p&gt;And that’s where my nightmare begins.&lt;/p&gt;

&lt;p&gt;AI generates code based on patterns and existing code available online. It doesn’t magically create great architecture, scalability, performance, accessibility, or production-grade systems out of thin air.&lt;/p&gt;

&lt;p&gt;The bigger problem starts when people continuously edit AI-generated code using more AI prompts without understanding the underlying structure.&lt;/p&gt;

&lt;p&gt;At first, it works.&lt;/p&gt;

&lt;p&gt;Then slowly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functions start leaking across modules&lt;/li&gt;
&lt;li&gt;components become tightly coupled&lt;/li&gt;
&lt;li&gt;business logic spreads everywhere&lt;/li&gt;
&lt;li&gt;state management becomes unpredictable&lt;/li&gt;
&lt;li&gt;abstractions collapse&lt;/li&gt;
&lt;li&gt;duplication increases&lt;/li&gt;
&lt;li&gt;and eventually the entire codebase turns into spaghetti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A tangled mess held together by vibes, Stack Overflow answers, and “it works on my machine.”&lt;/p&gt;

&lt;p&gt;Then comes the question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;“Why hasn’t the app that was created in a day scaled and deployed yet?”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So for the sake of my sanity, let me take you on a small journey into what real frontend engineering actually looks like.&lt;/p&gt;

&lt;p&gt;And do note — this is just the tip of the iceberg. Once you go deeper, it becomes an abyss.&lt;/p&gt;




&lt;h3&gt;
  
  
  Frontend Engineering
&lt;/h3&gt;

&lt;p&gt;As per product teams:&lt;br&gt;
&lt;em&gt;“Someone who creates beautiful websites using the design team’s instructions.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As per textbooks:&lt;br&gt;
&lt;em&gt;“HTML, CSS, and JavaScript.”&lt;/em&gt;&lt;br&gt;
HTML is the skeleton, CSS is the skin, and JavaScript is the brain.&lt;/p&gt;

&lt;p&gt;As per me?&lt;br&gt;
It’s much more than that.&lt;/p&gt;




&lt;p&gt;Frontend Engineering&lt;br&gt;
├── &lt;strong&gt;UI Development&lt;/strong&gt; — What everyone sees&lt;br&gt;
├── &lt;strong&gt;State Management&lt;/strong&gt; — What no one sees until it breaks&lt;br&gt;
├── &lt;strong&gt;Routing&lt;/strong&gt; — Mostly ignored, but critical unless you enjoy navigation nightmares&lt;br&gt;
├── &lt;strong&gt;Design Systems&lt;/strong&gt; — Design tokens keep the UI consistent&lt;br&gt;
├── &lt;strong&gt;API/Data Layer&lt;/strong&gt; — Most production issues start here&lt;br&gt;
├── &lt;strong&gt;Authentication&lt;/strong&gt; — One of the biggest production concerns&lt;br&gt;
├── &lt;strong&gt;Performance&lt;/strong&gt; — In production, every millisecond matters&lt;br&gt;
├── &lt;strong&gt;Accessibility&lt;/strong&gt; — Most developers ignore this until they shouldn’t&lt;br&gt;
├── &lt;strong&gt;SEO&lt;/strong&gt; — Decides whether people even discover your product&lt;br&gt;
├── &lt;strong&gt;Security&lt;/strong&gt; — Skip this and enjoy your legal/security nightmare&lt;br&gt;
├── &lt;strong&gt;Build Tooling&lt;/strong&gt; — A massive game changer if you truly understand it&lt;br&gt;
├── &lt;strong&gt;Testing&lt;/strong&gt; — Protects both your product and your sleep&lt;br&gt;
├── &lt;strong&gt;Monitoring&lt;/strong&gt; — Users will always find bugs in ways you never expected&lt;br&gt;
├── &lt;strong&gt;Analytics&lt;/strong&gt; — So you can actually measure improvements instead of guessing&lt;br&gt;
├── &lt;strong&gt;Deployment&lt;/strong&gt; — Because shipping localhost to customers isn’t a strategy&lt;br&gt;
├── &lt;strong&gt;CI/CD&lt;/strong&gt; — Automating releases so deployments don’t become rituals&lt;br&gt;
├── &lt;strong&gt;Internationalization&lt;/strong&gt; — Your app eventually speaks more than one language&lt;br&gt;
├── &lt;strong&gt;Offline/PWA&lt;/strong&gt; — Because internet connections aren’t always reliable&lt;br&gt;
├── &lt;strong&gt;Realtime Systems&lt;/strong&gt; — Notifications, chats, collaboration, live updates&lt;br&gt;
├── &lt;strong&gt;Architecture&lt;/strong&gt; — The difference between scaling smoothly and suffering later&lt;br&gt;
└── &lt;strong&gt;Developer Experience&lt;/strong&gt; — Better DX = faster teams and fewer headaches&lt;/p&gt;




&lt;p&gt;Now some people will say:&lt;br&gt;
&lt;em&gt;“Come on, this is an over-the-top explanation.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And honestly?&lt;br&gt;
They’re not completely wrong.&lt;/p&gt;

&lt;p&gt;But it’s also true that all of these areas fall under frontend engineering in modern production systems.&lt;/p&gt;

&lt;p&gt;Now the next question is:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Do we really need all of this?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most of the time? Probably not.&lt;/p&gt;

&lt;p&gt;Modern frameworks already provide many things out of the box.&lt;br&gt;
For example, when you create a Vue project today, you already get tools like Vite, package managers like npm/pnpm/yarn, routing setups, build pipelines, and much more.&lt;/p&gt;

&lt;p&gt;But if you want to build something truly great — something scalable, performant, maintainable, and production-ready — eventually you’ll have to understand these layers.&lt;/p&gt;

&lt;p&gt;That’s where frontend engineering actually begins.&lt;/p&gt;




&lt;p&gt;And if you’re wondering what the “abyss” looks like…&lt;/p&gt;

&lt;p&gt;It looks something like this:&lt;/p&gt;

&lt;p&gt;Frontend Engineering&lt;br&gt;
├── Rendering Strategies (CSR, SSR, SSG, ISR, Streaming)&lt;br&gt;
├── Hydration &amp;amp; Partial Hydration&lt;br&gt;
├── Reactivity Systems &amp;amp; Virtual DOM internals&lt;br&gt;
├── Compiler Architecture&lt;br&gt;
├── Browser Rendering Pipeline&lt;br&gt;
├── GPU Acceleration &amp;amp; Paint Optimization&lt;br&gt;
├── Edge Computing&lt;br&gt;
├── Caching Layers&lt;br&gt;
├── WebSockets &amp;amp; CRDTs&lt;br&gt;
├── Distributed State Synchronization&lt;br&gt;
├── Micro Frontends&lt;br&gt;
├── Monorepo Architecture&lt;br&gt;
├── Design Token Pipelines&lt;br&gt;
├── Runtime Performance Profiling&lt;br&gt;
├── Web Security Hardening&lt;br&gt;
├── Memory Leak Debugging&lt;br&gt;
├── Service Workers&lt;br&gt;
├── Rendering at Scale&lt;br&gt;
├── Bundle Optimization&lt;br&gt;
├── Build System Internals&lt;br&gt;
├── Accessibility Compliance&lt;br&gt;
├── Observability Engineering&lt;br&gt;
├── Frontend Infrastructure&lt;br&gt;
├── Server Components&lt;br&gt;
├── WASM Integration&lt;br&gt;
├── Compiler Toolchains&lt;br&gt;
└── Browser Engine Edge Cases&lt;/p&gt;

&lt;p&gt;And somewhere in between all this, you realize:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Frontend engineering was never just about making buttons look pretty.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>frontend</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Article 3 of 100: The PR Crisis: GIT/GitHub Commits Cheat Sheet — A Developer’s Redemption Arc</title>
      <dc:creator>Utkarsh Bansal</dc:creator>
      <pubDate>Sun, 02 Mar 2025 14:39:22 +0000</pubDate>
      <link>https://dev.to/utkarsh_bansal_01/article-3-of-100-the-pr-crisis-gitgithub-commits-cheat-sheet-a-developers-redemption-arc-2d1b</link>
      <guid>https://dev.to/utkarsh_bansal_01/article-3-of-100-the-pr-crisis-gitgithub-commits-cheat-sheet-a-developers-redemption-arc-2d1b</guid>
      <description>&lt;p&gt;Handling Git mistakes is a crucial skill for any developer. Recently, I found myself in a situation where a simple feature branch turned into a mess—too many commits, merge conflicts, and unclear history. Instead of starting over, I took the time to properly fix it.&lt;/p&gt;

&lt;p&gt;Here’s what helped:&lt;br&gt;
✔️ git reset — Undo unnecessary commits&lt;br&gt;
✔️ git cherry-pick — Apply specific changes cleanly&lt;br&gt;
✔️ git reflog — Recover lost commits&lt;br&gt;
✔️ git stash — Save work without committing&lt;/p&gt;

&lt;p&gt;Learning to manage Git efficiently makes PRs easier to review and keeps repositories clean.&lt;/p&gt;

&lt;p&gt;If you’ve ever struggled with a tangled Git history, this article might help.&lt;/p&gt;

&lt;p&gt;📖 Read more: &lt;a href="https://medium.com/p/19c1f22e29ed" rel="noopener noreferrer"&gt;https://medium.com/p/19c1f22e29ed&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>git</category>
      <category>cheatsheet</category>
      <category>developer</category>
    </item>
    <item>
      <title>Day 3/100: The PR Crisis: GIT/GitHub Commits Cheat Sheet — A Developer’s Redemption Arc Start here: https://medium.com/p/19c1f22e29ed</title>
      <dc:creator>Utkarsh Bansal</dc:creator>
      <pubDate>Sun, 02 Mar 2025 14:35:50 +0000</pubDate>
      <link>https://dev.to/utkarsh_bansal_01/day-3100-the-pr-crisis-gitgithub-commits-cheat-sheet-a-developers-redemption-arc-start-3e4h</link>
      <guid>https://dev.to/utkarsh_bansal_01/day-3100-the-pr-crisis-gitgithub-commits-cheat-sheet-a-developers-redemption-arc-start-3e4h</guid>
      <description></description>
    </item>
    <item>
      <title>Day 2/100: ‘Wait, don’t we already have this function?’ — Publishing Your First NPM Package 📦</title>
      <dc:creator>Utkarsh Bansal</dc:creator>
      <pubDate>Sat, 15 Feb 2025 17:23:41 +0000</pubDate>
      <link>https://dev.to/utkarsh_bansal_1ea593e019/day-2100-wait-dont-we-already-have-this-function-publishing-your-first-npm-package-5dce</link>
      <guid>https://dev.to/utkarsh_bansal_1ea593e019/day-2100-wait-dont-we-already-have-this-function-publishing-your-first-npm-package-5dce</guid>
      <description>&lt;p&gt;Another project, another déjà vu moment.&lt;/p&gt;

&lt;p&gt;I was about to copy-paste a helper function again when it hit me: “Didn’t I just use this in another repo?” Instead of repeating history, I finally did what I should’ve done long ago—packaged it up and published it to NPM.&lt;/p&gt;

&lt;p&gt;Publishing an NPM package is easier than you think, and once you do it, you’ll wonder why you didn’t sooner. No more hunting through old repos, just clean, reusable code.&lt;/p&gt;

&lt;p&gt;🛠️ Ready to publish yours? Start here: &lt;a href="https://link.medium.com/h2mfQqqn0Qb" rel="noopener noreferrer"&gt;https://link.medium.com/h2mfQqqn0Qb&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/@utkarshbansal01/wait-dont-we-already-have-this-function-publishing-your-first-npm-package-37ddb6c02f39" class="ltag__link__link" rel="noopener noreferrer"&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%2Fmiro.medium.com%2Fv2%2Fda%3Atrue%2Fresize%3Afill%3A88%3A88%2F0%2AbpnV4_er4ixydXf2" alt="Utkarsh Bansal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/@utkarshbansal01/wait-dont-we-already-have-this-function-publishing-your-first-npm-package-37ddb6c02f39" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;“Wait, don’t we already have this function” — Publishing Your First NPM Package | by Utkarsh Bansal | Feb, 2025 | Medium&lt;/h2&gt;
      &lt;h3&gt;Utkarsh Bansal ・ &lt;time&gt;Feb 15, 2025&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Day 1/100: Exploring Frontend Storage 🖥️</title>
      <dc:creator>Utkarsh Bansal</dc:creator>
      <pubDate>Sat, 15 Feb 2025 17:17:05 +0000</pubDate>
      <link>https://dev.to/utkarsh_bansal_1ea593e019/day-1100-exploring-frontend-storage-2im8</link>
      <guid>https://dev.to/utkarsh_bansal_1ea593e019/day-1100-exploring-frontend-storage-2im8</guid>
      <description>&lt;p&gt;Modern frontend development isn't just about UI—it’s about efficient data management. From cookies to IndexedDB, each storage option plays a crucial role in performance, security, and user experience.&lt;/p&gt;

&lt;p&gt;​This is my first article where I break down key data management, performance optimization, and security best practices — while addressing key security issues and sharing industry insights… ​ &lt;/p&gt;

&lt;p&gt;​📖 Read: &lt;a href="https://lnkd.in/g-A6H87H" rel="noopener noreferrer"&gt;https://lnkd.in/g-A6H87H&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="https://medium.com/@utkarshbansal01/harnessing-frontend-storage-a-comprehensive-guide-to-browser-based-data-management-eaa7cf29d69f" class="ltag__link__link" rel="noopener noreferrer"&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%2Fmiro.medium.com%2Fv2%2Fda%3Atrue%2Fresize%3Afill%3A88%3A88%2F0%2AbpnV4_er4ixydXf2" alt="Utkarsh Bansal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://medium.com/@utkarshbansal01/harnessing-frontend-storage-a-comprehensive-guide-to-browser-based-data-management-eaa7cf29d69f" class="ltag__link__link" rel="noopener noreferrer"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Harnessing Frontend Storage: A Comprehensive Guide to Browser-Based Data Management | by Utkarsh Bansal | Feb, 2025 | Medium&lt;/h2&gt;
      &lt;h3&gt;Utkarsh Bansal ・ &lt;time&gt;Feb 14, 2025&lt;/time&gt; ・ 
      &lt;div class="ltag__link__servicename"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fmedium-f709f79cf29704f9f4c2a83f950b2964e95007a3e311b77f686915c71574fef2.svg" alt="Medium Logo"&gt;
        Medium
      &lt;/div&gt;
    &lt;/h3&gt;
&lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
