<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Kiran Naragund</title>
    <description>The latest articles on Forem by Kiran Naragund (@dev_kiran).</description>
    <link>https://forem.com/dev_kiran</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%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg</url>
      <title>Forem: Kiran Naragund</title>
      <link>https://forem.com/dev_kiran</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dev_kiran"/>
    <language>en</language>
    <item>
      <title>From MVP to Production: Tools That Grow With Your SaaS 🚀</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Mon, 16 Mar 2026 03:20:09 +0000</pubDate>
      <link>https://forem.com/dev_kiran/from-mvp-to-production-tools-that-grow-with-your-saas-148</link>
      <guid>https://forem.com/dev_kiran/from-mvp-to-production-tools-that-grow-with-your-saas-148</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;Building a SaaS product is thrilling. But moving from your first MVP to a reliable production service takes more than code. You need scalable infrastructure for things like auth, billing, emails, uploads, observability, and execution intelligence. Building all of this from scratch slows you down and introduces risk.&lt;/p&gt;

&lt;p&gt;That’s why many SaaS teams use proven tools and SDKs that solve real infrastructure problems so they can focus on the core product.&lt;/p&gt;

&lt;p&gt;In this article you’ll get for each tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear description of what it does&lt;/li&gt;
&lt;li&gt;Key features&lt;/li&gt;
&lt;li&gt;Why it’s useful for SaaS&lt;/li&gt;
&lt;li&gt;A simple getting-started guide&lt;/li&gt;
&lt;li&gt;Links to official docs and websites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s level up your SaaS stack 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s an SDK?
&lt;/h2&gt;

&lt;p&gt;A software development kit (SDK) is a bundled set of tools that helps you integrate functionality or services into your application without building them from scratch.&lt;/p&gt;

&lt;p&gt;SDKs often include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prewritten code libraries&lt;/li&gt;
&lt;li&gt;APIs and interface definitions&lt;/li&gt;
&lt;li&gt;Documentation and examples&lt;/li&gt;
&lt;li&gt;Debugging or testing helpers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using SDKs helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Save time&lt;/li&gt;
&lt;li&gt;Avoid reinventing the wheel&lt;/li&gt;
&lt;li&gt;Reduce bugs&lt;/li&gt;
&lt;li&gt;Build consistently across environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you need authentication, payments, emails, or production intelligence, well-chosen SDKs drastically speed up development.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.hud.io/" rel="noopener noreferrer"&gt;Hud&lt;/a&gt;: Runtime Production Intelligence That Scales With You
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbq3rq02cce1hgq5y0fq.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%2Fhbq3rq02cce1hgq5y0fq.png" alt="Hud"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hud is a &lt;strong&gt;runtime code sensor that captures real production execution behavior and brings that context where engineers actually work&lt;/strong&gt; in their IDEs and code review workflows. It continuously collects function-level execution data, detects issues like regressions or errors, surfaces root causes, and powers production-aware development with or without AI assists.&lt;/p&gt;

&lt;p&gt;Unlike typical SDKs that provide discrete functions (like auth or payments), Hud is an intelligence layer. It does not change your business logic. Instead, it observes how that logic behaves under production traffic and delivers real execution insights back into your development loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It Matters
&lt;/h3&gt;

&lt;p&gt;Most SaaS teams face a gap between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What code looks like in source&lt;/li&gt;
&lt;li&gt;How it actually runs under real customer load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gap grows as you scale and adopt AI-assisted coding tools. Code suggestions and refactors that look valid in staging may fail in production because they lack real execution context.&lt;/p&gt;

&lt;p&gt;Hud fills this gap by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giving function behavior signals from production&lt;/li&gt;
&lt;li&gt;Detecting regressions or errors automatically&lt;/li&gt;
&lt;li&gt;Pinpointing exact root causes&lt;/li&gt;
&lt;li&gt;Feeding runtime context into supported IDEs&lt;/li&gt;
&lt;li&gt;Enabling safer, production-aware AI coding workflows (MCP server)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short, Hud helps you move from reactive debugging to proactive production confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Function-Level Execution Data&lt;/strong&gt;: Hud captures how each function behaves in production: invocation counts, durations, error signals, and behavioral trends.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IDE Integration&lt;/strong&gt;: Runtime summaries appear inside supported editors like VS Code and JetBrains. You get real behavior context without leaving your code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Issue Detection&lt;/strong&gt;: Hud flags behavioral changes after deploys, new errors, and performance regressions with root cause context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production-Aware AI Coding&lt;/strong&gt;: &lt;a href="https://docs.hud.io/docs/hud-mcp-server" rel="noopener noreferrer"&gt;Hud’s MCP server&lt;/a&gt; streams production signals into AI assistants like Copilot or Cursor so generated suggestions align with how your code runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal Overhead &amp;amp; Zero Config&lt;/strong&gt;: It installs fast and runs safely in production without heavy configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why SaaS Teams Use It
&lt;/h3&gt;

&lt;p&gt;Hud is not just another monitoring tool. It becomes valuable when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your app has real production traffic&lt;/li&gt;
&lt;li&gt;Issues only show up after deploy&lt;/li&gt;
&lt;li&gt;You use AI-assisted coding tools&lt;/li&gt;
&lt;li&gt;You want deeper insight than logs or traces can provide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beginner teams focused on MVPs usually do not need this yet. But once you have real users and production complexity, Hud helps teams catch issues early, fix them quickly, and build with confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Get Started
&lt;/h3&gt;

&lt;p&gt;Here is a simple guide to set up Hud in a &lt;code&gt;Node.js&lt;/code&gt; app.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Create a Hud Account
&lt;/h4&gt;

&lt;p&gt;First, sign up at &lt;a href="https://hud.io" rel="noopener noreferrer"&gt;hud.io&lt;/a&gt; and create your workspace. After signup you’ll get API keys for your project.&lt;/p&gt;

&lt;p&gt;👉 Visit: &lt;a href="https://hud.io/" rel="noopener noreferrer"&gt;https://hud.io&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Install the Hud SDK
&lt;/h4&gt;

&lt;p&gt;In your project directory, install the Hud package:&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;hud-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This installs the lightweight sensor that captures runtime behavior.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Initialize Hud Early in Your App
&lt;/h4&gt;

&lt;p&gt;Hud works best when it starts before your application logic. So import and initialize it early in your main file.&lt;/p&gt;

&lt;p&gt;Create a file named &lt;code&gt;hud-init.js&lt;/code&gt;:&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;hud&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;hud-sdk/setup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;hud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;includeModules&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="nx"&gt;hud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initSession&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HUD_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my-service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then, change your start script so this file loads first:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--require&lt;/span&gt; ./hud-init.js index.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or import it at the top of your entry file:&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="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./hud-init.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// ...rest of your app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  4. Open Your IDE Extension
&lt;/h4&gt;

&lt;p&gt;Install the Hud extension in your IDE (VS Code, JetBrains, or Cursor). This lets you see real production behavior right next to your code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VS Code: Install from &lt;a href="https://marketplace.visualstudio.com/items?itemName=Hud.hud" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JetBrains IDEs: Install from &lt;a href="https://plugins.jetbrains.com/plugin/25174-hud" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you’ll see runtime summaries and signals directly in your editor.&lt;/p&gt;
&lt;h4&gt;
  
  
  5. Deploy and Watch Production
&lt;/h4&gt;

&lt;p&gt;Once Hud is running in production, it starts collecting and sending runtime data automatically. You can view function performance, errors, and trends in the Hud dashboard or directly in your IDE.&lt;/p&gt;

&lt;p&gt;Watch this quick demo video for better understanding 👇&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/JoOhI6QF6Zs"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Links&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://docs.hud.io/docs/welcome" rel="noopener noreferrer"&gt;https://docs.hud.io/docs/welcome&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://hud.io/" rel="noopener noreferrer"&gt;https://hud.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Install &amp;amp; Setup Guide&lt;/strong&gt;: &lt;a href="https://docs.hud.io/docs/installation-guide" rel="noopener noreferrer"&gt;https://docs.hud.io/docs/installation-guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;a href="https://clerk.com/" rel="noopener noreferrer"&gt;Clerk&lt;/a&gt;: Authentication Without Building It Yourself
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgn9g40a266qngswqbod7.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%2Fgn9g40a266qngswqbod7.png" alt="Clerk"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clerk helps you handle authentication and user management without building everything from scratch. It takes care of users, sessions, and tokens, so your backend can trust who is making a request.&lt;/p&gt;

&lt;p&gt;Instead of writing your own auth logic, you can use Clerk to verify users securely on the backend and protect your APIs.&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Secure user authentication&lt;/li&gt;
&lt;li&gt;Session and token management&lt;/li&gt;
&lt;li&gt;Easy backend verification&lt;/li&gt;
&lt;li&gt;Works well with Node.js APIs&lt;/li&gt;
&lt;li&gt;Dashboard to manage users&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why It’s Useful for SaaS
&lt;/h3&gt;

&lt;p&gt;Every SaaS backend needs to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who the user is&lt;/li&gt;
&lt;li&gt;Whether the request is authenticated&lt;/li&gt;
&lt;li&gt;Whether the session is valid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doing this yourself is time-consuming and risky.&lt;/p&gt;

&lt;p&gt;Clerk helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secure your backend APIs quickly&lt;/li&gt;
&lt;li&gt;Avoid common auth mistakes&lt;/li&gt;
&lt;li&gt;Scale user management as your SaaS grows&lt;/li&gt;
&lt;li&gt;Spend less time on security setup&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  How to Get Started (Backend Setup – Node.js)
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. Create a Clerk Account
&lt;/h4&gt;

&lt;p&gt;Sign up on the Clerk website and create a new application.&lt;br&gt;
From the dashboard, copy your Secret Key.&lt;/p&gt;

&lt;p&gt;👉 Website: &lt;a href="https://clerk.com" rel="noopener noreferrer"&gt;https://clerk.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Install the Clerk Backend SDK
&lt;/h4&gt;

&lt;p&gt;In your backend project, install Clerk:&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; @clerk/clerk-sdk-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  3. Add Environment Variables
&lt;/h4&gt;

&lt;p&gt;Add your Clerk secret key to your environment variables:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CLERK_SECRET_KEY=your_secret_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  4. Protect Backend Routes
&lt;/h4&gt;

&lt;p&gt;Use Clerk middleware to protect your API routes.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ClerkExpressRequireAuth&lt;/span&gt; &lt;span class="p"&gt;}&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;@clerk/clerk-sdk-node&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Public route&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/public&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Anyone can access this&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="c1"&gt;// Protected route&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/dashboard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nc"&gt;ClerkExpressRequireAuth&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Authenticated request&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&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;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on port 3000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now, only authenticated users can access &lt;code&gt;/api/dashboard&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  5. Access User Information on the Backend
&lt;/h4&gt;

&lt;p&gt;Once authenticated, you can safely access user data.&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="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/profile&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nc"&gt;ClerkExpressRequireAuth&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;sessionId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sessionId&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;This makes it easy to link users to your database records.&lt;/p&gt;
&lt;h4&gt;
  
  
  Frontend Configuration (Quick Note)
&lt;/h4&gt;

&lt;p&gt;Once your backend is protected, you’ll need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add Clerk to your frontend (React, Next.js, etc.)&lt;/li&gt;
&lt;li&gt;Send the authentication token with API requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clerk provides ready-made frontend SDKs and UI components to handle login and signup easily.&lt;/p&gt;

&lt;p&gt;👉 Frontend setup docs: &lt;a href="https://clerk.com/docs" rel="noopener noreferrer"&gt;https://clerk.com/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Links&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://clerk.com/docs" rel="noopener noreferrer"&gt;https://clerk.com/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://clerk.com" rel="noopener noreferrer"&gt;https://clerk.com&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;a href="https://stripe.com/in" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;: Payments and Subscriptions for Your SaaS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63hgqopsvanv7p1b7kd0.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%2F63hgqopsvanv7p1b7kd0.png" alt="Stripe"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stripe helps you handle payments and subscriptions without building complex billing logic yourself. It takes care of card payments, retries, invoices, and many edge cases that are hard to get right.&lt;/p&gt;

&lt;p&gt;For a SaaS backend, Stripe is mainly used to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create subscriptions&lt;/li&gt;
&lt;li&gt;Charge customers&lt;/li&gt;
&lt;li&gt;Listen to payment events using webhooks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;One-time payments and subscriptions&lt;/li&gt;
&lt;li&gt;Secure payment handling&lt;/li&gt;
&lt;li&gt;Webhooks for billing events&lt;/li&gt;
&lt;li&gt;Customer and invoice management&lt;/li&gt;
&lt;li&gt;Widely used and well-documented&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why It’s Useful for SaaS
&lt;/h3&gt;

&lt;p&gt;Almost every SaaS needs billing. Writing your own payment system is risky and slow.&lt;/p&gt;

&lt;p&gt;Stripe helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start charging users quickly&lt;/li&gt;
&lt;li&gt;Avoid payment and security issues&lt;/li&gt;
&lt;li&gt;Handle upgrades, downgrades, and cancellations&lt;/li&gt;
&lt;li&gt;Keep your backend in sync with payment status&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  How to Get Started (Backend Setup – Node.js)
&lt;/h3&gt;

&lt;p&gt;Below is a simple backend setup using Node.js.&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Create a Stripe Account
&lt;/h4&gt;

&lt;p&gt;Sign up on Stripe and create a project.&lt;br&gt;
From the dashboard, copy your Secret API Key.&lt;/p&gt;

&lt;p&gt;👉 Website: &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;https://stripe.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Install the Stripe SDK
&lt;/h4&gt;

&lt;p&gt;Install Stripe in your backend project:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install stripe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  3. Add Environment Variables
&lt;/h4&gt;

&lt;p&gt;Add your Stripe secret key to your environment variables:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;STRIPE_SECRET_KEY=your_secret_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  4. Initialize Stripe in Your Backend
&lt;/h4&gt;

&lt;p&gt;Create a Stripe client that you can reuse in your app.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Stripe&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;stripe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Stripe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STRIPE_SECRET_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2026-01-28&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  5. Create a Customer
&lt;/h4&gt;

&lt;p&gt;When a user signs up for your SaaS, create a Stripe customer.&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;customer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user@email.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Store the &lt;code&gt;customer.id&lt;/code&gt; in your database and link it to the user.&lt;/p&gt;
&lt;h4&gt;
  
  
  6. Create a Subscription
&lt;/h4&gt;

&lt;p&gt;Use Stripe Checkout or create subscriptions directly from the backend.&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;subscription&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;items&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="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price_id_here&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This starts billing the customer based on your pricing plan.&lt;/p&gt;
&lt;h4&gt;
  
  
  7. Handle Webhooks
&lt;/h4&gt;

&lt;p&gt;Webhooks tell your backend when something changes, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment success&lt;/li&gt;
&lt;li&gt;Payment failure&lt;/li&gt;
&lt;li&gt;Subscription canceled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create a webhook endpoint:&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&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;express&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;bodyParser&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;body-parser&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/webhook&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;bodyParser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&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="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;invoice.payment_succeeded&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Payment successful&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;customer.subscription.deleted&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Subscription canceled&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;received&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="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;NOTE: This is just a demo and getting started code, please refer the documentation and implement according to your application needs.&lt;/p&gt;

&lt;p&gt;Use webhooks to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable or disable features&lt;/li&gt;
&lt;li&gt;Update subscription status in your database&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Frontend Configuration (Quick Note)
&lt;/h4&gt;

&lt;p&gt;On the frontend, you’ll usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redirect users to Stripe Checkout&lt;/li&gt;
&lt;li&gt;Or collect payment details using Stripe Elements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stripe provides ready-made frontend tools so you don’t need to handle card data yourself.&lt;/p&gt;

&lt;p&gt;👉 Frontend docs: &lt;a href="https://stripe.com/docs/payments/checkout" rel="noopener noreferrer"&gt;https://stripe.com/docs/payments/checkout&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Links&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend Documentation&lt;/strong&gt;: &lt;a href="https://stripe.com/docs/api" rel="noopener noreferrer"&gt;https://stripe.com/docs/api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://stripe.com/" rel="noopener noreferrer"&gt;https://stripe.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkout Guide&lt;/strong&gt;: &lt;a href="https://stripe.com/docs/payments/checkout" rel="noopener noreferrer"&gt;https://stripe.com/docs/payments/checkout&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks Guide&lt;/strong&gt;: &lt;a href="https://stripe.com/docs/webhooks" rel="noopener noreferrer"&gt;https://stripe.com/docs/webhooks&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;a href="https://resend.com/" rel="noopener noreferrer"&gt;Resend&lt;/a&gt;: Send Transactional Emails Without the Complexity
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9v5vcn80rloblozv870.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%2Fd9v5vcn80rloblozv870.png" alt="Resend"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resend helps you send transactional emails from your backend easily and reliably.&lt;br&gt;
This includes emails like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Welcome emails&lt;/li&gt;
&lt;li&gt;Login or magic link emails&lt;/li&gt;
&lt;li&gt;Payment or subscription notifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of managing SMTP servers or complex email setup, Resend gives you a simple API that works well for SaaS products.&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simple email-sending API&lt;/li&gt;
&lt;li&gt;High email deliverability&lt;/li&gt;
&lt;li&gt;Support for HTML and React email templates&lt;/li&gt;
&lt;li&gt;Works well with Node.js backends&lt;/li&gt;
&lt;li&gt;Minimal setup and clear logs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Why It’s Useful for SaaS
&lt;/h3&gt;

&lt;p&gt;Every SaaS needs emails, but email infrastructure is often painful.&lt;/p&gt;

&lt;p&gt;Resend helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send emails quickly without SMTP setup&lt;/li&gt;
&lt;li&gt;Avoid common delivery issues&lt;/li&gt;
&lt;li&gt;Keep email logic simple and clean&lt;/li&gt;
&lt;li&gt;Focus on product logic instead of email servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s especially useful for early-stage SaaS and MVPs.&lt;/p&gt;
&lt;h3&gt;
  
  
  How to Get Started (Backend Setup – Node.js)
&lt;/h3&gt;

&lt;p&gt;Below is a simple backend setup using &lt;code&gt;Node.js&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Create a Resend Account
&lt;/h4&gt;

&lt;p&gt;Sign up on Resend and create a project.&lt;br&gt;
From the dashboard, copy your API Key.&lt;/p&gt;

&lt;p&gt;👉 Website: &lt;a href="https://resend.com" rel="noopener noreferrer"&gt;https://resend.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Install the Resend SDK
&lt;/h4&gt;

&lt;p&gt;Install Resend in your backend project:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install resend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  3. Add Environment Variables
&lt;/h4&gt;

&lt;p&gt;Add your Resend API key to your environment variables:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RESEND_API_KEY=your_api_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  4. Send Your First Email
&lt;/h4&gt;

&lt;p&gt;Create a Resend client and send an email from your backend.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Resend&lt;/span&gt; &lt;span class="p"&gt;}&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;resend&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Resend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RESEND_API_KEY&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;resend&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SaaS App &amp;lt;noreply@yourdomain.com&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;to&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;user@email.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to our app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;p&amp;gt;Thanks for signing up!&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That’s it, your email is sent.&lt;/p&gt;
&lt;h4&gt;
  
  
  Frontend Configuration (Quick Note)
&lt;/h4&gt;

&lt;p&gt;Resend is mostly used on the backend.&lt;br&gt;
On the frontend, you usually just trigger backend APIs that send emails.&lt;/p&gt;

&lt;p&gt;If you want nicer emails, Resend also supports React-based email templates.&lt;/p&gt;

&lt;p&gt;👉 Email templates docs: &lt;a href="https://resend.com/docs/dashboard/templates/introduction" rel="noopener noreferrer"&gt;https://resend.com/docs/dashboard/templates/introduction&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Links&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://resend.com/docs/introduction" rel="noopener noreferrer"&gt;https://resend.com/docs/introduction&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://resend.com" rel="noopener noreferrer"&gt;https://resend.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get Started&lt;/strong&gt;: &lt;a href="https://resend.com/docs/send-with-nodejs" rel="noopener noreferrer"&gt;https://resend.com/docs/send-with-nodejs&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  &lt;a href="https://uploadthing.com/" rel="noopener noreferrer"&gt;UploadThing&lt;/a&gt;: Better file uploads
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgxiqetdd9l9rs9av0c15.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%2Fgxiqetdd9l9rs9av0c15.png" alt="UploadThing"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;UploadThing helps you handle file uploads in your SaaS without building complex upload logic.&lt;br&gt;
It takes care of file handling, storage, and validation so you don’t have to manage servers or storage APIs directly.&lt;/p&gt;

&lt;p&gt;It works especially well with Next.js backends, but the idea stays the same: secure uploads with very little code.&lt;/p&gt;
&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simple and secure file uploads&lt;/li&gt;
&lt;li&gt;File size and type validation&lt;/li&gt;
&lt;li&gt;No custom storage setup needed&lt;/li&gt;
&lt;li&gt;Works well with modern backend frameworks&lt;/li&gt;
&lt;li&gt;Clean API and good developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why It’s Useful for SaaS&lt;/p&gt;

&lt;p&gt;Many SaaS products need file uploads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Profile pictures&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;Reports&lt;/li&gt;
&lt;li&gt;Media files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building uploads yourself takes time and is easy to get wrong.&lt;/p&gt;

&lt;p&gt;UploadThing helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add uploads quickly&lt;/li&gt;
&lt;li&gt;Avoid storage and security issues&lt;/li&gt;
&lt;li&gt;Keep backend code simple&lt;/li&gt;
&lt;li&gt;Focus on product features&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  How to Get Started (Backend Setup: Next.js / Node.js)
&lt;/h3&gt;

&lt;p&gt;Below is a simple backend setup using Next.js API routes.&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Create an UploadThing Account
&lt;/h4&gt;

&lt;p&gt;Sign up on UploadThing and create a new project.&lt;br&gt;
From the dashboard, copy your API Key.&lt;/p&gt;

&lt;p&gt;👉 Website: &lt;a href="https://uploadthing.com" rel="noopener noreferrer"&gt;https://uploadthing.com&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Install the UploadThing SDK
&lt;/h4&gt;

&lt;p&gt;Install UploadThing in your project:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install uploadthing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  3. Add Environment Variables
&lt;/h4&gt;

&lt;p&gt;Add your UploadThing API key to your environment variables:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UPLOADTHING_SECRET=your_secret_key
UPLOADTHING_APP_ID=your_app_id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  4. Create an Upload Router (Backend)
&lt;/h4&gt;

&lt;p&gt;Create a backend upload handler to define what files are allowed.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createUploadthing&lt;/span&gt; &lt;span class="p"&gt;}&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;uploadthing/next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createUploadthing&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uploadRouter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;fileUploader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;maxFileSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2MB&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;maxFileSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;4MB&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="nf"&gt;onUploadComplete&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;File uploaded:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&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;This controls:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allowed file types&lt;/li&gt;
&lt;li&gt;File size limits&lt;/li&gt;
&lt;li&gt;What happens after upload&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  5. Expose the Upload Endpoint
&lt;/h4&gt;

&lt;p&gt;Export your router so your app can use 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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createNextRouteHandler&lt;/span&gt; &lt;span class="p"&gt;}&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;uploadthing/next&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;uploadRouter&lt;/span&gt; &lt;span class="p"&gt;}&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;./uploadRouter&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nf"&gt;createNextRouteHandler&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;router&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;uploadRouter&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;h4&gt;
  
  
  Frontend Configuration (Quick Note)
&lt;/h4&gt;

&lt;p&gt;On the frontend, you’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use UploadThing’s UI helpers&lt;/li&gt;
&lt;li&gt;Connect them to your backend upload route&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UploadThing provides ready-made components to make this easy.&lt;/p&gt;

&lt;p&gt;👉 Frontend docs: &lt;a href="https://docs.uploadthing.com" rel="noopener noreferrer"&gt;https://docs.uploadthing.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Official Links&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://docs.uploadthing.com" rel="noopener noreferrer"&gt;https://docs.uploadthing.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href="https://uploadthing.com" rel="noopener noreferrer"&gt;https://uploadthing.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  That's It.🙏
&lt;/h2&gt;

&lt;p&gt;Building a SaaS that grows from MVP to production means choosing tools that scale with you. From authentication and billing to production intelligence and observability, these SDKs help you deliver value faster and more confidently.&lt;/p&gt;

&lt;p&gt;If you find this guide useful, please like and share. Someone else building a SaaS might benefit too 💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





</description>
      <category>software</category>
      <category>ai</category>
      <category>coding</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Enterprise AI Code Review in Real World Teams</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Thu, 26 Feb 2026 16:06:08 +0000</pubDate>
      <link>https://forem.com/dev_kiran/enterprise-ai-code-review-in-real-world-teams-4m5l</link>
      <guid>https://forem.com/dev_kiran/enterprise-ai-code-review-in-real-world-teams-4m5l</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;If you’ve only worked in small teams, adding AI code review feels almost trivial.&lt;/p&gt;

&lt;p&gt;Install a tool.&lt;br&gt;
Connect your repo.&lt;br&gt;
Merge a PR and watch the comments roll in.&lt;/p&gt;

&lt;p&gt;That is usually enough to get started.&lt;/p&gt;

&lt;p&gt;Enterprise environments are a completely different story.&lt;/p&gt;

&lt;p&gt;When you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;300, 1,000, or even 10,000 developers contributing daily&lt;/li&gt;
&lt;li&gt;Dozens or hundreds of repositories with different ownership models&lt;/li&gt;
&lt;li&gt;Shared internal libraries that power half the company&lt;/li&gt;
&lt;li&gt;Compliance requirements that are audited regularly&lt;/li&gt;
&lt;li&gt;Multiple DevOps platforms coexisting across departments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI review stops being a productivity experiment you try for a sprint.&lt;/p&gt;

&lt;p&gt;It becomes an architectural decision that affects how the entire engineering organization works.&lt;/p&gt;

&lt;p&gt;Let’s talk about what actually matters from a developer perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changes in Enterprise Environments?
&lt;/h2&gt;

&lt;p&gt;As developers, we usually think in very practical terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this comment actually help me improve the code?&lt;/li&gt;
&lt;li&gt;Is this feedback technically accurate?&lt;/li&gt;
&lt;li&gt;Is it going to slow me down while I am trying to ship?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At enterprise scale, the questions expand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will this behave consistently across all our repositories?&lt;/li&gt;
&lt;li&gt;Is our proprietary code safe in the process?&lt;/li&gt;
&lt;li&gt;Does this scale without flooding PRs with noise?&lt;/li&gt;
&lt;li&gt;Can it enforce standards in a consistent and predictable way?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are fundamentally different concerns compared to startup level tooling decisions. What works for 15 engineers does not automatically work for 1,500.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi Repo Reality
&lt;/h2&gt;

&lt;p&gt;Most large companies are not running a single mono repo.&lt;/p&gt;

&lt;p&gt;You will typically see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A shared SDK repository used by multiple teams&lt;/li&gt;
&lt;li&gt;Several microservices owned by different groups&lt;/li&gt;
&lt;li&gt;Infrastructure as code repositories&lt;/li&gt;
&lt;li&gt;Internal tooling and automation projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now imagine this scenario.&lt;/p&gt;

&lt;p&gt;You change a shared interface in Repo A. That interface is consumed by 12 services spread across 8 other repositories.&lt;/p&gt;

&lt;p&gt;A diff only review inside a single repo will not understand the blast radius. It cannot see how that change might ripple across dependent systems.&lt;/p&gt;

&lt;p&gt;This is one of the biggest gaps I have noticed in many AI review tools.&lt;/p&gt;

&lt;p&gt;They evaluate the pull request in isolation. Enterprises need tools that understand the system as a whole, not just the file that changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Platform Fragmentation Is Real
&lt;/h2&gt;

&lt;p&gt;In large organizations, standardization is often aspirational rather than real. You will frequently find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Azure DevOps&lt;/strong&gt; in one department&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bitbucket&lt;/strong&gt; in another&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; for open source initiatives&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitLab&lt;/strong&gt; in specific regions or subsidiaries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If an AI review tool works well on only one platform, you are left with two uncomfortable options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fragment your tooling and accept inconsistent behavior&lt;/li&gt;
&lt;li&gt;Force a company wide migration, which is rarely smooth or politically simple&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a developer perspective, consistency matters a lot. You do not want different review logic depending on which repository you happen to be working in that week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security and Deployment Constraints
&lt;/h2&gt;

&lt;p&gt;This is where enterprise environments differ the most.&lt;/p&gt;

&lt;p&gt;Many companies require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SOC 2 compliance&lt;/li&gt;
&lt;li&gt;On prem deployment options&lt;/li&gt;
&lt;li&gt;Air gapped environments&lt;/li&gt;
&lt;li&gt;Strict data retention and governance policies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a tool requires sending proprietary code to an external service without clear controls, security teams will block it immediately.&lt;/p&gt;

&lt;p&gt;As developers, we do not always see those conversations happening in the background. But they directly determine which tools we are even allowed to evaluate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparing Tool Categories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Static Analysis Platforms
&lt;/h3&gt;

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

&lt;p&gt;What it does well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security scanning&lt;/li&gt;
&lt;li&gt;Detecting code smells&lt;/li&gt;
&lt;li&gt;Enforcing coverage thresholds&lt;/li&gt;
&lt;li&gt;Providing compliance dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where it fits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Baseline quality enforcement&lt;/li&gt;
&lt;li&gt;Highly regulated environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where it does not help much:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architectural reasoning&lt;/li&gt;
&lt;li&gt;Cross repo impact awareness&lt;/li&gt;
&lt;li&gt;Contextual AI style suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is reliable and predictable, but rule based.&lt;/p&gt;

&lt;p&gt;Think of it as a guardrail. It keeps you within boundaries, but it does not actively review your design decisions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Focused Platforms
&lt;/h3&gt;

&lt;p&gt;Example: &lt;strong&gt;GitHub Advanced Security&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Strong for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secret scanning&lt;/li&gt;
&lt;li&gt;Dependency vulnerability detection&lt;/li&gt;
&lt;li&gt;Improving overall security posture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deeply centered around GitHub&lt;/li&gt;
&lt;li&gt;Primarily focused on security, not full PR workflow&lt;/li&gt;
&lt;li&gt;Does not reason about broader architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It protects you from known vulnerabilities.&lt;br&gt;
It does not holistically improve pull request quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lightweight AI PR Assistants
&lt;/h3&gt;

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

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Very quick setup&lt;/li&gt;
&lt;li&gt;Clear PR summaries&lt;/li&gt;
&lt;li&gt;Useful for smaller, self contained repositories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons at scale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diff only analysis&lt;/li&gt;
&lt;li&gt;Limited contextual awareness&lt;/li&gt;
&lt;li&gt;Can become noisy in complex systems&lt;/li&gt;
&lt;li&gt;Fewer governance controls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a 20 developer team, this can be more than enough.&lt;/p&gt;

&lt;p&gt;For a 1,000 developer organization with shared dependencies and layered architecture, it often falls short.&lt;/p&gt;

&lt;h3&gt;
  
  
  Context Aware Enterprise AI Review
&lt;/h3&gt;

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

&lt;p&gt;This category aims to address:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi repo indexing&lt;/li&gt;
&lt;li&gt;Dependency awareness&lt;/li&gt;
&lt;li&gt;Cross repo impact detection&lt;/li&gt;
&lt;li&gt;Custom rule enforcement&lt;/li&gt;
&lt;li&gt;Flexible deployment models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a developer standpoint, the real questions are simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it understand more than just my diff?&lt;/li&gt;
&lt;li&gt;Are the suggestions precise and actionable?&lt;/li&gt;
&lt;li&gt;Does it reduce back and forth during review?&lt;/li&gt;
&lt;li&gt;Do engineers actually accept the suggestions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If developers ignore the comments, the tool slowly fades into background noise. Adoption is earned, not mandated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Developers in Enterprises Actually Care About
&lt;/h2&gt;

&lt;p&gt;When I talk to engineers in large organizations, their concerns are very pragmatic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this going to slow my PR down?&lt;/li&gt;
&lt;li&gt;Am I going to waste time dismissing false positives?&lt;/li&gt;
&lt;li&gt;Does it understand our internal patterns and conventions?&lt;/li&gt;
&lt;li&gt;Will it block my merge for the wrong reasons?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At enterprise scale, trust becomes everything.&lt;/p&gt;

&lt;p&gt;A high acceptance rate matters more than impressive sounding AI explanations.&lt;/p&gt;

&lt;p&gt;Precision beats volume.&lt;/p&gt;

&lt;p&gt;A tool that leaves five accurate comments is more valuable than one that leaves fifty generic ones.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Simple Enterprise Checklist
&lt;/h2&gt;

&lt;p&gt;If I were evaluating AI code review in a large organization, here is what I would personally verify:&lt;/p&gt;

&lt;p&gt;✅ Works consistently across Azure DevOps, Bitbucket, GitHub, and GitLab&lt;br&gt;
✅ Understands multi repo dependencies and shared libraries&lt;br&gt;
✅ Supports cloud, on prem, or air gapped deployment&lt;br&gt;
✅ Demonstrates strong security posture and compliance certifications&lt;br&gt;
✅ Allows custom rules aligned with team specific standards&lt;br&gt;
✅ Shows real developer adoption, not forced usage metrics&lt;br&gt;
✅ Scales beyond 100 developers without overwhelming PRs&lt;/p&gt;

&lt;p&gt;If a tool fails two or three of these, it will likely struggle during enterprise rollout.&lt;/p&gt;

&lt;p&gt;At the end of the day, AI code review in large organizations is not about adding more comments to pull requests. It is about building a system that developers trust, security teams approve, and architecture teams can rely on long term.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank You!!🙏
&lt;/h2&gt;

&lt;p&gt;Thank you for reading this far. If you find this article useful, please like and share this article. Someone could find it useful too.💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


 

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>coding</category>
    </item>
    <item>
      <title>Can AI Code Review Actually Improve DORA Metrics?</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Thu, 19 Feb 2026 16:01:06 +0000</pubDate>
      <link>https://forem.com/dev_kiran/can-ai-code-review-actually-improve-dora-metrics-3790</link>
      <guid>https://forem.com/dev_kiran/can-ai-code-review-actually-improve-dora-metrics-3790</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;We talk a lot about AI speeding up coding.&lt;/p&gt;

&lt;p&gt;You’ve probably seen numbers like:&lt;/p&gt;

&lt;p&gt;"&lt;em&gt;AI increases developer productivity by 25 to 35 percent.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;Honestly that feels true, and multiple surveys and reports do show developers reporting significant boosts in productivity and time saved on routine tasks due to generative AI tooling. For example, large industry surveys show more than 80 percent of developers saying AI improved their individual productivity, and real-world telemetry showing task completion rising significantly with AI assistance.&lt;/p&gt;

&lt;p&gt;Autocomplete feels better. Boilerplate goes faster. Refactoring can take fewer keystrokes.&lt;/p&gt;

&lt;p&gt;But here’s something I’ve been thinking about lately:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If we are writing code faster, are we reviewing it faster too?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because if review becomes the bottleneck, &lt;strong&gt;DORA metrics&lt;/strong&gt; won’t improve. They might even get worse.&lt;/p&gt;

&lt;p&gt;Let’s break this down in simple terms.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, What Are DORA Metrics?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;DevOps Research and Assessment program&lt;/strong&gt; defined four key engineering metrics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Deployment Frequency&lt;/li&gt;
&lt;li&gt;Lead Time for Changes&lt;/li&gt;
&lt;li&gt;Change Failure Rate&lt;/li&gt;
&lt;li&gt;Time to Restore Service&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These metrics basically answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How often do you ship?&lt;/li&gt;
&lt;li&gt;How long does it take to ship?&lt;/li&gt;
&lt;li&gt;How often does it break?&lt;/li&gt;
&lt;li&gt;How fast do you fix it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If AI code review truly helps engineering performance, we should see positive movement across these.&lt;/p&gt;

&lt;p&gt;Read more about DORA here 👉 &lt;a href="https://getdx.com/blog/dora-metrics/" rel="noopener noreferrer"&gt;https://getdx.com/blog/dora-metrics&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Code Review Paradox
&lt;/h2&gt;

&lt;p&gt;Recent industry data suggests something surprising: teams with high AI adoption often see &lt;em&gt;code review time increase&lt;/em&gt; sharply, even as code output rises. In &lt;a href="https://www.faros.ai/" rel="noopener noreferrer"&gt;Faros AI&lt;/a&gt;’s 2025 data, code review time grew by around &lt;em&gt;~91 percent&lt;/em&gt; as the volume and size of pull requests (PRs) increased.&lt;/p&gt;

&lt;p&gt;That raises a question:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Why would review take longer when code is written faster?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Possibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More PRs are being created&lt;/li&gt;
&lt;li&gt;Larger diff sizes requiring deeper review&lt;/li&gt;
&lt;li&gt;"AI-generated but needs cleanup" code is common&lt;/li&gt;
&lt;li&gt;Reviewers double-check AI output carefully given trust concerns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So while coding accelerates, review capacity does not automatically scale to match.&lt;/p&gt;

&lt;p&gt;That’s the paradox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s Connect AI Review to Each DORA Metric
&lt;/h2&gt;

&lt;p&gt;Instead of looking at tools, let’s think logically.&lt;/p&gt;

&lt;h3&gt;
  
  
  1️⃣ Deployment Frequency
&lt;/h3&gt;

&lt;p&gt;If reviews are faster, PRs merge faster.&lt;/p&gt;

&lt;p&gt;If PRs merge faster, deployments can happen more often.&lt;/p&gt;

&lt;p&gt;AI review can help by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Giving instant feedback on PR creation&lt;/li&gt;
&lt;li&gt;Catching obvious issues before a human reviewer steps in&lt;/li&gt;
&lt;li&gt;Reducing back-and-forth cycles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this only works if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The feedback is accurate&lt;/li&gt;
&lt;li&gt;Developers trust it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If it’s noisy, it slows things down instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  2️⃣ Lead Time for Changes
&lt;/h2&gt;

&lt;p&gt;Lead time = commit → production.&lt;/p&gt;

&lt;p&gt;Where does most delay happen?&lt;/p&gt;

&lt;p&gt;Usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Waiting for review&lt;/li&gt;
&lt;li&gt;Fixing issues after review&lt;/li&gt;
&lt;li&gt;CI failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If AI review catches issues immediately inside the PR, it can reduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rework cycles&lt;/li&gt;
&lt;li&gt;Manual review load&lt;/li&gt;
&lt;li&gt;Idle waiting time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some organizations estimate meaningful time savings per PR when review insights trigger faster fixes, which compounds across a team.&lt;/p&gt;

&lt;h2&gt;
  
  
  3️⃣ Change Failure Rate
&lt;/h2&gt;

&lt;p&gt;This measures how often deployments lead to failures.&lt;/p&gt;

&lt;p&gt;Quality matters here.&lt;/p&gt;

&lt;p&gt;Data from several sources shows that larger PRs and heavier reliance on AI-generated content can increase bug rates unless issues are caught before merge. In the Faros dataset, bug rates rose slightly even as output increased.&lt;/p&gt;

&lt;p&gt;If review catches high-severity issues earlier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fewer production incidents&lt;/li&gt;
&lt;li&gt;Fewer hotfixes&lt;/li&gt;
&lt;li&gt;Less rollback stress&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But false positives or poor insight quality don’t help. High-signal detection does.&lt;/p&gt;

&lt;h2&gt;
  
  
  4️⃣ Time to Restore Service
&lt;/h2&gt;

&lt;p&gt;This one is indirect.&lt;/p&gt;

&lt;p&gt;Better code quality means fewer incidents, and thus less firefighting.&lt;/p&gt;

&lt;p&gt;AI alone doesn’t magically accelerate incident resolution, but it can prevent some incidents in the first place, easing the load on on-call teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Different Tools Fit
&lt;/h2&gt;

&lt;p&gt;Now let’s look at tools categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  Diff-First AI Review Tools
&lt;/h3&gt;

&lt;p&gt;These look mainly at what changed in the PR.&lt;/p&gt;

&lt;p&gt;Examples include lightweight PR assistants and AI summaries.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast feedback&lt;/li&gt;
&lt;li&gt;Easy setup&lt;/li&gt;
&lt;li&gt;Helpful for small changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limited context&lt;/li&gt;
&lt;li&gt;Can miss architectural issues&lt;/li&gt;
&lt;li&gt;Sometimes noisy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If developers start ignoring comments, DORA does not improve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Analysis Tools
&lt;/h3&gt;

&lt;p&gt;Rule-based analyzers like &lt;a href="https://www.sonarsource.com/products/sonarqube/" rel="noopener noreferrer"&gt;SonarQube&lt;/a&gt; catch security bugs, code smells, and other structural issues.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong baseline quality checks&lt;/li&gt;
&lt;li&gt;Good compliance signals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rule-based rather than contextual&lt;/li&gt;
&lt;li&gt;Doesn’t inherently reduce review friction unless integrated deeply&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Context-Aware AI Review
&lt;/h3&gt;

&lt;p&gt;More advanced systems tools, like &lt;a href="https://qodo.ai" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt;, try to analyze broader context beyond just the diff.&lt;/p&gt;

&lt;p&gt;The idea is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand surrounding files&lt;/li&gt;
&lt;li&gt;Recognize patterns in your codebase&lt;/li&gt;
&lt;li&gt;Provide more precise suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If precision is high and developers trust it, this can meaningfully reduce review cycles.&lt;/p&gt;

&lt;p&gt;If not, it becomes another notification stream to ignore.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Data Suggests
&lt;/h2&gt;

&lt;p&gt;Here’s what current reports indicate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High AI adoption can &lt;em&gt;increase review time&lt;/em&gt; if processes don’t adapt, because PR volume and size grow faster than review capacity.&lt;/li&gt;
&lt;li&gt;Developers widely report productivity improvements from AI while expressing mixed confidence in AI-generated code.&lt;/li&gt;
&lt;li&gt;Survey data shows many developers remain cautious about trusting AI output and often verify it manually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key insight for me:&lt;/p&gt;

&lt;p&gt;AI code generation alone does not improve DORA metrics.&lt;/p&gt;

&lt;p&gt;AI review maturity does.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Honest Take
&lt;/h2&gt;

&lt;p&gt;If you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing more code because of AI&lt;/li&gt;
&lt;li&gt;Creating more PRs&lt;/li&gt;
&lt;li&gt;Increasing review load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you need to scale review alongside generation.&lt;/p&gt;

&lt;p&gt;Otherwise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment frequency stalls&lt;/li&gt;
&lt;li&gt;Lead time increases&lt;/li&gt;
&lt;li&gt;Review fatigue grows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI code review can improve DORA metrics.&lt;/p&gt;

&lt;p&gt;But only if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It integrates directly into your PR workflow&lt;/li&gt;
&lt;li&gt;It provides high-signal feedback&lt;/li&gt;
&lt;li&gt;Developers actually trust it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without trust, metrics don’t move.&lt;/p&gt;

&lt;p&gt;And that’s the part most discussions skip.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thank You!!🙏
&lt;/h2&gt;

&lt;p&gt;Thank you for reading this far. If you find this article useful, please like and share this article. Someone could find it useful too.💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


 

</description>
      <category>ai</category>
      <category>programming</category>
      <category>vibecoding</category>
      <category>devops</category>
    </item>
    <item>
      <title>Setting Up AI Code Review in Bitbucket: A Practical Guide and Comparison⚖️</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sun, 15 Feb 2026 06:53:25 +0000</pubDate>
      <link>https://forem.com/dev_kiran/setting-up-ai-code-review-in-bitbucket-a-practical-guide-and-comparison-19dp</link>
      <guid>https://forem.com/dev_kiran/setting-up-ai-code-review-in-bitbucket-a-practical-guide-and-comparison-19dp</guid>
      <description>&lt;p&gt;Hello Devs 👋 &lt;/p&gt;

&lt;p&gt;If your team uses &lt;a href="https://bitbucket.org/product/" rel="noopener noreferrer"&gt;&lt;strong&gt;Bitbucket&lt;/strong&gt;&lt;/a&gt; and you’re exploring &lt;strong&gt;AI code review tools&lt;/strong&gt;, you might have noticed that many discussions online focus on GitHub. But Bitbucket is widely used too especially companies deep in the Atlassian ecosystem, and the experience with AI review tools &lt;strong&gt;varies a lot&lt;/strong&gt; depending on platform support. &lt;/p&gt;

&lt;p&gt;In this post, we’ll cover: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How tools integrate with Bitbucket &lt;/li&gt;
&lt;li&gt;Setup complexity and time to value &lt;/li&gt;
&lt;li&gt;Review quality you can expect &lt;/li&gt;
&lt;li&gt;A comparison of &lt;a href="//qodo.ai"&gt;&lt;strong&gt;Qodo&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.sonarsource.com/products/sonarqube/" rel="noopener noreferrer"&gt;&lt;strong&gt;SonarQube&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://coderabbit.ai/" rel="noopener noreferrer"&gt;&lt;strong&gt;CodeRabbit&lt;/strong&gt;&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s get started 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Bitbucket + AI Code Review: What You Should Know
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Most Bitbucket teams use one of these:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Bitbucket Cloud&lt;/li&gt;
&lt;li&gt;Bitbucket Data Center (self-hosted)&lt;/li&gt;
&lt;li&gt;Bitbucket Pipelines for CI/CD&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A good AI review tool should:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Support Bitbucket Cloud (minimum)&lt;/li&gt;
&lt;li&gt;Ideally support Data Center too&lt;/li&gt;
&lt;li&gt;Fit directly into your Pull Request workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are usually 2 integration styles:&lt;/p&gt;

&lt;h4&gt;
  
  
  ✅ Native Integration
&lt;/h4&gt;

&lt;p&gt;You install the app from the marketplace, grant workspace access, and it comments directly on PRs using official APIs.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔁 Webhook / API Setup
&lt;/h4&gt;

&lt;p&gt;You generate tokens, connect via webhook, and the tool listens for PR events.&lt;/p&gt;

&lt;p&gt;Both work, but the difference is how much setup and maintenance you deal with.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Look For in an AI Review Tool
&lt;/h2&gt;

&lt;p&gt;When evaluating tools for Bitbucket teams, I focused on four things:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔌 Integration Requirements
&lt;/h3&gt;

&lt;p&gt;How easy is it to connect to Bitbucket Cloud or Data Center?&lt;/p&gt;

&lt;h3&gt;
  
  
  🧰 Setup Complexity
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;How long until you get value?&lt;/li&gt;
&lt;li&gt;Is there heavy configuration?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 Review Quality
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Is the feedback useful?&lt;/li&gt;
&lt;li&gt;Is it noisy?&lt;/li&gt;
&lt;li&gt;Does it understand context?&lt;/li&gt;
&lt;li&gt;Or does it only analyze diffs?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔁 Ongoing Maintenance
&lt;/h3&gt;

&lt;p&gt;Do I need to constantly tune rules and tokens?&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 Qodo: Context-Aware AI Reviews
&lt;/h2&gt;

&lt;p&gt;Qodo supports Bitbucket integration and provides official setup documentation for both Cloud and Data Center.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration &amp;amp; Setup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Bitbucket Cloud
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Sign in to &lt;a href="//qodo.ai"&gt;Qodo&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Install the Bitbucket app.&lt;/li&gt;
&lt;li&gt;Grant workspace access.&lt;/li&gt;
&lt;li&gt;Select repositories.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;Once connected, Qodo starts reviewing pull requests automatically.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bitbucket Data Center
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Upload plugin/app&lt;/li&gt;
&lt;li&gt;Configure authentication tokens&lt;/li&gt;
&lt;li&gt;Connect repositories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works well if you’re self-hosted and have admin access.&lt;/p&gt;

&lt;h4&gt;
  
  
  Bitbucket Pipelines
&lt;/h4&gt;

&lt;p&gt;You can trigger Qodo in CI using Bitbucket Pipelines.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Important&lt;/em&gt;:&lt;br&gt;
PR comments come from the app integration, not directly from pipelines.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What You Get
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Native PR comments&lt;/li&gt;
&lt;li&gt;Multi-repo support&lt;/li&gt;
&lt;li&gt;Team-level workflow integration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Review Quality
&lt;/h3&gt;

&lt;p&gt;Qodo builds context from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your codebase&lt;/li&gt;
&lt;li&gt;PR history&lt;/li&gt;
&lt;li&gt;Related files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not just the diff.&lt;/p&gt;

&lt;p&gt;This usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Higher signal&lt;/li&gt;
&lt;li&gt;Less random noise&lt;/li&gt;
&lt;li&gt;Better architectural feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup Complexity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Medium&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It’s mostly a one-time setup if you have workspace admin access.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 SonarQube: Static Analysis Inside Bitbucket
&lt;/h2&gt;

&lt;p&gt;SonarQube is a well-known static analysis tool. It integrates cleanly with Bitbucket.&lt;/p&gt;

&lt;p&gt;But important thing is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s not AI code review.&lt;/li&gt;
&lt;li&gt;It’s static analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integration &amp;amp; Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install SonarQube (Cloud or self-hosted).&lt;/li&gt;
&lt;li&gt;Connect Bitbucket repositories.&lt;/li&gt;
&lt;li&gt;Add analysis step in Bitbucket Pipelines.&lt;/li&gt;
&lt;li&gt;Configure Quality Gates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once configured, it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decorates PRs with issues&lt;/li&gt;
&lt;li&gt;Fails builds if quality gates fail&lt;/li&gt;
&lt;li&gt;Tracks coverage and duplication&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Review Quality
&lt;/h3&gt;

&lt;p&gt;Excellent for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Security scanning&lt;/li&gt;
&lt;li&gt;Code smells&lt;/li&gt;
&lt;li&gt;Technical debt&lt;/li&gt;
&lt;li&gt;Coverage metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But it does not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reason about architecture&lt;/li&gt;
&lt;li&gt;Explain design trade-offs&lt;/li&gt;
&lt;li&gt;Provide AI-style improvement suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup Complexity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Medium&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You need CI configuration. After that, it runs consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 CodeRabbit: Fast PR Feedback
&lt;/h2&gt;

&lt;p&gt;CodeRabbit supports Bitbucket Cloud and focuses on quick PR reviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration &amp;amp; Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a Bitbucket service account.&lt;/li&gt;
&lt;li&gt;Generate an API token.&lt;/li&gt;
&lt;li&gt;Connect CodeRabbit to workspace.&lt;/li&gt;
&lt;li&gt;Webhook is installed automatically.&lt;/li&gt;
&lt;li&gt;It starts reviewing PRs right away.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What You Get
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;PR summaries&lt;/li&gt;
&lt;li&gt;Inline comments&lt;/li&gt;
&lt;li&gt;Basic customization options&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where It Struggles
&lt;/h3&gt;

&lt;p&gt;CodeRabbit is mostly diff-first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It focuses on what changed in the PR.&lt;/li&gt;
&lt;li&gt;In simple projects, that works well.&lt;/li&gt;
&lt;li&gt;In complex systems with interdependencies, it can:&lt;/li&gt;
&lt;li&gt;Miss deeper architectural issues&lt;/li&gt;
&lt;li&gt;Produce noisy suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Setup Complexity
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Low to Medium.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Token + webhook setup takes a few minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-Side Comparision
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Bitbucket Support&lt;/th&gt;
&lt;th&gt;Setup Effort&lt;/th&gt;
&lt;th&gt;Review Style&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qodo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud &amp;amp; Data Center&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Context-aware AI&lt;/td&gt;
&lt;td&gt;Larger teams &amp;amp; complex codebases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SonarQube&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud &amp;amp; Server&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Static analysis&lt;/td&gt;
&lt;td&gt;Compliance &amp;amp; quality gates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeRabbit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;Low-Medium&lt;/td&gt;
&lt;td&gt;Diff-first AI&lt;/td&gt;
&lt;td&gt;Small teams &amp;amp; quick feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🛠 Quick Setup Summary
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Qodo + Bitbucket
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install Bitbucket app&lt;/li&gt;
&lt;li&gt;Grant workspace access&lt;/li&gt;
&lt;li&gt;Select repos&lt;/li&gt;
&lt;li&gt;Optional: Add Pipeline triggers&lt;/li&gt;
&lt;li&gt;Open PR → Get AI feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  SonarQube + Bitbucket
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy SonarQube&lt;/li&gt;
&lt;li&gt;Connect repos&lt;/li&gt;
&lt;li&gt;Add Pipeline step&lt;/li&gt;
&lt;li&gt;Configure Quality Gates&lt;/li&gt;
&lt;li&gt;PRs get decorated with analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CodeRabbit + Bitbucket
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create service account&lt;/li&gt;
&lt;li&gt;Generate API token&lt;/li&gt;
&lt;li&gt;Connect workspace&lt;/li&gt;
&lt;li&gt;Webhook installs automatically&lt;/li&gt;
&lt;li&gt;PRs get inline feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🏁 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;All the three tools bring value. But they solve different problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Qodo&lt;/strong&gt; → deeper, context-aware AI review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SonarQube&lt;/strong&gt; → strict quality &amp;amp; compliance checks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CodeRabbit&lt;/strong&gt; → fast, lightweight PR feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s no single &lt;strong&gt;best&lt;/strong&gt; tool.&lt;/p&gt;

&lt;p&gt;The right choice depends on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team size&lt;/li&gt;
&lt;li&gt;Codebase complexity&lt;/li&gt;
&lt;li&gt;How deep you want reviews to go&lt;/li&gt;
&lt;li&gt;Whether you need compliance gates&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If you’re running serious workloads on Bitbucket, AI review absolutely helps but only if the tool fits your workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Thank You!!🙏
&lt;/h2&gt;

&lt;p&gt;Thank you for reading this far. If you find this article useful, please like and share this article. Someone could find it useful too.💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


 

</description>
      <category>bitbucket</category>
      <category>cicd</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
    <item>
      <title>Top Vibe Coding Platforms You Should Try This Year🫵</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Mon, 09 Feb 2026 03:32:22 +0000</pubDate>
      <link>https://forem.com/dev_kiran/top-vibe-coding-platforms-you-should-try-this-year-92n</link>
      <guid>https://forem.com/dev_kiran/top-vibe-coding-platforms-you-should-try-this-year-92n</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;Coding is changing fast. Today, you don’t always need to write everything from scratch. Many new platforms focus on speed, simplicity, and good vibes. This style is often called &lt;code&gt;vibe coding&lt;/code&gt; where you focus more on ideas and building, and less on setup and stress.&lt;/p&gt;

&lt;p&gt;These tools are great for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Beginners who want to build real apps&lt;/li&gt;
&lt;li&gt; Indie hackers and founders&lt;/li&gt;
&lt;li&gt; Developers who want to move faster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article, I’ll share some of the best vibe coding platforms you should try this year.&lt;/p&gt;

&lt;p&gt;Let’s start with &lt;a href="https://www.rocket.new/" rel="noopener noreferrer"&gt;Rocket.new&lt;/a&gt; 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://www.rocket.new" rel="noopener noreferrer"&gt;Rocket.new&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm36tf74octxesrr66kzp.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%2Fm36tf74octxesrr66kzp.png" alt="Rocket.new"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rocket&lt;/strong&gt; is a powerful &lt;a href="https://www.rocket.new" rel="noopener noreferrer"&gt;vibe coding platform&lt;/a&gt; that helps you turn your ideas into real apps fast. You describe your vision in simple English and Rocket uses AI to generate a full-stack app, including backend, frontend, database, and deployment setup. It also comes with useful &lt;a href="https://www.rocket.new/templates" rel="noopener noreferrer"&gt;app templates&lt;/a&gt; that speed up your workflow and lower the time to launch.&lt;/p&gt;

&lt;p&gt;Rocket fits the modern vibe coding mindset: focus on ideas, not boilerplate code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generate full-stack web &amp;amp; mobile apps from a text prompt.&lt;/li&gt;
&lt;li&gt;Extensive &lt;a href="https://www.rocket.new/templates" rel="noopener noreferrer"&gt;app templates&lt;/a&gt; for landing pages, dashboards, mobile apps, and more. &lt;/li&gt;
&lt;li&gt;AI-powered backend setup (database, auth, API). &lt;/li&gt;
&lt;li&gt;Figma-to-code conversion support. &lt;/li&gt;
&lt;li&gt;Deploy options: Netlify, custom domain, app store (via code export). &lt;/li&gt;
&lt;li&gt;Live preview &amp;amp; iterative chat-style edits. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrations
&lt;/h3&gt;

&lt;p&gt;Rocket connects with popular tools and services so your app can do real things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Figma&lt;/strong&gt;: import designs and convert them into code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt;: database, storage, and user authentication out of the box.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netlify&lt;/strong&gt;: one-click web deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt;: add payments easily.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: push code for version control and collaboration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Analytics&lt;/strong&gt;: track how users interact with your app.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AdSense&lt;/strong&gt;: monetize your site or app with ads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI, Anthropic, Gemini, and Perplexity&lt;/strong&gt;: build AI features like chat, search, and content generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twilio and Resend&lt;/strong&gt;: send SMS and emails from your app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Along with this, &lt;strong&gt;Rocket&lt;/strong&gt; supports adding any REST/OpenAPI service by example, which makes integrations flexible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why People Like It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You can start building with just plain language, no deep coding knowledge needed. &lt;/li&gt;
&lt;li&gt;It automates backend setup and deployment in one place. &lt;/li&gt;
&lt;li&gt;Ready templates make launching prototypes much faster. &lt;/li&gt;
&lt;li&gt;Integrations with databases, auth, payments, analytics, etc., give real-world power. &lt;/li&gt;
&lt;li&gt;You can export real source code. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Startup founders prototyping MVPs&lt;/li&gt;
&lt;li&gt;Designers turning Figma screens into apps&lt;/li&gt;
&lt;li&gt;Indie hackers testing product ideas&lt;/li&gt;
&lt;li&gt;Non-developers who want production-ready code&lt;/li&gt;
&lt;li&gt;Builders who want AI + templates for fast delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.rocket.new" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Now&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://app.emergent.sh/" rel="noopener noreferrer"&gt;Emergent.sh&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdz5w1vsdg3qsq56wfwlg.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%2Fdz5w1vsdg3qsq56wfwlg.png" alt="Emergent.sh"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Emergent&lt;/strong&gt; is an AI-powered vibe coding platform that helps you build full-stack web and mobile apps using natural language prompts. You simply tell the AI what you want, and it designs, codes, tests, and deploys your app from start to finish. &lt;/p&gt;

&lt;p&gt;The platform handles frontend, backend, databases, integrations, and hosting, so you don’t need deep coding skills to launch real applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Natural language prompts turn words into working apps without traditional coding.&lt;/li&gt;
&lt;li&gt;Builds full-stack web &amp;amp; mobile apps, not just visuals or prototypes. &lt;/li&gt;
&lt;li&gt;AI agents handle coding, testing, debugging, and deployment steps. &lt;/li&gt;
&lt;li&gt;Instant website builder with layouts, forms, and workflows. &lt;/li&gt;
&lt;li&gt;GitHub integration for code sync and version control. &lt;/li&gt;
&lt;li&gt;Private project hosting and team collaboration features on paid plans. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrations
&lt;/h3&gt;

&lt;p&gt;Emergent supports popular tools to power production apps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub for code and version control.&lt;/li&gt;
&lt;li&gt;Data connections like &lt;code&gt;Google Sheets&lt;/code&gt; or &lt;code&gt;Airtable&lt;/code&gt; (on Standard plan). &lt;/li&gt;
&lt;li&gt;Deployment services and APIs, including payment integrations such as &lt;code&gt;Stripe&lt;/code&gt; on higher plans.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why People Like It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt; You can create real applications from plain language descriptions. &lt;/li&gt;
&lt;li&gt; Full-stack app building and deployment in one place removes a lot of traditional work. &lt;/li&gt;
&lt;li&gt; Free tier lets you test the workflow before paying. &lt;/li&gt;
&lt;li&gt; GitHub sync and private hosting are included on paid plans. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Solo builders and entrepreneurs trying to launch MVPs fast. &lt;/li&gt;
&lt;li&gt;Non-technical creators wanting production apps without traditional coding. &lt;/li&gt;
&lt;li&gt;Freelancers and small teams who need frontend + backend in one place. &lt;/li&gt;
&lt;li&gt;Projects that benefit from AI-driven app generation and deployment. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://app.emergent.sh" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Now&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="//lovable.dev"&gt;Lovable&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6cmdbosn9ew9w7zq3r4.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%2Fy6cmdbosn9ew9w7zq3r4.png" alt="Lovable"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lovable&lt;/strong&gt; is an AI-powered vibe coding platform that lets you build full web applications and websites simply by describing what you want in natural language. You don’t need deep coding skills, the platform generates real code, sets up backend services like database and authentication, and helps you shape your ideas into working software. &lt;/p&gt;

&lt;p&gt;Lovable also includes visual editing and deployment tools that make it easier to move from idea to launch quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI-driven generation of web apps and sites from natural language prompts. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-stack support&lt;/strong&gt;: frontend, backend, database, and authentication included. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual editor&lt;/strong&gt; for design and UX tweaks without code. &lt;/li&gt;
&lt;li&gt;Integration with &lt;strong&gt;Supabase&lt;/strong&gt; for database and user management. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; sync and code export for version control and ownership. &lt;/li&gt;
&lt;li&gt;Easy &lt;strong&gt;deployment&lt;/strong&gt; and sharing options. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrations
&lt;/h3&gt;

&lt;p&gt;Lovable works with tools that help make your apps functional and ready to grow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; for database, authentication, and storage. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; for version control and collaboration. &lt;/li&gt;
&lt;li&gt;Deployment services (like &lt;strong&gt;Vercel&lt;/strong&gt; or built-in &lt;strong&gt;hosting&lt;/strong&gt;) for going live quickly. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why People Like It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You can turn plain language ideas into real apps fast. &lt;/li&gt;
&lt;li&gt;It handles both frontend and backend so you don’t juggle many tools. &lt;/li&gt;
&lt;li&gt;Simplifies building software without deep code knowledge. &lt;/li&gt;
&lt;li&gt;Collaborative workspaces help teams build together. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Solo builders and entrepreneurs testing product ideas. &lt;/li&gt;
&lt;li&gt;Designers and non-technical makers who want working apps. &lt;/li&gt;
&lt;li&gt;Small teams that want fast prototypes and MVPs. &lt;/li&gt;
&lt;li&gt;Developers who want both AI help and editable code. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://lovable.dev" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Now&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;v0 (by Vercel)&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxp1viyw8unxux3ji6vtr.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%2Fxp1viyw8unxux3ji6vtr.png" alt="v0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v0&lt;/strong&gt; is an AI-powered UI and frontend development tool by &lt;a href="//vercel.com"&gt;Vercel&lt;/a&gt;. It helps you turn natural language prompts into clean, production-ready frontend code, especially for &lt;strong&gt;React&lt;/strong&gt; and &lt;strong&gt;Next.js&lt;/strong&gt; projects.&lt;/p&gt;

&lt;p&gt;Instead of trying to generate an entire app end-to-end, v0 focuses on what it does best: design systems, UI components, layouts, and frontend logic. You describe what you want, and the v0 chat agent generates modern, editable code that fits perfectly into the Vercel ecosystem.&lt;/p&gt;

&lt;p&gt;It’s ideal for developers and designers who want to move fast on UI without sacrificing code quality.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Generate &lt;strong&gt;React&lt;/strong&gt; &amp;amp; &lt;strong&gt;Next.js&lt;/strong&gt; UI components from natural language prompts.&lt;/li&gt;
&lt;li&gt;Produces clean, readable, and exportable frontend code.&lt;/li&gt;
&lt;li&gt;Chat-based iteration to refine layouts, styles, and behavior.&lt;/li&gt;
&lt;li&gt;Built with modern tools like &lt;strong&gt;Tailwind CSS&lt;/strong&gt; and React best practices.&lt;/li&gt;
&lt;li&gt;GitHub sync for easy code ownership and collaboration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-click&lt;/strong&gt; deployment to Vercel.&lt;/li&gt;
&lt;li&gt;Starter templates and examples for faster setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrations
&lt;/h3&gt;

&lt;p&gt;v0 works seamlessly with the modern frontend stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: sync generated components to your repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt;: instant preview and production deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Figma&lt;/strong&gt;: supports design-to-code workflows for UI inspiration.&lt;/li&gt;
&lt;li&gt;Works alongside backend services (databases, APIs, auth) that you connect separately.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why People Like It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Excellent for quickly building polished UIs without starting from scratch.&lt;/li&gt;
&lt;li&gt;The generated code is clean and easy to customize.&lt;/li&gt;
&lt;li&gt;Fits naturally into existing React / Next.js projects.&lt;/li&gt;
&lt;li&gt;Great balance between AI assistance and developer control.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Perfect companion to Vercel’s frontend-first workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;h3&gt;
  
  
  Best For
&lt;/h3&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Frontend developers who want to speed up UI work.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Designers translating layouts into real React components.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Founders building landing pages, dashboards, or MVP frontends.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Teams using Next.js + Vercel who want fast iteration without low-code lock-in.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://v0.app" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Now&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://bolt.new/" rel="noopener noreferrer"&gt;Bolt.new&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnksublfm6q2xmqeikb6l.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%2Fnksublfm6q2xmqeikb6l.png" alt="Bolt.new"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bolt&lt;/strong&gt; is a powerful AI-driven full-stack coding platform that lets you build, edit, and deploy complete web applications right in your browser without setting up any local environment. You describe what you want in simple natural language and the AI helps create real code, including frontend, backend, and integrations, all the way to deployment. &lt;/p&gt;

&lt;p&gt;This makes it a great choice for developers and non-technical builders who want fast results and flexible code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Browser-based full-stack IDE with code editor, terminal, and live preview, no local installs needed. &lt;/li&gt;
&lt;li&gt;AI-powered app builder generates frontend, backend logic, and database code from natural language prompts. &lt;/li&gt;
&lt;li&gt;WebContainers technology runs Node.js and npm packages directly in the browser. &lt;/li&gt;
&lt;li&gt;Real-time collaboration for teams on shared projects. &lt;/li&gt;
&lt;li&gt;Framework flexibility with React, Next.js, Vue, Svelte, Astro and more. &lt;/li&gt;
&lt;li&gt;Manual editing and debugging available alongside AI generation. &lt;/li&gt;
&lt;li&gt;Instant deployment including hosting and custom domains. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrations
&lt;/h3&gt;

&lt;p&gt;Bolt.new connects with essential tools to power your projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; version control and repo sync.&lt;/li&gt;
&lt;li&gt;Database and auth services like &lt;strong&gt;Supabase&lt;/strong&gt;. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; for payment and commerce features. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Figma&lt;/strong&gt; design import and asset workflows. &lt;/li&gt;
&lt;li&gt;Integrated hosting, SEO tools, and analytics on paid plans. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why People Like It
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No environment setup everything runs in your browser. &lt;/li&gt;
&lt;li&gt;AI turns plain language ideas into working apps quickly. &lt;/li&gt;
&lt;li&gt;You can swap between chat-style commands and manual coding. &lt;/li&gt;
&lt;li&gt;Great for prototypes, MVPs, dashboards, and real products. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best For
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Solo developers launching prototypes and MVPs. &lt;/li&gt;
&lt;li&gt;Indie hackers and founders testing product ideas. &lt;/li&gt;
&lt;li&gt;Designers who want functional prototypes without deep coding. &lt;/li&gt;
&lt;li&gt;Small teams needing real-time collaboration. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://bolt.new" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Now&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  That's It.🙏
&lt;/h2&gt;

&lt;p&gt;Thank you for reading this far. If you find this article useful, please like and share this article. Someone could find it useful too.💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


 

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>AI Code Review Tools That Actually Work with Azure DevOps 🧪</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sat, 07 Feb 2026 15:31:59 +0000</pubDate>
      <link>https://forem.com/dev_kiran/ai-code-review-tools-that-actually-work-with-azure-devops-2gnj</link>
      <guid>https://forem.com/dev_kiran/ai-code-review-tools-that-actually-work-with-azure-devops-2gnj</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;If you’re using &lt;strong&gt;Azure DevOps&lt;/strong&gt;, you’ve probably noticed something:&lt;/p&gt;

&lt;p&gt;A lot of AI code review tools are clearly built with &lt;strong&gt;GitHub-first workflows&lt;/strong&gt; in mind. They may say they support Azure DevOps, but most of the documentation and community experiences focus on GitHub, and integration depth varies widely. Existing tooling often feels complex setups for multi-repo environments with strict governance requirements.&lt;/p&gt;

&lt;p&gt;I’ve spent time evaluating common AI review tools from the perspective of &lt;code&gt;large teams using Azure DevOps&lt;/code&gt;, what actually works day to day and what limitations you should be aware of.&lt;/p&gt;

&lt;p&gt;Let’s get started 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Azure DevOps Is a Bit Different
&lt;/h2&gt;

&lt;p&gt;Azure DevOps is popular in enterprise settings because it supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex pipelines and build workflows&lt;/li&gt;
&lt;li&gt;Fine-grained access control&lt;/li&gt;
&lt;li&gt;Large multi-repo environments&lt;/li&gt;
&lt;li&gt;On-prem and restricted deployment modes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most AI review tools today are optimized for GitHub workflows and may claim broad support, but real usage patterns show differences in integration quality, especially around pull request automation and deeper context awareness.&lt;/p&gt;

&lt;p&gt;In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Many tools operate at “diff-only” scope&lt;/li&gt;
&lt;li&gt;Few maintain persistent cross-repo understanding&lt;/li&gt;
&lt;li&gt;Enterprise deployment options (on-prem/air-gapped) are rare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those limitations are manageable for small teams but not for orgs with 100+ engineers and interconnected services.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Looked For in an AI Code Review Tool
&lt;/h2&gt;

&lt;p&gt;Before comparing tools, here’s what actually matters in real Azure DevOps workflows:&lt;/p&gt;

&lt;p&gt;✅ Native Azure DevOps integration&lt;/p&gt;

&lt;p&gt;Automated PR comments and checks without brittle mirroring hacks.&lt;/p&gt;

&lt;p&gt;✅ Context beyond the diff&lt;/p&gt;

&lt;p&gt;Understanding cross-repo dependencies, ticket history, and architectural implications.&lt;/p&gt;

&lt;p&gt;✅ Enterprise deployment options&lt;/p&gt;

&lt;p&gt;Ability to run in restricted environments with strong security controls.&lt;/p&gt;

&lt;p&gt;✅ Signal vs noise&lt;/p&gt;

&lt;p&gt;Suggestions should be actionable, not repeatedly nitpicky.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools I Compared
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sonarsource.com/products/sonarqube/" rel="noopener noreferrer"&gt;SonarQube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://devblogs.microsoft.com/devops/github-copilot-for-azure-devops-users/" rel="noopener noreferrer"&gt;GitHub Copilot Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://coderabbit.ai/" rel="noopener noreferrer"&gt;CodeRabbit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 What Is Qodo?
&lt;/h2&gt;

&lt;p&gt;Qodo (formerly Codium) is one of the more context-aware review tools I’ve come across. It integrates with multiple platforms including GitHub, GitLab, Bitbucket, and Azure DevOps and aims to infuse deeper system context into automated reviews rather than just surface diffs.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Does Differently
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🧠 Context-Aware Reviews
&lt;/h4&gt;

&lt;p&gt;Unlike tools that only inspect the changed lines, Qodo indexes the repository, relationships between files, and historical patterns to provide more meaningful review feedback.&lt;/p&gt;

&lt;p&gt;This makes it better suited to catch issues that are not obvious from the diff alone, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cross-file dependency risks&lt;/li&gt;
&lt;li&gt;Incomplete scope based on ticketing history&lt;/li&gt;
&lt;li&gt;Potential architectural regressions&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  🤖 Actionable Suggestions
&lt;/h4&gt;

&lt;p&gt;Qodo’s review feedback isn’t just a list of possible problems, it tries to reason about why an issue matters and how it relates to the rest of the code. That tends to make suggestions easier to trust and adopt.&lt;/p&gt;

&lt;h4&gt;
  
  
  🔐 Deployment Options
&lt;/h4&gt;

&lt;p&gt;Official tool documentation notes that Qodo supports integration across major version control systems, including Azure DevOps, making it fit into existing workflows in enterprise environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Qodo Fits Best
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Large teams with multi-repo architectures&lt;/li&gt;
&lt;li&gt;Teams that want more than line-by-line feedback&lt;/li&gt;
&lt;li&gt;Workflows where automated context-aware checks add real value&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 What Is SonarQube?
&lt;/h2&gt;

&lt;p&gt;SonarQube is a widely adopted static analysis and code quality platform that integrates with CI/CD systems including Azure DevOps. It provides detailed metrics on security, maintainability, test coverage, duplication, and compliance rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Does Well
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Static quality checks&lt;/li&gt;
&lt;li&gt;Security scanning based on rule sets&lt;/li&gt;
&lt;li&gt;Integration into build pipelines and quality gates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where It Is Limited
&lt;/h3&gt;

&lt;p&gt;SonarQube focuses on rule-based detection, not AI-driven review suggestions. It flags issues but usually doesn’t provide reasoning or deep context on how a change affects a system’s architecture.&lt;/p&gt;

&lt;p&gt;This doesn’t make it a bad tool, it’s just optimized for compliance and static analysis, not context-aware AI review.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 GitHub Copilot Review
&lt;/h2&gt;

&lt;p&gt;GitHub offers an AI review experience inside its platform that augments pull request feedback. It can summarize diffs and highlight potential issues within the PR’s visible files.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It’s Good At
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Inline code suggestions&lt;/li&gt;
&lt;li&gt;Diff-level issue highlighting&lt;/li&gt;
&lt;li&gt;Quick summaries inside GitHub PR UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What It’s Not Designed For
&lt;/h3&gt;

&lt;p&gt;System-wide or multi-repo reasoning, its context stays within the current repository and visible diff.&lt;/p&gt;

&lt;p&gt;Policy governance, merge gating, or enterprise deployment options&lt;/p&gt;

&lt;p&gt;Many teams using AI reviewers confirm that these tools often feel like enhanced linters, and that they don’t automatically scale to deeper architectural issues.&lt;/p&gt;

&lt;p&gt;Copilot is best thought of as an &lt;strong&gt;assistant during development&lt;/strong&gt;, not a dedicated AI reviewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 CodeRabbit
&lt;/h2&gt;

&lt;p&gt;CodeRabbit is an AI-assisted tool that automatically reviews pull requests and provides inline comments and summaries. It can be triggered automatically or manually within PRs.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Does Well
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fast PR summaries and inline comments&lt;/li&gt;
&lt;li&gt;Easy to adopt for GitHub workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where It Falls Short
&lt;/h3&gt;

&lt;p&gt;Focuses on diffs rather than broader repo context, documented in CodeRabbit’s own feature scope.&lt;/p&gt;

&lt;p&gt;Does not provide enterprise governance features like merge gating or compliance enforcement&lt;/p&gt;

&lt;p&gt;Independent community feedback reflects that CodeRabbit can provide useful review help for small or medium teams, but struggles with deeper codebase or architectural context.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Focus&lt;/th&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;th&gt;Limitation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Qodo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Context-aware reviews&lt;/td&gt;
&lt;td&gt;System-wide insights, multi-repo&lt;/td&gt;
&lt;td&gt;More setup than diff-only tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SonarQube&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Static analysis&lt;/td&gt;
&lt;td&gt;Compliance, quality metrics&lt;/td&gt;
&lt;td&gt;No AI review reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Copilot Review&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IDE-centric assistance&lt;/td&gt;
&lt;td&gt;Inline suggestions&lt;/td&gt;
&lt;td&gt;Limited to diff/visible files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CodeRabbit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PR summaries&lt;/td&gt;
&lt;td&gt;Quick simple feedback&lt;/td&gt;
&lt;td&gt;Lacks cross-repo reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  🏁 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;AI code review isn’t about replacing humans. It’s about catching what humans often miss in complex codebases.&lt;/p&gt;

&lt;p&gt;A frequent pain point discussed by developers is how most reviewers behave like traditional linters, surface-level comments with limited project context.&lt;/p&gt;

&lt;p&gt;For teams using Azure DevOps at an enterprise scale, the hard part is not generating suggestions, it’s understanding how those suggestions fit into a broader codebase, cross-repo patterns, and governance workflows.&lt;/p&gt;

&lt;p&gt;Among the tools compared here, &lt;strong&gt;Qodo best addresses that gap&lt;/strong&gt; with deeper context reasoning and integration across both PRs and enterprise workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  👨‍💻 TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Qodo&lt;/strong&gt; when you need context-aware reviews that look beyond the diff.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;SonarQube&lt;/strong&gt; for static analysis and quality compliance.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;GitHub Copilot Review&lt;/strong&gt; for quick inline suggestions.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;CodeRabbit&lt;/strong&gt; for lightweight PR summaries.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 As always, the right tool depends on your project size, workflow, and quality standards. 🫡&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Thank You!!🙏
&lt;/h2&gt;

&lt;p&gt;Thank you for reading this far. If you find this article useful, please like and share this article. Someone could find it useful too.💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


 

</description>
      <category>azure</category>
      <category>automation</category>
      <category>cicd</category>
    </item>
    <item>
      <title>🔥I Built an Awwwards-Style Portfolio Using Antigravity🌀</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sun, 01 Feb 2026 10:53:04 +0000</pubDate>
      <link>https://forem.com/dev_kiran/i-built-an-awwwards-style-portfolio-using-antigravity-49lk</link>
      <guid>https://forem.com/dev_kiran/i-built-an-awwwards-style-portfolio-using-antigravity-49lk</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;Hello! 👋&lt;/p&gt;

&lt;p&gt;I’m &lt;strong&gt;Kiran Naragund&lt;/strong&gt;, a full-stack developer, open-source contributor, and someone who genuinely enjoys building things on the web. I like turning ideas (even unclear or messy ones) into usable, meaningful software.&lt;/p&gt;

&lt;p&gt;This portfolio represents my journey so far: my education, professional experience, open-source work, projects, and the many experiments I’ve done while learning and growing as a developer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a long time, I wanted to build an &lt;strong&gt;Awwwards-style&lt;/strong&gt; portfolio. something cinematic, interactive, and animation-heavy but without using no-code tools like &lt;em&gt;Framer&lt;/em&gt;. I wanted to do it using the tech I actually work with every day. 🙃&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;More than a resume, I wanted this portfolio to tell &lt;strong&gt;my story&lt;/strong&gt;. My personality, my taste in design, my curiosity for animations, and my love for clean but expressive interfaces.&lt;/p&gt;

&lt;p&gt;That’s how this &lt;strong&gt;minimal yet cinematic portfolio&lt;/strong&gt; came to life. 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Portfolio
&lt;/h2&gt;

&lt;p&gt;Visit here: &lt;a href="https://kirannaragund.com" rel="noopener noreferrer"&gt;https://kirannaragund.com&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Note: Please view this on a desktop or laptop for the best experience. Some animations and interactions are designed specifically for larger screens. I promise it’s worth it 🙏&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;I built this portfolio using modern and familiar tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React.js&lt;/strong&gt; with &lt;strong&gt;Vite&lt;/strong&gt; for fast development and performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; for styling and theming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GSAP&lt;/strong&gt; and &lt;strong&gt;Framer Motion&lt;/strong&gt; for animations and page transitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lenis&lt;/strong&gt; for smooth scrolling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chart.js&lt;/strong&gt; for visualizing open-source activity.&lt;/li&gt;
&lt;li&gt;A few &lt;strong&gt;shadcn/ui&lt;/strong&gt; components.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Development Process
&lt;/h3&gt;

&lt;p&gt;I didn’t start this project with a perfect design. I started with experiments.&lt;/p&gt;

&lt;p&gt;I built the site section by section, testing animations, breaking layouts, removing things, and rebuilding again. This portfolio went through multiple redesigns before reaching its current state.&lt;/p&gt;

&lt;p&gt;All the content (experience, education, certifications, skills, open-source data) is managed through structured data files, making the site easy to update and scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design Decisions
&lt;/h3&gt;

&lt;p&gt;I made a few bold and slightly risky 😅 decisions while building this.&lt;/p&gt;

&lt;h4&gt;
  
  
  🎨 Themes (10 of them!)
&lt;/h4&gt;

&lt;p&gt;I don't wanted only light and Dark theme as many websites commonly offer this. So I decided to implement 10 different themes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Light, Dark, Purple, Ocean, Forest, Sunset, Rose, Midnight, Coffee, and Mint.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Each theme updates colors, SVGs, and UI elements consistently. My personal favorites are White and Rose 😍. Let me know in the comments which one you liked.&lt;/p&gt;

&lt;h4&gt;
  
  
  🧩 SVGs instead of images
&lt;/h4&gt;

&lt;p&gt;Because of the multiple themes, static images didn’t feel right.&lt;br&gt;
So I switched to &lt;strong&gt;custom SVGs&lt;/strong&gt; that adapt dynamically based on the active theme. This helped maintain visual consistency across all themes.&lt;/p&gt;
&lt;h4&gt;
  
  
  🫥 Hidden elements for better UX
&lt;/h4&gt;

&lt;p&gt;Some animations looked amazing on large screens but felt overwhelming or broken on smaller ones (like SVG motion paths in the &lt;em&gt;What I Do&lt;/em&gt; section).&lt;/p&gt;

&lt;p&gt;Instead of forcing them everywhere, I selectively hide elements to keep the experience clean and enjoyable.&lt;/p&gt;
&lt;h4&gt;
  
  
  🔀 Route-based page transitions
&lt;/h4&gt;

&lt;p&gt;Instead of traditional loaders, I added animated page transitions.&lt;br&gt;
Whenever you move between pages, you’ll see fun, route-specific messages appear briefly in the center of the screen.&lt;/p&gt;

&lt;p&gt;It’s a small detail, but it makes navigation feel playful and alive.😄&lt;/p&gt;
&lt;h4&gt;
  
  
  Open Source Section (Beyond the Green Graph)
&lt;/h4&gt;

&lt;p&gt;Most developer portfolios show the default GitHub contribution graph. I didn’t want to do that.&lt;/p&gt;

&lt;p&gt;Instead of just showing green squares, I wanted visitors to see my &lt;strong&gt;actual open-source work&lt;/strong&gt; in a clear and useful way. So I built a dedicated &lt;strong&gt;Open Source section&lt;/strong&gt; where people can easily explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Organizations I’ve contributed to&lt;/li&gt;
&lt;li&gt;Pull requests I’ve opened&lt;/li&gt;
&lt;li&gt;Issues I’ve worked on&lt;/li&gt;
&lt;li&gt;Contribution activity over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes my open-source work more transparent and easier to understand. Anyone visiting the site can quickly see what I contributed, where I contributed, and how active I am, without needing to jump around GitHub.&lt;/p&gt;

&lt;p&gt;For me, this felt more meaningful than a static activity graph.&lt;/p&gt;
&lt;h3&gt;
  
  
  What Google AI Tools Did I Use?
&lt;/h3&gt;
&lt;h4&gt;
  
  
  Antigravity IDE 🫡
&lt;/h4&gt;

&lt;p&gt;I used Antigravity IDE for most of the development.&lt;/p&gt;

&lt;p&gt;While building the site, I kept updating a &lt;code&gt;plan.md&lt;/code&gt; file where I wrote ideas, page structure, animation plans, and things I wanted to improve. This file changed many times as the project evolved.&lt;/p&gt;

&lt;p&gt;I often switched between different AI models inside the IDE, sometimes for planning, sometimes for refactoring code, and sometimes just to explore better ways to structure components or animations.&lt;/p&gt;
&lt;h4&gt;
  
  
  Gemini Nano Banana 📸
&lt;/h4&gt;

&lt;p&gt;I used Gemini Nano Banana to generate mockups for my projects sections.&lt;/p&gt;

&lt;p&gt;These both tools made the process smoother and helped me iterate faster.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I'm Most Proud Of
&lt;/h2&gt;



&lt;p&gt;Honestly, building this portfolio feels like a &lt;em&gt;dream come true&lt;/em&gt; for me.&lt;/p&gt;

&lt;p&gt;There was a time when I only imagined creating something like this. Now it’s live, and people can actually experience it. This project pushed me far outside my comfort zone and forced me to try things I had never done before.&lt;/p&gt;

&lt;p&gt;Some things I’m especially proud of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Learning and using &lt;strong&gt;GSAP&lt;/strong&gt; for complex SVG paths and timeline-based animations.&lt;/li&gt;
&lt;li&gt;Creating a custom &lt;strong&gt;Google-style loader animation&lt;/strong&gt; that introduces the site in a playful way.&lt;/li&gt;
&lt;li&gt;Adding route-based &lt;strong&gt;page transition animations&lt;/strong&gt; with different messages for each section.&lt;/li&gt;
&lt;li&gt;Building a &lt;strong&gt;custom animated cursor&lt;/strong&gt; for smoother interactions.&lt;/li&gt;
&lt;li&gt;Creating a &lt;strong&gt;fully theme-aware design system&lt;/strong&gt; with 10 different themes that work consistently across the site.&lt;/li&gt;
&lt;li&gt;Showcasing my &lt;strong&gt;open-source contributions using real data and charts&lt;/strong&gt;, instead of a basic GitHub graph.&lt;/li&gt;
&lt;li&gt;Making the site interactive and cinematic, without overwhelming the user.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This portfolio taught me patience. I experimented a lot, broke things often, and learned how small details can completely change how a product feels.&lt;/p&gt;

&lt;p&gt;It’s not perfect but it’s honest. It represents how I think, build, and learn. And that’s what makes it special to me. 🙃&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Made with love, hate, and too many revisions because perfection doesn’t arrive gracefully, it’s dragged out through frustration, stubbornness, and late-night bargaining with my laptop.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thanks for reading, and I’d love to hear your feedback! 🙌&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Have you seen your DEV Wrapped 2025 yet? 🎁</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Thu, 18 Dec 2025 04:53:57 +0000</pubDate>
      <link>https://forem.com/dev_kiran/have-you-seen-your-dev-wrapped-2025-yet-embed-ljk</link>
      <guid>https://forem.com/dev_kiran/have-you-seen-your-dev-wrapped-2025-yet-embed-ljk</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dev_kiran/dev-wrapped-2025-see-your-year-in-code-2aie" class="crayons-story__hidden-navigation-link"&gt;🎉 DEV Wrapped 2025 – See Your Year in Code!&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="/dev_kiran" 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%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dev_kiran" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Kiran Naragund
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Kiran Naragund
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-3107253" 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="/dev_kiran" 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%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Kiran Naragund&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/dev_kiran/dev-wrapped-2025-see-your-year-in-code-2aie" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 15 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/dev_kiran/dev-wrapped-2025-see-your-year-in-code-2aie" id="article-link-3107253"&gt;
          🎉 DEV Wrapped 2025 – See Your Year in Code!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/discuss"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;discuss&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devwrapped"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devwrapped&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;a class="crayons-tag  crayons-tag--monochrome " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&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/dev_kiran/dev-wrapped-2025-see-your-year-in-code-2aie" 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/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;175&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dev_kiran/dev-wrapped-2025-see-your-year-in-code-2aie#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              93&lt;span class="hidden s:inline"&gt; comments&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;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

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

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

&lt;/div&gt;




</description>
    </item>
    <item>
      <title>🎉 DEV Wrapped 2025 – See Your Year in Code!</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Mon, 15 Dec 2025 21:50:00 +0000</pubDate>
      <link>https://forem.com/dev_kiran/dev-wrapped-2025-see-your-year-in-code-2aie</link>
      <guid>https://forem.com/dev_kiran/dev-wrapped-2025-see-your-year-in-code-2aie</guid>
      <description>&lt;p&gt;Hey DEVs! 👋&lt;/p&gt;

&lt;p&gt;Finally, the wait is over and here is your &lt;strong&gt;DEV Wrapped 2025&lt;/strong&gt; 🎁&lt;/p&gt;

&lt;p&gt;Inspired by &lt;em&gt;Spotify Wrapped&lt;/em&gt;, DEV Wrapped turns your DEV activity into a personalized year-in-review, highlighting your top articles, most active months, favorite tags, and more!&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Made This
&lt;/h2&gt;

&lt;p&gt;At the end of the year, I wanted a simple and fun way to reflect on my DEV journey, the posts I wrote, the topics I loved, and how consistent I was.&lt;br&gt;
DEV is an amazing place to learn and share, and this project is my way of celebrating every win, whether big or small 💙&lt;/p&gt;
&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Visit &lt;a href="https://dev-wrapped.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;dev-wrapped.com&lt;/strong&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Enter your DEV username&lt;/li&gt;
&lt;li&gt;Instantly see your stats, top posts, and charts in story format.&lt;/li&gt;
&lt;li&gt;Share your results with friends!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s my DEV Wrapped summary 👇&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjvmd0eia8jfic0l5xo3o.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%2Fjvmd0eia8jfic0l5xo3o.png" alt="Kiran Naragund"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And my 2025 DEV profile overview 👇&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%2Fctx8grrhh2zgfs7wuvnf.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%2Fctx8grrhh2zgfs7wuvnf.png" alt="Kiran Naragund"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;DEV Wrapped uses only DEV Community’s &lt;strong&gt;public APIs&lt;/strong&gt; to fetch publicly available data.&lt;br&gt;
No authentication, passwords, or secret keys are required your data stays safe.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Check it out here: &lt;a href="https://dev-wrapped.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;dev-wrapped.com&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did you find your stats surprising? 😁&lt;/li&gt;
&lt;li&gt;Which music you liked? 😉&lt;/li&gt;
&lt;li&gt;Found a bug? Let me know!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📸 &lt;em&gt;&lt;strong&gt;Post a screenshot of your DEV Wrapped in the comments&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading 🙏&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;




</description>
      <category>devwrapped</category>
      <category>programming</category>
      <category>discuss</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🔥How I Automated Code Reliability with an AI Agent</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sun, 30 Nov 2025 10:24:05 +0000</pubDate>
      <link>https://forem.com/dev_kiran/how-i-automated-code-reliability-with-an-ai-agent-1kkb</link>
      <guid>https://forem.com/dev_kiran/how-i-automated-code-reliability-with-an-ai-agent-1kkb</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;As developers, we all know how much time goes into repetitive checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did we add proper error handling?&lt;/li&gt;
&lt;li&gt;Are our functions following naming rules?&lt;/li&gt;
&lt;li&gt;Did we write enough tests?&lt;/li&gt;
&lt;li&gt;Are there hidden logic mistakes?&lt;/li&gt;
&lt;li&gt;Is reliability getting better or worse?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tasks are important… but doing them manually for every commit or PR is exhausting and eats up time we would rather spend actually building features.&lt;/p&gt;

&lt;p&gt;So I asked myself:&lt;/p&gt;

&lt;p&gt;🤔 &lt;strong&gt;What if I could create an AI agent that does all of this automatically?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And that’s how the &lt;em&gt;Reliability Guardian Agent&lt;/em&gt; was born.&lt;/p&gt;

&lt;p&gt;In this article, I’ll walk you through building this AI agent step-by-step using &lt;a href="https://www.qodo.ai/features/qodo-cli/" rel="noopener noreferrer"&gt;Qodo Command&lt;/a&gt;, in the simplest way possible. By the end, you’ll have a powerful reliability reviewer that works &lt;em&gt;locally&lt;/em&gt; and inside &lt;em&gt;GitHub Actions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Let’s begin. 🚀&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 What is the &lt;em&gt;Reliability Guardian&lt;/em&gt;?
&lt;/h3&gt;

&lt;p&gt;The Reliability Guardian Agent automatically analyzes your codebase to evaluate and improve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code reliability&lt;/li&gt;
&lt;li&gt;Fault tolerance&lt;/li&gt;
&lt;li&gt;Input validation&lt;/li&gt;
&lt;li&gt;Test coverage&lt;/li&gt;
&lt;li&gt;Error handling&lt;/li&gt;
&lt;li&gt;Historical reliability trends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It uses both static analysis and behavior-style testing (like simulated mutation or fuzz testing) to find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Logic inconsistencies&lt;/li&gt;
&lt;li&gt;Weak or missing tests&lt;/li&gt;
&lt;li&gt;Missing input validations&lt;/li&gt;
&lt;li&gt;Unsafe or fragile code paths&lt;/li&gt;
&lt;li&gt;Reliability regressions in recent commits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This agent can be used both &lt;code&gt;locally&lt;/code&gt; and in automated &lt;code&gt;CI/CD workflows&lt;/code&gt;, And gives you a clean reliability score from &lt;strong&gt;0 to 10&lt;/strong&gt;, with actionable suggestions.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚙️ Installing Qodo Command
&lt;/h3&gt;

&lt;p&gt;We’ll use &lt;strong&gt;Qodo’s Agentic Quality Workflows CLI&lt;/strong&gt; to build and run the agent.&lt;/p&gt;

&lt;p&gt;Install it globally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g @qodo/command
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then log in:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qodo login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4we7kvazh16e1bueapn7.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%2F4we7kvazh16e1bueapn7.png" alt="Qodo Command"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once login is completed you'll receive an API key in the terminal.&lt;/p&gt;

&lt;p&gt;The API key is also saved locally in the &lt;code&gt;.qodo&lt;/code&gt; folder in your home dir, and can be reused (e.g., in CI).&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating the Reliability Guardian Agent
&lt;/h3&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Create the agent config&lt;/strong&gt;&lt;br&gt;
At your project root, create &lt;code&gt;reliable-guardian-agent.toml&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;This file tells Qodo everything about your agent i.e instructions, arguments, strategy, and output format.&lt;/p&gt;

&lt;p&gt;Now, paste the following configuration:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# Reliability Guardian Agent Configuration&lt;/span&gt;
&lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1.0"&lt;/span&gt;

&lt;span class="nn"&gt;[commands.reliability_guardian]&lt;/span&gt;
&lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Analyze and score project reliability by detecting logic conflicts, missing validations, weak tests, and historical reliability trends."&lt;/span&gt;

&lt;span class="py"&gt;instructions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"""
You are an expert reliability analyst agent. Your purpose is to evaluate the reliability of a software project by analyzing logic consistency, input validation completeness, and test suite robustness.
### Your mission:
1. **Analyze code for logic reliability**
   - Detect logical conflicts, contradictory conditions, or redundant branches
   - Identify missing input validation or unsafe operations (e.g., divide by zero, null dereference)
   - Recognize missing or ineffective exception handling
2. **Evaluate test robustness**
   - Perform mutation or fuzz testing to estimate how strong the existing tests are
   - Identify functions that lack test coverage or only test “happy paths”
3. **Compute a comprehensive reliability score**
   - Logic Consistency (30%)
   - Input Validation Coverage (30%)
   - Exception Safety (20%)
   - Test Effectiveness (20%)
   Provide an overall reliability score between 0–10.
4. **Detect reliability trends over time**
   - Use Git history to compare reliability results across recent commits or branches
   - Highlight improvement or regression in reliability score
5. **Suggest self-healing fixes**
   - Suggest specific code improvements such as adding missing validation, refactoring conflicting branches, or adding stronger test cases
   - Each fix suggestion should include a short code patch snippet where applicable
"""&lt;/span&gt;

&lt;span class="py"&gt;arguments&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"target_branch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;required&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Branch to compare against for diff and reliability trend"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"max_commits"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;required&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Number of past commits to analyze for historical reliability trends"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mutation_testing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"boolean"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;required&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;default&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="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Enable simulated mutation testing"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"fuzz_testing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"boolean"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;required&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;default&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="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Enable fuzz-style reliability probing"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;{&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"exclude_files"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;required&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Comma-separated list of files to exclude (e.g., test mocks or migrations)"&lt;/span&gt; &lt;span class="err"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="py"&gt;tools&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"qodo_merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"filesystem"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="py"&gt;execution_strategy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"act"&lt;/span&gt;

&lt;span class="py"&gt;output_schema&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"""
{
  "type": "object",
  "properties": {
    "summary": {
      "type": "object",
      "description": "High-level summary of reliability issues and test robustness",
      "properties": {
        "files_analyzed": { "type": "number", "description": "Total number of source files analyzed" },
        "functions_checked": { "type": "number", "description": "Number of functions analyzed for logic reliability" },
        "total_issues": { "type": "number", "description": "Total reliability issues detected" },
        "critical_issues": { "type": "number", "description": "Number of critical logic or reliability flaws" },
        "reliability_score": {
          "type": "object",
          "properties": {
            "overall": { "type": "number", "minimum": 0, "maximum": 10 },
            "logic_consistency": { "type": "number", "minimum": 0, "maximum": 10 },
            "validation_coverage": { "type": "number", "minimum": 0, "maximum": 10 },
            "exception_safety": { "type": "number", "minimum": 0, "maximum": 10 },
            "test_strength": { "type": "number", "minimum": 0, "maximum": 10 }
          },
          "required": ["overall", "logic_consistency", "validation_coverage", "exception_safety", "test_strength"]
        },
        "trend": {
          "type": "object",
          "description": "Reliability trend compared to past commits",
          "properties": {
            "previous_scores": { "type": "array", "items": { "type": "number" } },
            "improvement": { "type": "number", "description": "Positive if reliability improved, negative if regressed" },
            "best_commit": { "type": "string", "description": "Commit hash with highest reliability" },
            "worst_commit": { "type": "string", "description": "Commit hash with lowest reliability" }
          }
        }
      },
      "required": ["files_analyzed", "functions_checked", "total_issues", "reliability_score", "trend"]
    },
    "issues": {
      "type": "array",
      "description": "Detailed list of individual reliability issues",
      "items": {
        "type": "object",
        "properties": {
          "file": { "type": "string" },
          "line": { "type": "number" },
          "severity": { "type": "string", "enum": ["critical", "high", "medium", "low"] },
          "category": { "type": "string", "description": "logic_conflict | validation_gap | weak_test | exception_risk" },
          "description": { "type": "string" },
          "suggestion": { "type": "string" },
          "code_patch": { "type": "string", "description": "Example of an automated fix or patch suggestion" }
        },
        "required": ["file", "severity", "category", "description"]
      }
    },
    "suggestions": {
      "type": "array",
      "description": "High-level reliability improvement recommendations",
      "items": {
        "type": "object",
        "properties": {
          "area": { "type": "string", "description": "validation | error_handling | logic | testing" },
          "description": { "type": "string" },
          "example_patch": { "type": "string" }
        },
        "required": ["area", "description"]
      }
    },
    "approved": { "type": "boolean", "description": "Whether project meets reliability standards" },
    "requires_changes": { "type": "boolean", "description": "True if reliability score &amp;lt; 7.0 or critical issues found" }
  },
  "required": ["summary", "issues", "suggestions", "approved"]
}
"""&lt;/span&gt;

&lt;span class="py"&gt;exit_expression&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"approved"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The fields of the agent file are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th width="243.9375"&gt;Field name&lt;/th&gt;
&lt;th width="157.63671875"&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Description of what your agent does.&lt;br&gt;This field is required when an agent is run with &lt;code&gt;--mcp&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instructions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Required field.&lt;br&gt;Prompt for the AI models explailing the required behavior.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;arguments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;list of objects.&lt;br&gt;&lt;br&gt;Supported types: &lt;code&gt;'string' | 'number' | 'boolean' | 'array' | 'object'&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;List of possible arguments that can be given to the agent.&lt;/p&gt;
&lt;p&gt;The arguments will be translated and forwarded to MCP servers.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcpServers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;List of MCP servers used by the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;list&lt;/td&gt;
&lt;td&gt;List of MCP server names. Allows you to filter specific MCP servers that can be used by your agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;execution_strategy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"act" or "plan"&lt;/td&gt;
&lt;td&gt;Plan lets the agent think through a multi-step strategy, act executes actions immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;output_schema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Valid json of the wanted agent output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exit_expression&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string (&lt;a href="https://jsonpath.com/" rel="noopener noreferrer"&gt;JSONPath&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Only applicable when &lt;code&gt;output_schema&lt;/code&gt; is given.&lt;br&gt;For CI runs, a condition used to determine if the agent run succeeded or failed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our agent accepts the following parameters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;target_branch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;master&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Branch to compare for reliability diff and trend analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;max_commits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;number&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number of recent commits to analyze for reliability trends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mutation_testing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable simulated mutation testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fuzz_testing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enable simulated fuzz reliability probing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exclude_files&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Comma-separated list of files to exclude (e.g. mocks, generated code)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Run the agent locally&lt;/strong&gt;&lt;br&gt;
You can run this agent by passing optional arguments&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qodo reliability_guardian
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;With Advanced Configuration&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;# Compare with another branch&lt;/span&gt;
qodo reliability_guardian &lt;span class="nt"&gt;--target_branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;develop


&lt;span class="c"&gt;# Analyze last 10 commits for reliability trend&lt;/span&gt;
qodo reliability_guardian &lt;span class="nt"&gt;--max_commits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10


&lt;span class="c"&gt;# Run without mutation or fuzz simulation&lt;/span&gt;
qodo reliability_guardian &lt;span class="nt"&gt;--mutation_testing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="nt"&gt;--fuzz_testing&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The tool then analyzes your codebase and returns structured JSON output.&lt;/p&gt;

&lt;p&gt;3️⃣ &lt;strong&gt;Output Format&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent returns structured JSON output:&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;"summary"&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;"files_analyzed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"functions_checked"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_issues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"critical_issues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"reliability_score"&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;"overall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;3.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"logic_consistency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"validation_coverage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"exception_safety"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"test_strength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;3.0&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;"trend"&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;"previous_scores"&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="mf"&gt;2.2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"improvement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"best_commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"065f7c9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"worst_commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"be1abae"&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;"issues"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/payment.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"critical"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logic_conflict"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Premium users get worse discount (15%) when amount &amp;gt; 100 compared to base premium discount (20%). This is a business logic contradiction."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Invert the logic so higher amounts get better discounts (e.g., 25% for amount &amp;gt; 100, 20% otherwise)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if user_type == 'premium':&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    discount = 0.25 if amount &amp;gt; 100 else 0.20"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/calculator.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"critical"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exception_risk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"average() function will raise ZeroDivisionError when passed an empty list"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add validation to check for empty input before division"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if values is None or len(values) == 0:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    raise ValueError('values must be a non-empty sequence')"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/utils.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"critical"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exception_risk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"safe_get() catches all exceptions with 'except Exception', masking programming errors and making debugging difficult"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Only catch specific exceptions (KeyError, TypeError) to avoid hiding unrelated bugs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"except (KeyError, TypeError):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    return default"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/auth.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validation_gap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"authenticate_user() accepts any types without validation; no None/empty checks"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add type and empty string validation before authentication logic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if not isinstance(username, str) or not isinstance(password, str):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    return False&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;if not username or not password:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    return False"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/payment.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validation_gap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"calculate_discount() lacks input validation for user_type domain and amount (negative values, type checking)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add validation for user_type and amount before processing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if not isinstance(amount, (int, float)) or amount &amp;lt; 0:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    raise ValueError('amount must be a non-negative number')&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;if user_type not in ('premium', 'basic'):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    raise ValueError(f'invalid user_type: {user_type}')"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/calculator.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validation_gap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"average() lacks validation for non-numeric elements in the list"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add type checking for all elements before processing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if not all(isinstance(x, (int, float)) for x in values):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    raise TypeError('all values must be numeric')"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/calculator.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validation_gap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"add_safe() has misleading name suggesting validation, but performs no type enforcement; will concatenate strings or raise TypeError with None"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Either add type validation or rename function to reflect actual behavior"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tests/test_auth.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"weak_test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test_auth_admin expects authenticate_user('admin','123') to return True, but actual implementation requires password 'secret'. Test is failing."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fix test to match actual implementation or fix implementation to match test contract"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"def test_auth_success():&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    assert authenticate_user('admin', 'secret') is True"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tests/test_auth.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"weak_test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"test_email_valid only tests happy path; missing tests for invalid emails, None, empty strings"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add negative test cases for malformed emails"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"def test_email_invalid_cases():&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    assert not validate_email('')&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    assert not validate_email('invalid')&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    assert not validate_email('a@b.')&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    assert not validate_email('@example.com')"&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;"suggestions"&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;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"logic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Fix payment discount logic contradiction where premium users get worse discount for higher amounts. Invert the condition so amount &amp;gt; 100 gets 25% discount instead of 15%."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"example_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if user_type == 'premium':&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    discount = 0.25 if amount &amp;gt; 100 else 0.20&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;else:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    discount = 0.10"&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;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add comprehensive input validation across all functions: type checking, None checks, empty collection checks, domain validation for enums, and range validation for numeric inputs."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"example_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"if not isinstance(amount, (int, float)) or amount &amp;lt; 0:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    raise ValueError('amount must be a non-negative number')&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;if user_type not in ('premium', 'basic'):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    raise ValueError(f'invalid user_type: {user_type}')"&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;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error_handling"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Replace broad 'except Exception' clauses with specific exception types to avoid masking programming errors. Only catch expected exceptions like KeyError, TypeError, ValueError."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"example_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"try:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    return d[key]&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;except (KeyError, TypeError):&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    return default"&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;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"validation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Strengthen email validation to reject malformed patterns like 'a@b.', '@example.com', 'a@@b.com'. Implement proper parsing with split and validation of local/domain parts."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"example_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"local, domain = email.split('@', 1)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;if not local or '.' not in domain:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    return False&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;label, tld = domain.rsplit('.', 1)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;return bool(label) and len(tld) &amp;gt;= 2"&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;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"testing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Expand test coverage to include edge cases and negative tests: empty inputs, None values, type errors, boundary conditions, and invalid domain values. Fix failing test in test_auth_admin."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"example_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"def test_auth_failures():&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    assert authenticate_user('admin', 'wrong') is False&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    assert authenticate_user('', 'secret') is False&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;    assert authenticate_user(None, 'secret') is False"&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;"area"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"testing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Implement mutation testing to measure test effectiveness. Current tests likely have weak mutation kill rate due to minimal assertions and lack of negative tests."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"example_patch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"# Run mutation testing with mutmut:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;# mutmut run --paths-to-mutate=src/&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;# Expected improvement: mutation score from ~30% to &amp;gt;80% after adding edge case tests"&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;"approved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requires_changes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;This gives a fast, automated overview of what needs to be fixed.&lt;/p&gt;
&lt;h3&gt;
  
  
  🤖 Add Reliability Guardian to GitHub Actions
&lt;/h3&gt;

&lt;p&gt;Now, The most common way to use this agent is through GitHub Actions to automatically review all your pull requests(PRs).&lt;/p&gt;

&lt;p&gt;Let's create a &lt;code&gt;github-action&lt;/code&gt; file for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Actions&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Reliability Guardian Agent&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="nv"&gt;develop&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;reliability-guardian&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;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&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="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&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;Run Reliability Guardian Agent&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;qodo-ai/command@v1&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;QODO_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.QODO_API_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&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;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;reliability_guardian&lt;/span&gt;
          &lt;span class="na"&gt;agent-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path/to/agent.toml&lt;/span&gt;
          &lt;span class="na"&gt;key-value-pairs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;target_branch=${{ github.base_ref }}&lt;/span&gt;
            &lt;span class="s"&gt;max_commits=5&lt;/span&gt;
            &lt;span class="s"&gt;mutation_testing=true&lt;/span&gt;
            &lt;span class="s"&gt;fuzz_testing=true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now every PR gets an automatic reliability review.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No manual review overhead.&lt;/li&gt;
&lt;li&gt;No missed edge cases.&lt;/li&gt;
&lt;li&gt;No surprise runtime failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🎯 Why This Agent Saves Developers Massive Time
&lt;/h3&gt;

&lt;p&gt;✅ &lt;strong&gt;Faster reviews&lt;/strong&gt;: No more waiting on teammates for basic reliability checks.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;More consistent code&lt;/strong&gt;: Same rules applied to every PR.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;More secure and stable builds&lt;/strong&gt;: Many reliability issues are caught before merging.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Developer time saved&lt;/strong&gt;: Developers focus on building features, not repetitive reviewing.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Customizable for any project&lt;/strong&gt;: You can tune the rules, weights, and checks easily.&lt;/p&gt;
&lt;h3&gt;
  
  
  🎉 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.qodo.ai/features/qodo-cli/" rel="noopener noreferrer"&gt;Qodo’s Agentic Quality Workflow&lt;/a&gt; is more than a CLI, it’s a new way of bringing intelligent automation into engineering teams.&lt;/p&gt;

&lt;p&gt;The Reliability Guardian Agent is just one example of what you can build.&lt;br&gt;
You can also create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance auditors&lt;/li&gt;
&lt;li&gt;Security checkers&lt;/li&gt;
&lt;li&gt;Test writers&lt;/li&gt;
&lt;li&gt;Documentation reviewers&lt;/li&gt;
&lt;li&gt;Code refactoring assistants&lt;/li&gt;
&lt;li&gt;And fully custom agents for your team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All using one simple, flexible agent file.&lt;/p&gt;

&lt;p&gt;The cool thing is you can build your own agents according to your project specifications.😉&lt;/p&gt;

&lt;p&gt;You can visit the &lt;a href="https://github.com/qodo-ai/agents" rel="noopener noreferrer"&gt;agent repository&lt;/a&gt; which contains agents implementations examples.&lt;/p&gt;
&lt;h3&gt;
  
  
  Thank You!!🙏
&lt;/h3&gt;

&lt;p&gt;Thank you for reading this far. If you find this article useful, please like and share this article. Someone could find it useful too.💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>5 Tools You Should Try Now🧙‍♂️🫵</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Mon, 24 Nov 2025 15:32:01 +0000</pubDate>
      <link>https://forem.com/dev_kiran/5-tools-you-should-try-now-212j</link>
      <guid>https://forem.com/dev_kiran/5-tools-you-should-try-now-212j</guid>
      <description>&lt;p&gt;Hello Devs👋&lt;/p&gt;

&lt;p&gt;In this rapidly evolving tech world, there are lots of dev tools getting launched every day. These tools have become increasingly popular for their flexibility, productivity, community support, and cost-effectiveness.&lt;/p&gt;

&lt;p&gt;In this article I will be sharing some amazing tools which can quickly help enhance productivity, efficiency, and the overall quality of your work.&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%2Fu4iaso0w8m5rphyr8g10.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%2Fu4iaso0w8m5rphyr8g10.png" alt="Kiran Naragund"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's get started 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://qodo.ai" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; - AI Code Review Platform for the Enterprise SDLC
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlhirtn8yx1pb7sn3vkm.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%2Fvlhirtn8yx1pb7sn3vkm.png" alt="Qodo"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qodo.ai" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; is the AI Code Review Platform that gives engineering organizations a dedicated quality layer across the entire software development lifecycle(SDLC).&lt;/p&gt;

&lt;p&gt;It goes beyond code generation and simple linting, Qodo brings deep context intelligence, agentic automation, and continuous review to ensure code quality, maintainability, and compliance at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Qodo Delivers?
&lt;/h3&gt;

&lt;p&gt;🔹 &lt;strong&gt;Code Analysis&lt;/strong&gt;: Comprehensive, context-rich analysis reports that highlight structural issues, risks, and opportunities for improvement across the codebase.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Code Improvement Recommendations&lt;/strong&gt;: Agentic code suggestions that identify bugs, security gaps, and maintainability issues, paired with best-practice solutions.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Code Explanation&lt;/strong&gt;: Clear, technically grounded explanations of what the code does and how it behaves, enabling deeper understanding for developers and reviewers.&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Test Suite Generation&lt;/strong&gt;: Context-aware test cases that improve coverage, ensure correctness, and validate behavior across critical scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported Languages
&lt;/h3&gt;

&lt;p&gt;Qodo provides deep review capabilities across a broad set of languages, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;C++&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;PHP
…and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.qodo.ai/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;✅Try out Qodo&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://penpot.app" rel="noopener noreferrer"&gt;Penpot&lt;/a&gt; - The Design Tool for Design &amp;amp; Code Collaboration
&lt;/h2&gt;

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

&lt;p&gt;Penpot is an &lt;strong&gt;open-source&lt;/strong&gt; design and prototyping platform that allows you and your teams to create, collaborate on, and share design assets and prototypes. It provides a web-based interface for designing UI/UX components, creating interactive prototypes, and generating design specifications.&lt;/p&gt;

&lt;p&gt;👇Here are some key features of Penpot:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Design Tool:&lt;/strong&gt; Create and customize UI/UX designs.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Prototyping:&lt;/strong&gt; Build interactive prototypes with transitions and animations.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Collaboration:&lt;/strong&gt; Collaborate with team members in real-time.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Design System:&lt;/strong&gt; Manage design assets and create reusable components.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Open-Source:&lt;/strong&gt; Fully open-source and community-driven.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Which one is better &lt;strong&gt;Figma vs Penpot&lt;/strong&gt;?? Comment your thoughts.⬇️&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✨Penpot repository has &lt;strong&gt;41k+&lt;/strong&gt; stars on GitHub&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/penpot/penpot" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Out Penpot&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://chartdb.io/" rel="noopener noreferrer"&gt;ChartDB&lt;/a&gt; - Visualize Your Database
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fseecb8tmgyn126xv5xwq.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%2Fseecb8tmgyn126xv5xwq.png" alt="ChartDB"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ChartDB simplifies database management by offering an intuitive way to create, manage, and visualize your database schema. It’s especially useful for teams working on complex projects that require clear database architecture.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Key Features of ChartDB:&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;📊 &lt;strong&gt;Schema Visualization&lt;/strong&gt;: Generate clear and interactive diagrams of your database structure.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Multi-Database Support&lt;/strong&gt;: Works with popular databases like PostgreSQL, MySQL, and more.&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Query Builder&lt;/strong&gt;: Write, test, and optimize SQL queries without leaving the platform.&lt;/p&gt;

&lt;p&gt;🤝 &lt;strong&gt;Team Collaboration&lt;/strong&gt;: Share schema diagrams and query results with team members for better communication.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://chartdb.io/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Out ChartDB&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://aimlapi.com/" rel="noopener noreferrer"&gt;AI/ML API&lt;/a&gt; - Integrate 300+ AI models through a single API
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce4bjh4275wi059bew73.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%2Fce4bjh4275wi059bew73.png" alt="AI/ML API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever wanted to include AI capabilities in your project?🤔 Now, AI/ML API makes it more easier. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://aimlapi.com/" rel="noopener noreferrer"&gt;AI/ML API&lt;/a&gt;is a game-changing platform for developers and SaaS entrepreneurs looking to integrate cutting-edge AI capabilities into their products through a single API🤯&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AIML API platform offers you access to a wide range of AI models, enabling you to easily integrate sophisticated AI functionalities into your application. It supports a wide range of AI technologies, including &lt;strong&gt;image generation&lt;/strong&gt;, &lt;strong&gt;video analysis&lt;/strong&gt;, &lt;strong&gt;chatbots&lt;/strong&gt;, and more, providing tools for both beginners and experienced developers looking to leverage AI in their projects.&lt;/p&gt;

&lt;p&gt;📢&lt;u&gt;Here are some of the key features of AI/ML API&lt;/u&gt;👇&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Easy Integration&lt;/strong&gt;: Simplified API for seamless incorporation into applications.&lt;/p&gt;

&lt;p&gt;⚡ &lt;strong&gt;Fast Performance:&lt;/strong&gt; 3x faster performance compared to traditional methods.&lt;/p&gt;

&lt;p&gt;🔒 &lt;strong&gt;Security&lt;/strong&gt;: Ensures the safety and privacy of user data and applications.&lt;/p&gt;

&lt;p&gt;🌍 &lt;strong&gt;Accessibility:&lt;/strong&gt; Available 24/7, allowing for global access and use at any time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aimlapi.com/" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Out AI/ML API&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;a href="https://posthog.com/" rel="noopener noreferrer"&gt;PostHog&lt;/a&gt; - The Open-Source Product Analytics Suite
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnelzrtk2y84g9dqdpzp.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%2Fqnelzrtk2y84g9dqdpzp.png" alt="PostHog"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PostHog is an &lt;em&gt;open-source&lt;/em&gt; product analytics platform that helps you understand how users interact with your apps. It brings analytics, feature flags, A/B testing, session replays, and event pipelines, all into a single unified toolkit.&lt;/p&gt;

&lt;p&gt;If you're building a product and want full visibility into user behavior without sending data to third-party clouds, PostHog is a must-try.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Developers Love PostHog?
&lt;/h3&gt;

&lt;p&gt;📊 &lt;strong&gt;Product Analytics&lt;/strong&gt;: Track user events, funnels, retention, and trends—fully self-hosted or cloud-hosted.&lt;/p&gt;

&lt;p&gt;🎥 &lt;strong&gt;Session Replay&lt;/strong&gt;: Watch how users interact with your app to spot UX issues instantly.&lt;/p&gt;

&lt;p&gt;🚩 &lt;strong&gt;Feature Flags&lt;/strong&gt;: Roll out features gradually, run experiments, and target specific user segments.&lt;/p&gt;

&lt;p&gt;🧪 &lt;strong&gt;A/B Testing&lt;/strong&gt;: Test variations of features or UI changes and measure impact with statistically sound results.&lt;/p&gt;

&lt;p&gt;🔄 &lt;strong&gt;Event Pipelines&lt;/strong&gt;: Ingest, transform, and route events to tools like BigQuery, Snowflake, or your data warehouse.&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;Open Source + Self-Host&lt;/strong&gt;: Full control over data privacy, perfect for enterprise and compliance-driven teams.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://posthog.com" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Try Out PostHog&lt;/a&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  That's It.🙏
&lt;/h2&gt;

&lt;p&gt;Thank you for reading this far. If you find this article useful, please like and share this article. Someone could find it useful too.💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


 

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🚀 Build Custom AI Agents with Qodo Command</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Thu, 30 Oct 2025 17:37:55 +0000</pubDate>
      <link>https://forem.com/dev_kiran/build-custom-ai-agents-with-qodo-command-2j6d</link>
      <guid>https://forem.com/dev_kiran/build-custom-ai-agents-with-qodo-command-2j6d</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;I recently tried &lt;a href="https://www.qodo.ai/products/qodo-command/" rel="noopener noreferrer"&gt;Qodo Command&lt;/a&gt;, a CLI that lets you build, run, and automate AI-powered agents right from your repository like a custom AI assistants that live in your codebase.✨&lt;/p&gt;

&lt;p&gt;Unlike generic AI tools or one-off scripts, Qodo agents are configurable, versionable, and CI-friendly. You describe what the agent should do (in a &lt;code&gt;TOML/YAML&lt;/code&gt; file), and it runs that behavior consistently across local dev, PR checks, and CI pipelines. That means smarter automation for code review, reliability checks, documentation audits, test generation whatever your team needs.&lt;/p&gt;

&lt;p&gt;If you’ve ever wished for an assistant that enforces your project’s specific standards (not someone else’s), Qodo Command makes it possible.🫡&lt;/p&gt;

&lt;p&gt;In this article I’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What Qodo Command actually does?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Why it’s useful for dev teams and CI/CD workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to use it step-by-step&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A hands-on example: building a &lt;code&gt;Clean Code Description&lt;/code&gt; agent that ensures your codebase remains clean, readable, and well-documented by reviewing docstrings, comments, and naming conventions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s dive in. 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Qodo Command?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.qodo.ai/qodo-documentation/qodo-command" rel="noopener noreferrer"&gt;Qodo Command&lt;/a&gt; is a developer-first CLI that lets you create and run custom AI agents inside your development workflow.&lt;/p&gt;

&lt;p&gt;Think of it as your personal automation engine powered by AI but instead of generic prompts, you define repeatable rules, logic, and behaviors for the agent in a config file.&lt;/p&gt;

&lt;p&gt;Qodo Command supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom agent configuration&lt;/li&gt;
&lt;li&gt;CI and automation integration&lt;/li&gt;
&lt;li&gt;Interactive web UI mode&lt;/li&gt;
&lt;li&gt;General code generation&lt;/li&gt;
&lt;li&gt;Intelligent PR code review&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If &lt;a href="https://chatgpt.com/" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt; is a smart assistant you talk to, then Qodo Command is an AI teammate that lives in your repo and enforces your standards.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ⭐️ Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interactive Chat Mode&lt;/strong&gt;: Talk to an agent in natural language directly in your terminal (qodo chat), exactly like with Qodo Gen Chat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom Agent Commands&lt;/strong&gt;: Configure your own agent and define reusable workflows (&lt;code&gt;qodo &amp;lt;command&amp;gt;&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interactive Web UI mode&lt;/strong&gt;: Run Qodo Command with &lt;code&gt;--ui&lt;/code&gt; to interact with Qodo Command's chat in an interactive web UI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Serve Agents as HTTP APIs&lt;/strong&gt;: Turn any agent into a callable service (&lt;code&gt;--webhook mode&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model Control&lt;/strong&gt;: Choose which AI model to use (Claude, GPT-4, etc.) with &lt;code&gt;--model={model-name}&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agent to MCP&lt;/strong&gt;: Turn any agent into an MCP with &lt;code&gt;--mcp&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Secure Integration&lt;/strong&gt;: Use tools without exposing your API keys.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 How to Install &amp;amp; Use Qodo Command
&lt;/h2&gt;

&lt;p&gt;Now that you know what Qodo Command is, let's get it running.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g @qodo/command
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;To start using Qodo Command, you need to log in first:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qodo login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4we7kvazh16e1bueapn7.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%2F4we7kvazh16e1bueapn7.png" alt="Qodo Command"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once login is completed you'll receive an API key in the terminal.&lt;/p&gt;

&lt;p&gt;The API key is also saved locally in the .qodo folder in your home dir, and can be reused (e.g., in CI).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive AI Chat Mode
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qodo chat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;In this mode you can send prompts such as:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write tests for the files in the auth directory

Add better logging througout my project

Use Qodo Merge to describe the changes in my working folder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And Qodo Command will follow your guidelines.&lt;/p&gt;
&lt;h2&gt;
  
  
  🛠️ Build a Custom Qodo Agent From Scratch
&lt;/h2&gt;

&lt;p&gt;Now, Let’s create a Clean Code Documentation agent, an agent that reviews your repo for:&lt;/p&gt;

&lt;p&gt;✔️ Missing docstrings&lt;br&gt;
✔️ Outdated or misleading comments&lt;br&gt;
✔️ Poor naming issues&lt;br&gt;
✔️ Documentation consistency&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;strong&gt;Create the agent config&lt;/strong&gt;&lt;br&gt;
At your project's root directory level, create a file called &lt;code&gt;clean-doc-agent.toml&lt;/code&gt;. This file will hold all agent files that Qodo Command will know and be able to call.&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="c1"&gt;# Clean Code Description Agent Configuration&lt;/span&gt;
&lt;span class="s"&gt;version = "1.0"&lt;/span&gt;

&lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;commands.clean_code_description&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="s"&gt;description = "Analyze code for clean, consistent, and accurate descriptions in docstrings, comments, and naming conventions"&lt;/span&gt;

&lt;span class="s"&gt;instructions = """&lt;/span&gt;
&lt;span class="na"&gt;You are an expert in code documentation and clean code practices. Your task is to&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="s"&gt;1. Analyze code changes using Qodo Merge to identify documentation issues&lt;/span&gt;
&lt;span class="na"&gt;2. Focus on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Missing or incomplete docstrings&lt;/span&gt;
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Outdated or incorrect docstrings/comments&lt;/span&gt;
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Redundant or low-value comments&lt;/span&gt;
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Inconsistent documentation styles&lt;/span&gt;
   &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Poorly named functions, classes, or variables&lt;/span&gt;
&lt;span class="na"&gt;3. Categorize findings by severity&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Critical, High, Medium, Low&lt;/span&gt;
&lt;span class="s"&gt;4. Provide clear, actionable feedback for each issue&lt;/span&gt;
&lt;span class="s"&gt;5. Suggest improvements with concrete examples&lt;/span&gt;
&lt;span class="s"&gt;6. Ensure that the documentation aligns with the actual behavior of the code&lt;/span&gt;
&lt;span class="s"&gt;Return feedback that helps developers maintain a clean, readable, and maintainable codebase.&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="s"&gt;arguments&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"target_branch", type = "string", required = &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt;, default = "main", description = "Branch to compare changes against" },&lt;/span&gt;
    &lt;span class="s"&gt;{ name = "severity_threshold", type = "string", required = &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt;, default = "medium", description = "Minimum severity level to report (low, medium, high, critical)" },&lt;/span&gt;
    &lt;span class="s"&gt;{ name = "include_suggestions", type = "boolean", required = &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt;, default = &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt;, description = "Include improvement suggestions" },&lt;/span&gt;
    &lt;span class="s"&gt;{ name = "focus_areas", type = "string", required = &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt;, description = "Comma-separated focus areas (docstrings, comments, naming)" },&lt;/span&gt;
    &lt;span class="s"&gt;{ name = "exclude_files", type = "string", required = &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt;, description = "Comma-separated list of file patterns to exclude from analysis" }&lt;/span&gt;
&lt;span class="err"&gt;]&lt;/span&gt;

&lt;span class="s"&gt;tools = ["qodo_merge", "git", "filesystem"]&lt;/span&gt;
&lt;span class="s"&gt;execution_strategy = "act"&lt;/span&gt;

&lt;span class="s"&gt;output_schema = """&lt;/span&gt;
&lt;span class="pi"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;summary"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;High-level&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;summary&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;documentation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;naming&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;quality&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;found"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_issues"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;identified"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;critical_issues"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;categorized&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;as&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;critical"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high_issues"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;severity&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium_issues"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;medium&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;severity&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low_issues"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;low&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;severity&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;missing_docstrings"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;functions/classes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;missing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;docstrings"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outdated_descriptions"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;outdated&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;incorrect&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;docstrings/comments"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redundant_comments"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unnecessary&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;low-value&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;comments"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;poor_names"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;functions,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;classes,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;variables&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;unclear&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;inconsistent&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;names"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;files_reviewed"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;files&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;analyzed"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;overall_score"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimum"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maximum"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;10&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Overall&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;documentation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;quality&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(0-10)"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;},&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_issues"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;critical_issues"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high_issues"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium_issues"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low_issues"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;missing_docstrings"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outdated_descriptions"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;redundant_comments"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;poor_names"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;files_reviewed"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;overall_score"&lt;/span&gt;
      &lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="pi"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;issues"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;array"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Detailed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;list&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;individual&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issues&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;identified&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;codebase"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;file&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;containing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issue"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;line"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;number"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Line&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;number&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;where&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issue&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;occurs"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;severity"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enum"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;critical"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;medium"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;low"&lt;/span&gt;&lt;span class="pi"&gt;],&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Severity&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;level&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issue"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Category&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issue&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(e.g.,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;docstring,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;comment,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;naming)"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Short&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;summarizing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;issue"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Detailed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;explanation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;problem"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;suggestion"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Suggested&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fix&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;improvement"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;code_example"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Example&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;improved&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;corrected&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
        &lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;severity"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="pi"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;suggestions"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;array"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;List&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;broader&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;improvement&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;suggestions&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cleanliness&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;documentation"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;properties"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;File&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;path&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;suggestion"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Type&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;suggestion&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(e.g.,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;naming,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;docstring,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;structure)"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Description&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;suggested&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;improvement"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
          &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;implementation"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Recommended&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;way&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;apply&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;suggestion"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
        &lt;span class="pi"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="pi"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;approved"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;boolean"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Indicates&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;if&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;meets&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cleanliness&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;standards"&lt;/span&gt;&lt;span class="pi"&gt;},&lt;/span&gt;
    &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requires_changes"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;boolean"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Indicates&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;if&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;changes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;are&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;before&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;approval"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="pi"&gt;},&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;summary"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;issues"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;approved"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requires_changes"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="pi"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="s"&gt;exit_expression&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;"approved"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The fields of the agent file are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;&lt;tr&gt;
&lt;th width="243.9375"&gt;Field name&lt;/th&gt;
&lt;th width="157.63671875"&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Description of what your agent does.&lt;br&gt;This field is required when an agent is run with &lt;code&gt;--mcp&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;instructions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Required field.&lt;br&gt;Prompt for the AI models explailing the required behavior.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;arguments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;list of objects.&lt;br&gt;&lt;br&gt;Supported types: &lt;code&gt;'string' | 'number' | 'boolean' | 'array' | 'object'&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;List of possible arguments that can be given to the agent.&lt;/p&gt;
&lt;p&gt;The arguments will be translated and forwarded to MCP servers.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mcpServers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;List of MCP servers used by the agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;list&lt;/td&gt;
&lt;td&gt;List of MCP server names. Allows you to filter specific MCP servers that can be used by your agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;execution_strategy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"act" or "plan"&lt;/td&gt;
&lt;td&gt;Plan lets the agent think through a multi-step strategy, act executes actions immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;output_schema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;Valid json of the wanted agent output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exit_expression&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string (&lt;a href="https://jsonpath.com/" rel="noopener noreferrer"&gt;JSONPath&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Only applicable when &lt;code&gt;output_schema&lt;/code&gt; is given.&lt;br&gt;For CI runs, a condition used to determine if the agent run succeeded or failed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our agent accepts the following parameters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;target_branch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"main"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Branch to compare changes against&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;severity_threshold&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;"medium"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Minimum severity to report (low/medium/high/critical)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include_suggestions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Include improvement suggestions in output&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;focus_areas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Comma-separated list of areas to review (docstrings, comments, naming)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;exclude_files&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;File patterns to exclude from analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Run the agent locally&lt;/strong&gt;&lt;br&gt;
You can run this agent by passing optional arguments&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Run the agent to review code documentation
qodo clean_code_description

# Compare current changes against the main branch
qodo clean_code_description --target_branch=main

# Focus only on docstrings and naming issues
qodo clean_code_description --focus_areas=docstrings,naming
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;With Advanced Configuration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qodo clean_code_description \
  --target_branch=develop \
  --severity_threshold=medium \
  --focus_areas=docstrings,comments,naming \
  --exclude_files="tests/*,*.md" \
  --include_suggestions=true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;3️⃣ &lt;strong&gt;Output Format&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The agent returns structured JSON output:&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;"summary"&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;"total_issues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"critical_issues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"high_issues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"medium_issues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"low_issues"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"files_reviewed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"overall_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;7.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"missing_docstrings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outdated_descriptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"redundant_comments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"poor_names"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&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;"issues"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/utils/formatter.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docstring"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Missing function docstring"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The function `format_name` lacks a docstring, making its behavior unclear."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggestion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Add a concise docstring describing the purpose and parameters."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"code_example"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"\"\"&lt;/span&gt;&lt;span class="s2"&gt;Format the input name by capitalizing each word.&lt;/span&gt;&lt;span class="se"&gt;\"\"\"&lt;/span&gt;&lt;span class="s2"&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;"suggestions"&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;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/models/user.py"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"naming"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rename variable `usrObj` to `user` for clarity"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"implementation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Use descriptive names that reflect purpose instead of type"&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;"approved"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requires_changes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;Here is the full demo video 👇&lt;/p&gt;

&lt;p&gt;

&lt;iframe src="https://player.vimeo.com/video/1126563092" width="710" height="399"&gt;
&lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;Now, The most common way to use this agent is through GitHub Actions to automatically review pull requests.&lt;/p&gt;

&lt;p&gt;Let's create a &lt;code&gt;github-action&lt;/code&gt; file for it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Actions&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="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Clean Code Description Agent&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="nv"&gt;develop&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;clean-code&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;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;pull-requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;
      &lt;span class="na"&gt;checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Checkout repository&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="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&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;Run Clean Code Description Agent&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;qodo-ai/command@v1&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;QODO_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.QODO_API_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&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;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;clean_code_description&lt;/span&gt;
          &lt;span class="na"&gt;agent-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;path/to/agent.toml&lt;/span&gt;
          &lt;span class="na"&gt;key-value-pairs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;target_branch=${{ github.base_ref }}&lt;/span&gt;
            &lt;span class="s"&gt;focus_areas=docstrings,comments,naming&lt;/span&gt;
            &lt;span class="s"&gt;severity_threshold=medium&lt;/span&gt;
            &lt;span class="s"&gt;include_suggestions=true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now every PR gets auto-reviewed by the agent ✅&lt;/p&gt;
&lt;h3&gt;
  
  
  🎯 Final Thoughts
&lt;/h3&gt;

&lt;p&gt;Qodo Command is more than a CLI tool, it’s a new way to bring AI into engineering workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;👨‍💻 Runs locally like a dev tool&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🛠 Acts inside CI/CD like a teammate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Enforces your own engineering rules&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🧠 Fully customizable AI agents (no servers needed)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this setup, your repo has a Documentation Guardian watching every PR.&lt;/p&gt;

&lt;p&gt;You can visit the &lt;a href="https://github.com/qodo-ai/agents" rel="noopener noreferrer"&gt;agent repository&lt;/a&gt; which contains agents implementations examples.&lt;/p&gt;
&lt;h2&gt;
  
  
  Thank You!!🙏
&lt;/h2&gt;

&lt;p&gt;Thank you for reading this far. If you find this article useful, please like and share this article. Someone could find it useful too.💖&lt;/p&gt;

&lt;p&gt;Connect with me on &lt;a href="https://x.com/kiran__a__n" rel="noopener noreferrer"&gt;&lt;strong&gt;X&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://github.com/Kiran1689" rel="noopener noreferrer"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://www.linkedin.com/in/kiran-a-n" rel="noopener noreferrer"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__1204850"&gt;
    &lt;a href="/dev_kiran" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg" alt="dev_kiran image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/dev_kiran"&gt;Kiran Naragund&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/dev_kiran"&gt;Tech Writer and Moderator @DEV ✦ Full-Stack Developer ✦ Mentor @Exercism ✦ Open-Source Contributor ✦ Email for Collabs :)&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





</description>
      <category>qodo</category>
      <category>cli</category>
      <category>ai</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
