<?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: kirti kaushal</title>
    <description>The latest articles on DEV Community by kirti kaushal (@kirti_kaushal_727a236d681).</description>
    <link>https://dev.to/kirti_kaushal_727a236d681</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3988050%2F978e3aa6-3522-46ce-9ce0-f9c8b4abc8b6.png</url>
      <title>DEV Community: kirti kaushal</title>
      <link>https://dev.to/kirti_kaushal_727a236d681</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kirti_kaushal_727a236d681"/>
    <language>en</language>
    <item>
      <title>I Wrote About Token Waste. Then I Built a Tool That Blocks It Before It Happens</title>
      <dc:creator>kirti kaushal</dc:creator>
      <pubDate>Sun, 12 Jul 2026 04:55:41 +0000</pubDate>
      <link>https://dev.to/kirti_kaushal_727a236d681/i-wrote-about-token-waste-then-i-built-a-tool-that-blocks-it-before-it-happens-45j1</link>
      <guid>https://dev.to/kirti_kaushal_727a236d681/i-wrote-about-token-waste-then-i-built-a-tool-that-blocks-it-before-it-happens-45j1</guid>
      <description>&lt;p&gt;&lt;em&gt;By Kirti Kaushal&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A few months ago I wrote about token optimization for GitHub Copilot and AI coding agents — the usual advice: narrow your scope, exclude generated files, don't send your whole repo for a one-line fix. Good advice. I still believe 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvay6bj55613cc2t13guq.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvay6bj55613cc2t13guq.gif" alt="I Wrote About Token Waste. Then I Built a Tool That Blocks It Before It Happens" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But advice doesn't run automatically. You have to remember it, every time, on every prompt, forever. So I built the thing I actually wanted: something that checks for me, before anything gets sent, without me having to remember.&lt;/p&gt;

&lt;p&gt;This is &lt;code&gt;claude-cost-guard&lt;/code&gt; — a free Claude Code plugin that shows you the token count and cost, across Claude, GPT, and Gemini, &lt;strong&gt;before your prompt ever reaches the model.&lt;/strong&gt; No LLM call to check it. No latency. Nothing sent anywhere unless you explicitly ask for a rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not just ask Claude to check my prompt?
&lt;/h2&gt;

&lt;p&gt;Three reasons this needed to be a separate tool, not a habit of asking nicely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A free check has to actually be free.&lt;/strong&gt; Asking Claude to critique your prompt costs a full round-trip — tokens spent just to find out you'd pasted a duplicate paragraph. A local check costs nothing and takes no time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No single model will tell you a competitor is cheaper.&lt;/strong&gt; Cross-model cost comparison needs a neutral tool, not the model you're currently talking to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A habit you have to remember isn't a habit.&lt;/strong&gt; A tool that fires on every single prompt, automatically, is the only version of this that actually works long-term.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;claude-cost-guard&lt;/code&gt; hooks into Claude Code's &lt;code&gt;UserPromptSubmit&lt;/code&gt; and &lt;code&gt;UserPromptExpansion&lt;/code&gt; events — the same mechanism Claude Code itself uses to let plugins see a prompt before it's processed. On every prompt, slash-command, or skill invocation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token count and cost estimate&lt;/strong&gt; — across six models, computed locally, instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate-paragraph detection&lt;/strong&gt; — catches the classic "pasted the same section twice by accident"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oversized-paste detection&lt;/strong&gt; — flags a 2,000-line log dump when the actual question is one line&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing-format detection&lt;/strong&gt; — flags a "compare X and Y" request with no output format specified, which usually means a second round-trip to get the shape you actually wanted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output-cost awareness&lt;/strong&gt; — scans for explicit length signals ("brief," "comprehensive," "500 words") since output tokens are typically priced several times higher than input, and a flat guess undersells the real cost of a detailed request&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It never blocks. This was a deliberate reversal partway through building it: an earlier version paused for confirmation on every single prompt, which meant every prompt cost a minimum of two submissions just to prove the point. A cost-saving tool that doubles your interactions to save you money is fighting itself. So the default is informational, always-visible, never in your way.&lt;/p&gt;

&lt;p&gt;The one paid action — an optimized rewrite — only runs if you explicitly tag your prompt with &lt;code&gt;#optimize&lt;/code&gt;. Never automatic, never silent spend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What building it in public actually looked like
&lt;/h2&gt;

&lt;p&gt;I want to be honest about this part, because it's the part most launch posts skip: &lt;strong&gt;most of the real bugs weren't found by writing more code — they were found by actually using it.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unit tests passed on every function, in isolation, before this ever touched a real session. Good, but proved nothing about whether Claude Code would actually invoke the hook correctly.&lt;/li&gt;
&lt;li&gt;The first live test found a false positive: &lt;code&gt;claude plugin list&lt;/code&gt;, typed as an ordinary message, tripped the "missing output format" flag because it contains the word "list." Three words shouldn't read as a content request — fixed by requiring a minimum word count before that check fires at all.&lt;/li&gt;
&lt;li&gt;A later session showed &lt;em&gt;no output at all&lt;/em&gt; — the hook had silently failed. Debug logging traced it to a documented Claude Code issue where &lt;code&gt;CLAUDE_PLUGIN_ROOT&lt;/code&gt; isn't always injected into the hook's subprocess environment. Fixed with a &lt;code&gt;$PWD&lt;/code&gt; fallback, verified both with and without the variable set.&lt;/li&gt;
&lt;li&gt;Stress-testing with a 1.6MB, 20,000-line paste (simulating someone dumping a full log file) ran in well under half a second — but surfaced a real UX bug: uncapped duplicate-paragraph flags would list every single repeat, unreadable past a handful. Capped at five, plus a summary count.&lt;/li&gt;
&lt;li&gt;A direct question — "does output length also cost?" — led to reworking the cost estimate to actually respond to what the prompt asks for (brief vs. detailed vs. an explicit word count), instead of a flat guess applied identically to every prompt regardless of content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these were hypothetical edge cases dreamed up in advance. Every one came from actually running the thing against something real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this sits next to other tools
&lt;/h2&gt;

&lt;p&gt;There's real, good work already happening in this space. &lt;code&gt;claude-prompt-improver&lt;/code&gt; and similar plugins rewrite prompts for clarity using an LLM call on every fire — their own documentation is upfront that this costs 30–90 seconds of latency per prompt, which is exactly why they're opt-in by default. &lt;code&gt;codeburn&lt;/code&gt; and &lt;code&gt;Cost Guardian&lt;/code&gt; track running session cost after the fact, which is valuable for visibility but doesn't stop a wasteful prompt before it's sent. &lt;code&gt;Token Guard&lt;/code&gt; audits the token cost of your repo's &lt;code&gt;CLAUDE.md&lt;/code&gt;/&lt;code&gt;.cursorrules&lt;/code&gt; files in CI — a real and useful adjacent problem, just a different one (repo hygiene, not per-prompt cost).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;claude-cost-guard&lt;/code&gt; is specifically: free, instant, per-prompt, cross-model, before it runs. That's a narrow claim on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plugin marketplace add kirti/claude-cost-guard
/plugin install claude-cost-guard
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open source, MIT licensed: &lt;a href="https://github.com/kirti/claude-cost-guard" rel="noopener noreferrer"&gt;github.com/kirti/claude-cost-guard&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find a real bug by actually using it — that's genuinely how every fix in this post got found. Open an issue.&lt;/p&gt;

&lt;p&gt;Our Mission&lt;/p&gt;

&lt;p&gt;Helping people learn, build, grow, and succeed through technology, education, and community.&lt;/p&gt;

&lt;p&gt;“Knowledge becomes more valuable when it is shared.”&lt;/p&gt;

&lt;p&gt;“Learn. Build. Share. Grow.”&lt;/p&gt;

&lt;p&gt;❤️ Your support, likes, shares, and feedback motivate us to keep creating free educational content for everyone.&lt;/p&gt;

&lt;p&gt;Thank you for being part of the journey! 🌱&lt;/p&gt;

&lt;p&gt;Built with love by Kirti Kaushal — 15 years of engineering, finally building in public.&lt;/p&gt;

&lt;p&gt;Kind is Cool 🙏 share your knowledge&lt;br&gt;
Thank You for Reading ❤️&lt;br&gt;
Thank you for spending your time with us and being part of our learning community.&lt;br&gt;
🌟 Kind is Cool 📚 Share Your Knowledge&lt;br&gt;
🚀 Help Others Grow&lt;/p&gt;

&lt;p&gt;If you enjoyed this blog, tutorial, or Instagram post:&lt;/p&gt;

&lt;p&gt;👍 Give it a Like&lt;br&gt;
💬 Leave a Comment&lt;br&gt;
🔄 Share it with someone who might find it helpful&lt;br&gt;
⭐ Follow us for more content on AI, Coding, GitHub, Career Growth, and Continuous Learning&lt;/p&gt;

&lt;p&gt;💻 GitHub: &lt;a href="https://github.com/kirti" rel="noopener noreferrer"&gt;https://github.com/kirti&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agenticai</category>
      <category>claudeplugin</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>What 15 Years of Building Taught Me About Becoming an AI Engineer</title>
      <dc:creator>kirti kaushal</dc:creator>
      <pubDate>Tue, 30 Jun 2026 03:05:08 +0000</pubDate>
      <link>https://dev.to/kirti_kaushal_727a236d681/what-15-years-of-building-taught-me-about-becoming-an-ai-engineer-4pka</link>
      <guid>https://dev.to/kirti_kaushal_727a236d681/what-15-years-of-building-taught-me-about-becoming-an-ai-engineer-4pka</guid>
      <description>&lt;p&gt;&lt;strong&gt;Nobody hands you a title that says "AI Engineer" and a clean starting line.&lt;/strong&gt; &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For most of my 15 years, I was a full-stack and fintech engineer — React on the front, Node.js or python or php or sometimes little Java  on the back, wealth management and banking systems in the middle. AI wasn't a job description yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was a feature you bolted on if the business case justified it.&lt;/p&gt;

&lt;p&gt;That changed gradually, then all at once. I didn't pivot into AI. AI showed up inside the systems I was already building, and the skill that mattered most wasn't a new framework — it was being able to wire a model into something people would actually use, explain, and trust.&lt;/p&gt;

&lt;p&gt;Here's what the work itself taught me, written down so it doesn't disappear into another closed tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The model's output is not the product&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the first things I built was a banking proof-of-concept: a simple linear regression predicted a user's spending for next month, and an LLM turned that number into a sentence a person could act on. Nothing about the math was exotic. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The lesson was that a number on a dashboard doesn't change behavior — a sentence does. &lt;/li&gt;
&lt;li&gt;The regression did the calculating. &lt;/li&gt;
&lt;li&gt;The model that actually mattered was the one translating a prediction into something a human could use.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explainability isn't optional, it's the whole job&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project that taught me the most was a fraud detector built on XGBoost with SHAP explainability. &lt;/p&gt;

&lt;p&gt;Banks don't deploy black boxes, and for good reason — a "92% fraud probability" with no justification is not a usable answer, it's a liability. &lt;/p&gt;

&lt;p&gt;Once I added SHAP attributions and had an LLM translate the feature weights into plain language, the project stopped being a notebook exercise and started looking like something a compliance team could actually sign off on. &lt;/p&gt;

&lt;p&gt;That gap — between a model that scores something and a system that can justify the score — is where most of the real engineering lives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fixing the same mistake five times is a signal, not a nuisance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anyone working with AI coding tools knows the pattern: you correct the same mistake five times before it sticks. &lt;/p&gt;

&lt;p&gt;Eventually I stopped correcting it live and started writing the correction down once, as a reusable skill file the assistant would apply automatically going forward. &lt;/p&gt;

&lt;p&gt;That turned into two npm packages — &lt;code&gt;skillforge-ai&lt;/code&gt; and &lt;code&gt;reactforge-ai-skills&lt;/code&gt; — built specifically to teach AI assistants standards instead of re-explaining them every session. &lt;/p&gt;

&lt;p&gt;It's a small idea, but it scales in a way that live corrections never do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fundamentals didn't change, the substrate did&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Feature engineering became prompt and context engineering. Model validation became evals. &lt;/p&gt;

&lt;p&gt;Explainability was never optional in finance, and it isn't optional for LLM-driven decisions either. &lt;/p&gt;

&lt;p&gt;None of the underlying engineering discipline is new — what's new is how fast the substrate moves under it, which means the engineers who keep their fundamentals tight are the ones who can actually keep up&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The part that doesn't show up in a changelog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I've built most of this while navigating a dependent visa — learning exactly what work I could and couldn't take on — and rebuilding momentum after an injury that could have ended the whole thing. None of that is in a GitHub repo. &lt;/p&gt;

&lt;p&gt;But it's the reason persistence, more than any specific framework, is the actual skill underneath everything above. &lt;/p&gt;

&lt;p&gt;The technical work is the visible part.The discipline to keep showing up for it is the part nobody puts in a release note. If there's one habit worth repeating: don't wait until something is polished to write about it. &lt;/p&gt;

&lt;p&gt;Write down what you built this month, even the broken parts. &lt;/p&gt;

&lt;p&gt;The polish comes later, if it comes at all — the record is what compounds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our Mission&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Helping people learn, build, grow, and succeed through technology, education, and community.&lt;/p&gt;

&lt;p&gt;“Knowledge becomes more valuable when it is shared.”&lt;/p&gt;

&lt;p&gt;“Learn. Build. Share. Grow.”&lt;/p&gt;

&lt;p&gt;❤️ Your support, likes, shares, and feedback motivate us to keep creating free educational content for everyone.&lt;/p&gt;

&lt;p&gt;Thank you for being part of the journey! 🌱&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Built with love by Kirti Kaushal — 15 years of engineering, finally building in public.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kind is Cool 🙏 share your knowledge&lt;br&gt;
Thank You for Reading ❤️&lt;br&gt;
Thank you for spending your time with us and being part of our learning community.&lt;br&gt;
🌟 Kind is Cool 📚 Share Your Knowledge&lt;br&gt;
🚀 Help Others Grow&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you enjoyed this blog, tutorial, or Instagram post:&lt;/p&gt;

&lt;p&gt;👍 Give it a Like&lt;br&gt;
💬 Leave a Comment&lt;br&gt;
🔄 Share it with someone who might find it helpful&lt;br&gt;
⭐ Follow us for more content on AI, Coding, GitHub, Career Growth, and Continuous Learning&lt;/p&gt;

&lt;p&gt;💻 GitHub: &lt;a href="https://github.com/kirti" rel="noopener noreferrer"&gt;https://github.com/kirti&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>fullstack</category>
      <category>machinelearning</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I stopped re-explaining my React rules to Claude every session — here's how</title>
      <dc:creator>kirti kaushal</dc:creator>
      <pubDate>Wed, 17 Jun 2026 00:42:00 +0000</pubDate>
      <link>https://dev.to/kirti_kaushal_727a236d681/i-stopped-re-explaining-my-react-rules-to-claude-every-session-heres-how-3j5d</link>
      <guid>https://dev.to/kirti_kaushal_727a236d681/i-stopped-re-explaining-my-react-rules-to-claude-every-session-heres-how-3j5d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Every AI coding session starts from zero.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It doesn't know your team avoids inline objects in JSX. It doesn't know you need ARIA labels on every button. It doesn't know you're migrating from PropTypes to TypeScript.&lt;br&gt;
So it generates generic code. You fix it. You explain the rules again next session. You fix it again.&lt;br&gt;
I got tired of that loop. So I built reactforge-ai-skills — a toolkit that teaches Claude and Copilot your React standards once, and enforces them automatically.&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%2F8a7h7sjxrrzs8z9g0z5n.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%2F8a7h7sjxrrzs8z9g0z5n.png" alt="" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reactforge-ai-skills&lt;/strong&gt; is a React codebase health toolkit I built and published this week. It gives your AI assistant a set of rules to follow — and gives you a set of scripts to enforce them automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;reactforge-ai-skills &lt;span class="nt"&gt;--save-dev&lt;/span&gt;

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

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Here's exactly what's inside and how to use it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem this solves&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every time you open a new Claude or Copilot session, your AI starts from zero. &lt;/li&gt;
&lt;li&gt;It doesn’t know your team avoids inline objects in JSX. It doesn’t know you need ARIA labels on every button.&lt;/li&gt;
&lt;li&gt;It doesn’t know you’re migrating from PropTypes to TypeScript.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;So it generates generic code. You fix it. You explain the rules again in the next session. You fix it again.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Skill files break that cycle. You load the rules once — your AI follows them every time.&lt;/p&gt;
&lt;h2&gt;
  
  
  What's included
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;9 AI Skill Files&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Each skill file is a detailed markdown document that teaches your AI assistant the correct patterns for a specific area of React development&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;accessibility-audit&lt;/strong&gt; WCAG 2.1 compliance rules, ARIA label requirements, keyboard navigation patterns, screen reader support. Load this and your AI stops generating &lt;/p&gt; and starts generating proper  elements with labels.
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;performance-optimization&lt;/strong&gt; When to use React.memo, useCallback, useMemo. Why inline objects in JSX cause unnecessary re-renders. How to use lazy loading and virtualisation for large lists. Missing key prop patterns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;**typescript-migration **Step-by-step rules for converting JavaScript React components to TypeScript. How to type props, hooks, event handlers, and API responses correctly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;test-coverage&lt;/strong&gt; Jest + React Testing Library patterns. How to mock modules, handle async tests, test error states. Why getByRole beats getByTestId.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;css-style-fixes&lt;/strong&gt; CSS specificity rules, how to structure CSS variables, redundant rule detection, Tailwind migration patterns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;duplicate-code-detection&lt;/strong&gt; Patterns for identifying and refactoring duplicated logic. When to extract a custom hook vs a utility function vs a base component.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;react-node-automation&lt;/strong&gt; Full React and Node.js quality automation patterns — linting, testing, CI configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;dependency-governance&lt;/strong&gt; npm audit workflow, how to handle vulnerability fixes without breaking changes, bundle size analysis.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;*&lt;em&gt;testcafe-automation *&lt;/em&gt; End-to-end testing patterns with TestCafe. Page object model, selector strategies, async handling.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to load a skill into your AI&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Claude Code — add to CLAUDE.md :&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;node_modules/reactforge-ai-skills/skills/accessibility-audit/SKILL.md &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;GitHub Copilot — add to instructions:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;node_modules/reactforge-ai-skills/skills/performance-optimization/SKILL.md &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
 .github/copilot-instructions.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Copy to clipboard and paste into any AI chat:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Mac&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;node_modules/reactforge-ai-skills/skills/typescript-migration/SKILL.md | pbcopy

Then &lt;span class="nb"&gt;paste &lt;/span&gt;into Claude, ChatGPT, or Cursor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Combine multiple skills:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;node_modules/reactforge-ai-skills/skills/accessibility-audit/SKILL.md &lt;span class="se"&gt;\&lt;/span&gt;
    node_modules/reactforge-ai-skills/skills/performance-optimization/SKILL.md &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; CLAUDE.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;19 Automation Scripts&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The scripts scan your actual src/ folder and find real problems.&lt;/li&gt;
&lt;li&gt;No configuration needed — just point them at your source directory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Analysis scripts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Find accessibility violations — missing ARIA labels, alt text, keyboard support&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run a11y:check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Find React performance anti-patterns — missing memo, inline objects, effect deps&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run perf:analyze
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Find duplicate code blocks using hash comparison&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run detect:duplicates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Find import statements that are never used&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run detect:unused-imports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Find CSS classes defined but never referenced&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run detect:unused-css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Full dependency audit — vulnerabilities, outdated packages&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run deps:check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Run ALL checks and save a maintenance report&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run maintain
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Generator scripts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate PropTypes from component usage patterns (preview first)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run generate:proptypes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Convert PropTypes to TypeScript interfaces&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run generate:types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Create Jest + RTL test scaffolds for untested components&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run testcafe:scaffold
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Find components with no test files&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run testcafe:coverage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Fixer scripts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-fix CSS issues — missing units, vendor prefixes, duplicates&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run css:fix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Preview refactoring suggestions — var→const, !!→Boolean()&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run refactor:suggest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Apply refactoring changes&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run refactor:apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Get Tailwind class equivalents for your CSS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run css:convert-tailwind
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;A real example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran npm run a11y:check against my banking POC frontend and it found this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`INPUT NO LABEL [HIGH] src/components/ChatWidget.jsx:179
  Form input missing label or aria-label
  Fix: Add aria-label="Type your message"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MISSING ALT TEXT [MEDIUM] src/components/Hero.jsx:24  
  Image missing alt attribute
  Fix: Add alt="Description of image"`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Two real bugs. One command.&lt;br&gt;
  The component had been in production for weeks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run health checks automatically on every pull request:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;github/workflows/code-health.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Code Health&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;health&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;20'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm ci&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx reactforge-ai-skills check-accessibility ./src&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx reactforge-ai-skills detect-duplicates ./src&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npx reactforge-ai-skills deps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Add to package.json&lt;/strong&gt;&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="err"&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;"scripts"&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;"health"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reactforge-ai-skills audit ./src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"health:a11y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reactforge-ai-skills check-accessibility ./src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"health:perf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reactforge-ai-skills performance ./src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"gen:tests"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reactforge-ai-skills gen-tests ./src --write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"gen:types"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reactforge-ai-skills gen-typescript ./src"&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="err"&gt;`&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Live demo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The demo repo runs all 19 scripts against a real React application so you can see actual output before installing.&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Demo site: https://kirti.github.io/reactforge-demo/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Npm: https://www.npmjs.com/package/reactforge-ai-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub: https://github.com/kirti/reactforge-ai-skills

`npm install reactforge-ai-skills --save-dev`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Built with love by Kirti Kaushal — 15 years of engineering, finally building in public. &lt;br&gt;
Kind is Cool 🙏 share your knowledge&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thank You for Reading ❤️&lt;/p&gt;

&lt;p&gt;Thank you for spending your time with us and being part of our learning community.&lt;/p&gt;

&lt;p&gt;🌟 Kind is Cool 📚 Share Your Knowledge&lt;/p&gt;

&lt;p&gt;🚀 Help Others Grow&lt;/p&gt;

&lt;p&gt;If you enjoyed this blog, tutorial, or Instagram post:&lt;/p&gt;

&lt;p&gt;👍 Give it a Like&lt;br&gt;
💬 Leave a Comment&lt;br&gt;
🔄 Share it with someone who might find it helpful&lt;br&gt;
⭐ Follow us for more content on AI, Coding, GitHub, Career Growth, and Continuous Learning&lt;/p&gt;

&lt;p&gt;🚀 Instagram: &lt;a class="mentioned-user" href="https://dev.to/kirti"&gt;@kirti&lt;/a&gt;.builds&lt;br&gt;
💻 GitHub: &lt;a href="https://github.com/kirti" rel="noopener noreferrer"&gt;https://github.com/kirti&lt;/a&gt;&lt;br&gt;
✍️ Medium: &lt;a href="https://medium.com/@kirtikau" rel="noopener noreferrer"&gt;https://medium.com/@kirtikau&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://kirtikaushal.substack.com/p/reactforge-ai-skills-9-ai-skills" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsubstackcdn.com%2Fimage%2Ffetch%2F%24s_%21h5_K%21%2Cw_1200%2Ch_675%2Cc_fill%2Cf_jpg%2Cq_auto%3Agood%2Cfl_progressive%3Asteep%2Cg_auto%2Fhttps%253A%252F%252Fsubstack-post-media.s3.amazonaws.com%252Fpublic%252Fimages%252F529c2596-810f-4477-acb7-da3da04e1e5e_1536x1024.png" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://kirtikaushal.substack.com/p/reactforge-ai-skills-9-ai-skills" rel="noopener noreferrer" class="c-link"&gt;
            Reactforge-ai-skills — 9 AI Skills + 19 Automation Scripts for React Developers
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Teach Claude and Copilot your React standards. Enforce them automatically.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsubstackcdn.com%2Ficons%2Fsubstack%2Ffavicon.ico" width="32" height="32"&gt;
          kirtikaushal.substack.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Our Mission&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Helping people learn, build, grow, and succeed through technology, education, and community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Knowledge becomes more valuable when it is shared.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;“Learn. Build. Share. Grow.”&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;❤️ Your support, likes, shares, and feedback motivate us to keep creating free educational content for everyone.&lt;/p&gt;

&lt;p&gt;Thank you for being part of the journey! 🌱&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%2Fj1j2sfdjv72dr5hh23ae.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%2Fj1j2sfdjv72dr5hh23ae.png" alt="" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
