<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kiran Naragund</title>
    <description>The latest articles on DEV Community by Kiran Naragund (@dev_kiran).</description>
    <link>https://dev.to/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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1204850%2F1873cf6a-e8a7-4d43-9af8-296ac0506b3a.jpg</url>
      <title>DEV Community: Kiran Naragund</title>
      <link>https://dev.to/dev_kiran</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dev_kiran"/>
    <language>en</language>
    <item>
      <title>Best AI Code Review Tools for GitHub in 2026</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sun, 02 Aug 2026 09:42:38 +0000</pubDate>
      <link>https://dev.to/dev_kiran/best-ai-code-review-tools-for-github-in-2026-4pjk</link>
      <guid>https://dev.to/dev_kiran/best-ai-code-review-tools-for-github-in-2026-4pjk</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;AI coding assistants have dramatically accelerated code generation.&lt;/p&gt;

&lt;p&gt;Whether you're using Cursor, GitHub Copilot, Claude Code, or Windsurf, writing code is faster than ever. The challenge is that code review hasn't improved at the same pace.&lt;/p&gt;

&lt;p&gt;Teams are shipping larger pull requests, reviewing more AI-generated code, and spending increasing amounts of time validating whether changes are actually correct, maintainable, and aligned with existing architecture.&lt;/p&gt;

&lt;p&gt;That's exactly why AI code review tools have become a key part of modern GitHub workflows.&lt;/p&gt;

&lt;p&gt;The problem is that not all AI review tools solve the same problem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some generate pull request summaries.&lt;/li&gt;
&lt;li&gt;Some focus on security and compliance.&lt;/li&gt;
&lt;li&gt;Some extend traditional static analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Others attempt to understand repository-wide context and review changes the way an experienced teammate would.&lt;/p&gt;

&lt;p&gt;If you're evaluating AI code review tools for GitHub, here's a practical comparison of the most widely discussed options in 2026.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Quick Verdict
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; stands out for teams that need automated pull request reviews with repository-wide context, not just diff analysis.&lt;/p&gt;

&lt;p&gt;The GitHub integration is straightforward, reviews run automatically on pull requests, and the platform focuses on understanding dependencies, related files, and existing code patterns across the repository.&lt;/p&gt;

&lt;p&gt;For small projects, lightweight review tools may be sufficient.&lt;/p&gt;

&lt;p&gt;For larger codebases, AI-generated code, and complex pull requests, context-aware review becomes significantly more valuable.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes a Good GitHub AI Review Tool?
&lt;/h2&gt;

&lt;p&gt;Before comparing tools, it's worth defining what actually matters.&lt;/p&gt;

&lt;p&gt;For most engineering teams, four factors determine whether an AI review tool provides real value.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Integration
&lt;/h3&gt;

&lt;p&gt;Reviews should appear where developers already work, directly inside GitHub pull requests.&lt;/p&gt;

&lt;p&gt;Nobody wants another dashboard, notification stream, or workflow to manage.&lt;/p&gt;

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

&lt;p&gt;Useful reviews surface meaningful issues, not just more comments.&lt;/p&gt;

&lt;p&gt;The goal isn't volume. It's identifying problems developers would otherwise miss.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Context Awareness
&lt;/h3&gt;

&lt;p&gt;The best reviewers understand how changes affect the rest of the codebase.&lt;/p&gt;

&lt;p&gt;Looking only at modified lines is often insufficient for complex systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Setup and Maintenance
&lt;/h3&gt;

&lt;p&gt;Developers adopt tools faster when setup takes minutes, not weeks.&lt;/p&gt;

&lt;p&gt;The best solutions require minimal configuration and ongoing maintenance.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; automates code reviews inside GitHub while analyzing changes in repository context.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Liked
&lt;/h3&gt;

&lt;p&gt;Qodo's biggest strength is understanding code beyond the pull request diff.&lt;/p&gt;

&lt;p&gt;Instead of evaluating only modified files, it attempts to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Related files&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Existing implementation patterns&lt;/li&gt;
&lt;li&gt;Historical review context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This becomes particularly useful when a pull request spans multiple services, modules, or shared components.&lt;/p&gt;

&lt;p&gt;Many bugs are not introduced within the changed file itself. They're caused by missing updates elsewhere in the system.&lt;/p&gt;

&lt;p&gt;Context-aware analysis helps identify those issues before they reach production.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Integration
&lt;/h3&gt;

&lt;p&gt;Getting started is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install the &lt;a href="https://github.com/marketplace/qodo-merge-pro" rel="noopener noreferrer"&gt;GitHub app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Grant repository access&lt;/li&gt;
&lt;li&gt;Select repositories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After setup, reviews run automatically whenever pull requests are opened or updated.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Medium and large engineering teams&lt;/li&gt;
&lt;li&gt;Teams reviewing AI-generated code&lt;/li&gt;
&lt;li&gt;Multi-service architectures&lt;/li&gt;
&lt;li&gt;Complex repositories&lt;/li&gt;
&lt;li&gt;Teams prioritizing review quality over comment volume&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. CodeRabbit
&lt;/h2&gt;

&lt;p&gt;CodeRabbit is popular for delivering AI-powered pull request feedback with minimal setup.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Liked
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Quick installation&lt;/li&gt;
&lt;li&gt;Helpful pull request summaries&lt;/li&gt;
&lt;li&gt;Easy adoption&lt;/li&gt;
&lt;li&gt;Good developer experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For many teams, it's one of the fastest ways to introduce AI reviews into GitHub workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where It Can Struggle
&lt;/h3&gt;

&lt;p&gt;Most feedback is generated from the pull request diff, with limited repository-wide context.&lt;/p&gt;

&lt;p&gt;For smaller applications, this approach often works well.&lt;/p&gt;

&lt;p&gt;As systems grow more interconnected, diff-only reviews can miss architectural dependencies, downstream effects, and implementation consistency across services.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Small engineering teams&lt;/li&gt;
&lt;li&gt;Startups&lt;/li&gt;
&lt;li&gt;Simpler repositories&lt;/li&gt;
&lt;li&gt;Teams looking for lightweight AI review assistance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. SonarQube
&lt;/h2&gt;

&lt;p&gt;SonarQube focuses on code quality and security analysis rather than AI-driven review workflows.&lt;/p&gt;

&lt;p&gt;Although it's frequently mentioned alongside AI review tools, its primary purpose is different.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Security scanning&lt;/li&gt;
&lt;li&gt;Vulnerability detection&lt;/li&gt;
&lt;li&gt;Technical debt tracking&lt;/li&gt;
&lt;li&gt;Code smells&lt;/li&gt;
&lt;li&gt;Test coverage reporting&lt;/li&gt;
&lt;li&gt;Quality gates&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What It's Not Trying To Do
&lt;/h3&gt;

&lt;p&gt;SonarQube excels at enforcing quality standards, security rules, and maintainability checks.&lt;/p&gt;

&lt;p&gt;It is not designed to provide contextual pull request feedback or repository-level reasoning in the same way dedicated AI review platforms do.&lt;/p&gt;

&lt;p&gt;Think of it as a powerful quality enforcement platform rather than an AI reviewer.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Enterprise engineering teams&lt;/li&gt;
&lt;li&gt;Security-focused organizations&lt;/li&gt;
&lt;li&gt;Compliance requirements&lt;/li&gt;
&lt;li&gt;Governance-heavy development environments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. GitHub Copilot Code Review
&lt;/h2&gt;

&lt;p&gt;GitHub continues expanding Copilot's review capabilities directly within the GitHub platform.&lt;/p&gt;

&lt;p&gt;For teams already invested in the GitHub ecosystem, this creates a seamless experience with no additional tooling required.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Liked
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Native GitHub integration&lt;/li&gt;
&lt;li&gt;Familiar developer workflow&lt;/li&gt;
&lt;li&gt;No additional platform management&lt;/li&gt;
&lt;li&gt;Convenient for existing Copilot users&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Current Limitations
&lt;/h3&gt;

&lt;p&gt;Review suggestions are primarily pull request focused and less repository-aware than dedicated review platforms.&lt;/p&gt;

&lt;p&gt;For simple reviews, this is often enough.&lt;/p&gt;

&lt;p&gt;Teams requiring deeper architectural understanding, broader repository context, or more advanced automation may still benefit from specialized review tools.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Existing GitHub Copilot customers&lt;/li&gt;
&lt;li&gt;Small teams&lt;/li&gt;
&lt;li&gt;Lightweight review assistance&lt;/li&gt;
&lt;li&gt;GitHub-first development workflows&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Which Tool Should You Choose?
&lt;/h2&gt;

&lt;p&gt;The right tool depends on how your team reviews, ships, and maintains code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choose Qodo if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You review large pull requests&lt;/li&gt;
&lt;li&gt;Multiple services interact with each other&lt;/li&gt;
&lt;li&gt;AI-generated code is becoming common&lt;/li&gt;
&lt;li&gt;Repository-wide context matters&lt;/li&gt;
&lt;li&gt;You want deeper review feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose CodeRabbit if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want lightweight AI reviews&lt;/li&gt;
&lt;li&gt;Your repositories are relatively straightforward&lt;/li&gt;
&lt;li&gt;Fast adoption is a priority&lt;/li&gt;
&lt;li&gt;Pull request summaries are important&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose SonarQube if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Security is a primary concern&lt;/li&gt;
&lt;li&gt;Compliance requirements exist&lt;/li&gt;
&lt;li&gt;You need quality gates&lt;/li&gt;
&lt;li&gt;Static analysis is a core requirement&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Choose GitHub Copilot Review if:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You're already using Copilot&lt;/li&gt;
&lt;li&gt;You want basic review assistance&lt;/li&gt;
&lt;li&gt;Keeping everything inside GitHub is important&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📚 Want to Learn More?
&lt;/h2&gt;

&lt;p&gt;If you're evaluating AI code reviews, these resources provide deeper technical guidance and practical examples.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.qodo.ai/academy/ai-code-review/" rel="noopener noreferrer"&gt;&lt;strong&gt;What is AI Code Review&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A practical introduction to how AI review systems work and the types of issues they can identify.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.qodo.ai/academy/ai-generated-code-in-enterprise/" rel="noopener noreferrer"&gt;&lt;strong&gt;Reviewing AI-Generated Code&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful for teams increasingly relying on Cursor, Copilot, Claude Code, and other AI coding assistants.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.qodo.ai/academy/ai-code-review-tools-comparison-and-benchmarks/" rel="noopener noreferrer"&gt;&lt;strong&gt;AI Code Review Tools Comparison&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A deeper comparison of review approaches, workflows, strengths, and tradeoffs.&lt;/p&gt;




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

&lt;p&gt;Not all AI code review tools solve the same problem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some focus on pull request summaries.&lt;/li&gt;
&lt;li&gt;Some focus on security.&lt;/li&gt;
&lt;li&gt;Some focus on static analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Others focus on understanding how a change fits into the broader codebase.&lt;/p&gt;

&lt;p&gt;For GitHub teams, the best choice depends on the bottlenecks you're trying to eliminate.&lt;/p&gt;

&lt;p&gt;If your team is reviewing increasing volumes of AI-generated code, context awareness and review quality often matter far more than the number of comments an AI tool can generate.&lt;/p&gt;

&lt;p&gt;The most valuable reviewers aren't the ones that comment the most.&lt;/p&gt;

&lt;p&gt;They're the ones that catch issues developers would have otherwise missed.&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;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=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.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>aiops</category>
      <category>code</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>What "Context-Aware Code Review" Actually Means🤔</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sat, 01 Aug 2026 13:27:33 +0000</pubDate>
      <link>https://dev.to/dev_kiran/what-context-aware-code-review-actually-means-30gm</link>
      <guid>https://dev.to/dev_kiran/what-context-aware-code-review-actually-means-30gm</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;If you've looked at AI code review tools recently, you've probably seen the term &lt;strong&gt;"context-aware code review"&lt;/strong&gt; everywhere.&lt;/p&gt;

&lt;p&gt;Every tool seems to use it.&lt;/p&gt;

&lt;p&gt;Some talk about repository awareness. Others mention codebase understanding. A few claim they understand architecture and engineering best practices.&lt;/p&gt;

&lt;p&gt;After spending some time reading docs, testing different tools, and comparing how they review pull requests, I realized something:&lt;/p&gt;

&lt;p&gt;Most of us don't really know what "context-aware" means.&lt;/p&gt;

&lt;p&gt;The term gets thrown around so often that it's hard to tell whether a tool actually understands your codebase or is simply reviewing the diff and calling it context.&lt;/p&gt;

&lt;p&gt;So I wanted to dig into what context actually means in code review and why it matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  Most Reviews Start With The Diff
&lt;/h2&gt;

&lt;p&gt;Whether the review is done by a human or an AI tool, the starting point is usually the same.&lt;/p&gt;

&lt;p&gt;The pull request &lt;strong&gt;diff&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Reviewers look at what changed, which files were modified, what code was added or removed, and whether tests were updated.&lt;/p&gt;

&lt;p&gt;AI review tools generally work the same way. They receive the diff and generate feedback based on the changes.&lt;/p&gt;

&lt;p&gt;For a lot of pull requests, that's completely fine.&lt;/p&gt;

&lt;p&gt;If you're fixing a typo, updating a utility function, or cleaning up some code, the diff often contains everything needed to review the change.&lt;/p&gt;

&lt;p&gt;The problem starts when the change affects behavior outside the files being modified.&lt;/p&gt;

&lt;p&gt;That's where context becomes important.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Example
&lt;/h2&gt;

&lt;p&gt;Let's say a pull request contains this line:&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="nf"&gt;updatePaymentStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paymentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Looking only at the diff, nothing seems wrong.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code compiles.&lt;/li&gt;
&lt;li&gt;Tests pass.&lt;/li&gt;
&lt;li&gt;No obvious issues stand out.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But imagine a few things are true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The payment service is supposed to publish an event whenever the status changes.&lt;/li&gt;
&lt;li&gt;Audit logs are required for compliance reasons.&lt;/li&gt;
&lt;li&gt;Similar update flows also update metadata fields.&lt;/li&gt;
&lt;li&gt;Another service depends on a specific side effect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that information exists in the diff.&lt;/p&gt;

&lt;p&gt;If you're familiar with the system, you might catch the issue immediately.&lt;/p&gt;

&lt;p&gt;If you're not, you'll probably need to search the repository, look at similar implementations, and understand how this piece fits into the larger application.&lt;/p&gt;

&lt;p&gt;That's context.&lt;/p&gt;


&lt;h2&gt;
  
  
  So What Does "Context" Actually Mean?
&lt;/h2&gt;

&lt;p&gt;When people talk about context-aware code review, they're usually talking about information that exists outside the pull request itself.&lt;/p&gt;

&lt;p&gt;The exact definition varies between tools, but it generally falls into a few categories.&lt;/p&gt;
&lt;h3&gt;
  
  
  Repository Context
&lt;/h3&gt;

&lt;p&gt;This is probably the most common type.&lt;/p&gt;

&lt;p&gt;Instead of looking only at the modified files, a tool also examines surrounding code.&lt;/p&gt;

&lt;p&gt;For example, if you're changing a service method, it might inspect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Related services&lt;/li&gt;
&lt;li&gt;Shared utilities&lt;/li&gt;
&lt;li&gt;Existing implementations&lt;/li&gt;
&lt;li&gt;Similar patterns elsewhere in the repository&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A diff-only review doesn't usually do this.&lt;/p&gt;

&lt;p&gt;It sees the change.&lt;/p&gt;

&lt;p&gt;A context-aware review tries to understand where that change lives.&lt;/p&gt;
&lt;h3&gt;
  
  
  Historical Context
&lt;/h3&gt;

&lt;p&gt;Sometimes the most important information isn't in the code.&lt;/p&gt;

&lt;p&gt;It's in previous decisions.&lt;/p&gt;

&lt;p&gt;Every team develops conventions over time. Some patterns become standard because they've worked well. Others exist because someone got burned by a production issue three years ago.&lt;/p&gt;

&lt;p&gt;Historical context can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Previous pull requests&lt;/li&gt;
&lt;li&gt;Review comments&lt;/li&gt;
&lt;li&gt;Team conventions&lt;/li&gt;
&lt;li&gt;Accepted implementation patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Experienced engineers naturally use this information when reviewing code.&lt;/p&gt;

&lt;p&gt;A truly context-aware tool should be able to leverage some of it as well.&lt;/p&gt;
&lt;h3&gt;
  
  
  Dependency Context
&lt;/h3&gt;

&lt;p&gt;Modern systems are connected in ways that aren't always obvious.&lt;/p&gt;

&lt;p&gt;A small change in one service can impact shared libraries, downstream systems, APIs, or external integrations.&lt;/p&gt;

&lt;p&gt;This becomes even more important in organizations with multiple repositories and distributed architectures.&lt;/p&gt;

&lt;p&gt;A pull request can look perfectly fine inside its own repository while still creating problems somewhere else.&lt;/p&gt;

&lt;p&gt;That's why dependency awareness matters.&lt;/p&gt;
&lt;h3&gt;
  
  
  Architectural Context
&lt;/h3&gt;

&lt;p&gt;This is probably the hardest problem to solve.&lt;/p&gt;

&lt;p&gt;Most mature systems have architectural rules that aren't explicitly written in every file.&lt;/p&gt;

&lt;p&gt;Maybe services aren't supposed to access certain domains directly.&lt;/p&gt;

&lt;p&gt;Maybe events are required for specific workflows.&lt;/p&gt;

&lt;p&gt;Maybe security checks must happen before certain operations.&lt;/p&gt;

&lt;p&gt;A review tool that understands architecture should be able to recognize when a change violates those expectations.&lt;/p&gt;

&lt;p&gt;That's much harder than checking syntax or spotting a bug pattern.&lt;/p&gt;


&lt;h2&gt;
  
  
  How Can You Tell If A Tool Is Actually Context-Aware?
&lt;/h2&gt;

&lt;p&gt;This is the question I started asking whenever I evaluated a new review tool.&lt;/p&gt;

&lt;p&gt;Instead of looking at marketing claims, I focused on what the feedback actually looked like.&lt;/p&gt;

&lt;p&gt;One thing I noticed is that good review comments usually explain &lt;em&gt;why&lt;/em&gt; something matters.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Consider updating this implementation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's technically feedback, but it's not very useful.&lt;/p&gt;

&lt;p&gt;Compare that with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Similar update flows publish an event after status changes. This implementation does not appear to do that, which could lead to inconsistent downstream behavior.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second comment demonstrates awareness of patterns outside the modified code.&lt;/p&gt;

&lt;p&gt;That's a much stronger signal that the tool understands context.&lt;/p&gt;

&lt;p&gt;Another thing I look for is whether the tool can connect changes to code that wasn't modified.&lt;/p&gt;

&lt;p&gt;Many tools only analyze changed files.&lt;/p&gt;

&lt;p&gt;There's nothing wrong with that.&lt;/p&gt;

&lt;p&gt;But if a tool claims to understand context, I expect it to reference related parts of the codebase when they're relevant.&lt;/p&gt;

&lt;p&gt;I also pay attention to whether the feedback reflects team conventions.&lt;/p&gt;

&lt;p&gt;Every engineering team develops its own standards around logging, testing, security, error handling, and observability.&lt;/p&gt;

&lt;p&gt;The best review feedback feels specific to the project.&lt;/p&gt;

&lt;p&gt;The worst feedback feels like generic advice copied from a programming textbook.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why This Matters More Than Ever
&lt;/h2&gt;

&lt;p&gt;The way we write code is changing.&lt;/p&gt;

&lt;p&gt;Many teams now use tools like Cursor, GitHub Copilot, Claude Code, and other AI coding assistants every day.&lt;/p&gt;

&lt;p&gt;That means more code is being generated faster than ever.&lt;/p&gt;

&lt;p&gt;As a result, review workload keeps increasing.&lt;/p&gt;

&lt;p&gt;Reviewers aren't just checking code quality anymore.&lt;/p&gt;

&lt;p&gt;They're increasingly responsible for understanding how generated code fits into existing systems, patterns, and architectural decisions.&lt;/p&gt;

&lt;p&gt;That's where context becomes valuable.&lt;/p&gt;

&lt;p&gt;Not because AI replaces human reviewers.&lt;/p&gt;

&lt;p&gt;Because modern codebases are becoming too large and interconnected to reason about from a single pull request alone.&lt;/p&gt;


&lt;h2&gt;
  
  
  Where &lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; Fits In
&lt;/h2&gt;

&lt;p&gt;One thing I found interesting about &lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt;'s approach is its focus on gathering context before generating feedback.&lt;/p&gt;

&lt;p&gt;Instead of looking only at changed lines, it attempts to understand related files, repository structure, dependencies, previous review activity, and existing code patterns.&lt;/p&gt;

&lt;p&gt;The goal isn't to generate more comments.&lt;/p&gt;

&lt;p&gt;The goal is to generate comments that are actually relevant to the change being reviewed.&lt;/p&gt;

&lt;p&gt;Whether any tool succeeds at that should ultimately be judged by developers using it in real projects.&lt;/p&gt;

&lt;p&gt;But personally, I think this is a much better way to evaluate AI review tools than asking whether they use AI or how many comments they generate.&lt;/p&gt;

&lt;p&gt;Checkout Qodo here: &lt;a href="https://www.qodo.ai" rel="noopener noreferrer"&gt;https://www.qodo.ai&lt;/a&gt;&lt;/p&gt;


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

&lt;p&gt;"Context-aware code review" has become one of those terms that everyone uses but rarely defines.&lt;/p&gt;

&lt;p&gt;Some tools are mostly diff reviewers.&lt;/p&gt;

&lt;p&gt;Others try to understand repository structure, dependencies, historical decisions, and architectural patterns before generating feedback.&lt;/p&gt;

&lt;p&gt;Neither approach is automatically better.&lt;/p&gt;

&lt;p&gt;The important thing is understanding what kind of context a tool actually uses and where its feedback comes from.&lt;/p&gt;

&lt;p&gt;Because in my experience, the biggest production issues are rarely hidden in the syntax.&lt;/p&gt;

&lt;p&gt;They're usually hidden in the context surrounding the change.&lt;/p&gt;

&lt;p&gt;And that's exactly the part that's easiest to miss when you're only looking at a diff.&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;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=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.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>productivity</category>
    </item>
    <item>
      <title>BrowserAct Hit #1 on Product Hunt, So I Decided to Test It 🧙‍♂️</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sun, 05 Jul 2026 10:14:20 +0000</pubDate>
      <link>https://dev.to/dev_kiran/browseract-hit-1-on-product-hunt-so-i-decided-to-test-it-96m</link>
      <guid>https://dev.to/dev_kiran/browseract-hit-1-on-product-hunt-so-i-decided-to-test-it-96m</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;Over the last few months, AI agents have been evolving very quickly. We are no longer building simple chatbots that answer questions. Today, agents browse websites, execute workflows, monitor dashboards, interact with SaaS platforms, and perform actions that previously required manual work.&lt;/p&gt;

&lt;p&gt;Recently, &lt;a href="https://www.browseract.ai/Kiran" rel="noopener noreferrer"&gt;BrowserAct&lt;/a&gt; reached the top position on &lt;a href="https://www.producthunt.com/leaderboard/daily/2026/6/25" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt;, which immediately caught my attention. Products often receive attention during launch periods, but reaching the number one spot usually means people see a real problem being solved rather than just another feature release.&lt;/p&gt;

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

&lt;p&gt;That made me curious.&lt;/p&gt;

&lt;p&gt;Why are developers and AI builders paying attention to &lt;a href="https://www.browseract.ai/Kiran" rel="noopener noreferrer"&gt;BrowserAct&lt;/a&gt;? Is it simply another browser automation tool, or is there something different about it?&lt;/p&gt;

&lt;p&gt;Instead of reading documentation and feature lists, I decided to test it myself and understand what problem it is trying to solve.&lt;/p&gt;

&lt;p&gt;In this article I will walk through what &lt;a href="https://www.browseract.ai/Kiran" rel="noopener noreferrer"&gt;BrowserAct&lt;/a&gt; is, the problem it addresses, how to install it locally, and some hands-on examples using real workflows.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is &lt;a href="https://www.browseract.ai/Kiran" rel="noopener noreferrer"&gt;BrowserAct&lt;/a&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.browseract.ai/Kiran" rel="noopener noreferrer"&gt;BrowserAct&lt;/a&gt; is a browser automation CLI built specifically for &lt;em&gt;AI agents&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Traditional browser automation tools usually focus on opening pages, clicking buttons, and extracting information from websites. That works well for simple tasks, but AI agents often require more than basic automation. Real websites contain authentication flows, dynamic rendering, browser fingerprint checks, session management, and situations where human intervention becomes necessary.&lt;/p&gt;

&lt;p&gt;BrowserAct attempts to solve these challenges by treating the browser as an execution environment for agents rather than as a temporary browser window.&lt;/p&gt;

&lt;p&gt;Some of its capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Browser session persistence&lt;/li&gt;
&lt;li&gt;Browser identity isolation&lt;/li&gt;
&lt;li&gt;Human handoff support&lt;/li&gt;
&lt;li&gt;Parallel browser sessions&lt;/li&gt;
&lt;li&gt;Anti-detection browser environments&lt;/li&gt;
&lt;li&gt;Reusable workflows and skills&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Problem Is BrowserAct Trying To Solve?
&lt;/h2&gt;

&lt;p&gt;After building and testing AI agents, I have noticed that many workflows do not fail because of the language model.&lt;/p&gt;

&lt;p&gt;The model usually knows what it needs to do.&lt;/p&gt;

&lt;p&gt;The problem starts when the workflow enters a browser.&lt;/p&gt;

&lt;p&gt;For example, consider an AI agent that monitors competitor pricing. On paper the task sounds straightforward. Open a website, extract information, generate a report, and send the output.&lt;/p&gt;

&lt;p&gt;Reality usually looks different.&lt;/p&gt;

&lt;p&gt;The website might require authentication. Content may be rendered dynamically. Session state may expire. Security checks can appear unexpectedly. Browser fingerprints may trigger additional verification.&lt;/p&gt;

&lt;p&gt;At this point the issue is no longer intelligence.&lt;/p&gt;

&lt;p&gt;The issue becomes execution.&lt;/p&gt;

&lt;p&gt;BrowserAct seems designed around that exact problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started with BrowserAct
&lt;/h2&gt;

&lt;p&gt;Getting started with BrowserAct is straightforward, and it can fit naturally into both command-line workflows and AI agent environments.&lt;/p&gt;

&lt;p&gt;Depending on how you plan to use it, there are two common installation approaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Install Through an AI Agent (Recommended for Agent Workflows)
&lt;/h3&gt;

&lt;p&gt;If you're using an AI coding agent or an environment that supports skills and tool integrations, BrowserAct can be installed directly as a skill.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add browser-act/skills &lt;span class="nt"&gt;--skill&lt;/span&gt; browser-act
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This allows the agent to invoke BrowserAct capabilities directly inside larger workflows. Instead of writing custom browser automation logic every time, the agent can use BrowserAct whenever browser interaction becomes necessary.&lt;/p&gt;

&lt;p&gt;For example, an agent can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open websites&lt;/li&gt;
&lt;li&gt;Navigate between pages&lt;/li&gt;
&lt;li&gt;Handle login flows&lt;/li&gt;
&lt;li&gt;Fill forms&lt;/li&gt;
&lt;li&gt;Extract structured content&lt;/li&gt;
&lt;li&gt;Continue browser-based workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach is useful when BrowserAct becomes part of a broader AI system rather than a standalone browser tool.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Install BrowserAct CLI Directly
&lt;/h3&gt;

&lt;p&gt;If you prefer working directly from the terminal, BrowserAct also provides a CLI installation option.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;browser-act-cli &lt;span class="nt"&gt;--python&lt;/span&gt; 3.12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After installation, authenticate your local environment:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act auth login

browser-act auth poll
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also directly configure an API key:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act auth &lt;span class="nb"&gt;set &lt;/span&gt;YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once authentication is complete, BrowserAct is ready to execute browser workflows locally.&lt;/p&gt;

&lt;p&gt;Rather than jumping directly into advanced workflows, I wanted to verify that the installation was working correctly and understand the basic command flow.&lt;/p&gt;

&lt;p&gt;The first thing I checked was the browser profiles available on my system.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act browser list-profiles
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcvnk9i5y69qulpzhy7c9.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcvnk9i5y69qulpzhy7c9.png" alt="browser-act browser list-profiles" width="800" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output lists available browser profiles that BrowserAct can use during execution. These profiles become useful when creating isolated browser environments, preserving state across sessions, or reusing existing login contexts.&lt;/p&gt;

&lt;p&gt;Next, I created a browser using my existing Chrome profile.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser create &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nb"&gt;type &lt;/span&gt;chrome &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--&lt;/span&gt; source-profile &lt;span class="se"&gt;\&lt;/span&gt;
local_profile_182885126174998716 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--&lt;/span&gt; name &lt;span class="s2"&gt;"browseract"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--&lt;/span&gt; desc &lt;span class="s2"&gt;"testing-browseract"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;p&gt;BrowserAct automatically imports available browser state such as cookies and local storage data.&lt;/p&gt;

&lt;p&gt;Now that the browser environment was ready, I wanted to test a simple content extraction workflow.&lt;/p&gt;


&lt;h3&gt;
  
  
  First Test: Extracting Website Content
&lt;/h3&gt;

&lt;p&gt;For the first test, I used BrowserAct's &lt;code&gt;stealth-extract&lt;/code&gt; command on a simple website.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act stealth-extract https://example.com &lt;span class="nt"&gt;--content-type&lt;/span&gt; markdown
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwyv7ncbexx3z4yntcm1t.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwyv7ncbexx3z4yntcm1t.png" alt="browser-act stealth-extract https://example.com --content-type markdown" width="800" height="101"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Example Domain

This domain is for use in documentation examples without needing permission.

[Learn more](https://iana.org/domains/example)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The result was returned as clean markdown without writing selectors, parsing HTML, or creating custom scraping logic.&lt;/p&gt;

&lt;p&gt;Next, I wanted to see how BrowserAct handled an interactive browser session.&lt;/p&gt;


&lt;h3&gt;
  
  
  Second Test: Opening a Browser Session
&lt;/h3&gt;

&lt;p&gt;I opened a browser session using the browser profile I created earlier.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--session&lt;/span&gt; first-test &lt;span class="se"&gt;\&lt;/span&gt;
browser open &lt;span class="se"&gt;\&lt;/span&gt;
chrome_local_102863481715294440 &lt;span class="se"&gt;\&lt;/span&gt;
https://github.com
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0m2195mqlhoberesiiy.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm0m2195mqlhoberesiiy.png" alt="browser-act --session first-test browser open chrome_local_102863481715294440 https://github.com" width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The output returned details about the active session:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;session_name=first-test
browser_type=chrome
url=https://github.com/
title=GitHub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;At this point, the browser was active and ready for interaction.&lt;/p&gt;
&lt;h3&gt;
  
  
  Inspecting Page State
&lt;/h3&gt;

&lt;p&gt;One of the interesting parts of BrowserAct is that it does not expose raw HTML directly. Instead, it generates a structured view of interactive elements that agents can work with.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--session&lt;/span&gt; first-test &lt;span class="se"&gt;\&lt;/span&gt;
state
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F16pqlu6pzjbna10h7h7j.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F16pqlu6pzjbna10h7h7j.png" alt="browser-act \&lt;br&gt;
--session first-test \&lt;br&gt;
state" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This allows interactions to happen using element references rather than manually creating CSS selectors.&lt;/p&gt;

&lt;p&gt;To test this further, I clicked search button:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--session&lt;/span&gt; first-test &lt;span class="se"&gt;\&lt;/span&gt;
click 6
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zocuprx3kik00rhdjm0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3zocuprx3kik00rhdjm0.png" alt="browser-act \&lt;br&gt;
--session first-test \&lt;br&gt;
click 6" width="799" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, I had completed a complete workflow:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Create Browser → Open Session → Inspect → Input → Click → Navigate&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;without writing a browser automation script.&lt;/p&gt;


&lt;h3&gt;
  
  
  Third Test: Using BrowserAct with an AI Agent
&lt;/h3&gt;

&lt;p&gt;After testing BrowserAct directly through the CLI, I wanted to see how it behaved inside an actual AI agent workflow.&lt;/p&gt;

&lt;p&gt;For this experiment, I used &lt;strong&gt;Codex&lt;/strong&gt; as the agent runtime.&lt;/p&gt;

&lt;p&gt;One advantage of BrowserAct is that it does not need to live as a standalone tool. We can instruct the agent to invoke BrowserAct whenever browser interaction becomes necessary. That includes opening websites, clicking buttons, handling login flows, extracting structured content, or interacting with dynamic pages.&lt;/p&gt;

&lt;p&gt;To test this, I asked the agent to install BrowserAct and use it as part of its workflow.&lt;/p&gt;

&lt;p&gt;Here is the prompt I provided:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set up BrowserAct for me. 
Read the BrowserAct skill first: https://github.com/browser-act/skills/blob/main/browser-act/SKILL.md
Install or update the browser-act skill, then verify it works. 
Use BrowserAct when I need an AI agent to browse, click, fill forms,
handle login flows, solve CAPTCHAs, bypass bot detection, or extract structured data from websites. 
After setup, open this repository in my browser: https://github.com/browser-act/skills 
If I am logged in to GitHub, 
ask me whether you should star it for me as a quick demo that browser interaction works. 
Only click the star if I explicitly say yes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After receiving the instructions, the agent started executing the workflow automatically.&lt;/p&gt;

&lt;p&gt;The workflow looked something like this:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent starts
        ↓
Installs BrowserAct skill
        ↓
Verifies installation
        ↓
Opens GitHub repository
        ↓
Checks authentication state
        ↓
Requests confirmation
        ↓
Performs browser action
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fldorh22f4pfgsa6chnaf.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fldorh22f4pfgsa6chnaf.png" alt="BA" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The interesting part was watching the agent use BrowserAct as a tool rather than relying on static instructions. Browser actions became part of the execution process instead of separate manual steps.&lt;/p&gt;

&lt;p&gt;After receiving confirmation, the agent completed the task successfully and starred the repository.&lt;/p&gt;

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

&lt;p&gt;Although starring a GitHub repository is a simple action, it demonstrates an important capability. The agent was able to open a real website, maintain browser state, interact with UI elements, and complete an action inside an authenticated environment.&lt;/p&gt;

&lt;p&gt;This feels much closer to real-world AI workflows than isolated browser automation scripts.&lt;/p&gt;


&lt;h3&gt;
  
  
  Fourth Test: Human Handoff with an AI Agent
&lt;/h3&gt;

&lt;p&gt;One feature that interested me most was human handoff.&lt;/p&gt;

&lt;p&gt;Many automation workflows eventually reach a point where the process cannot continue without human participation. Common examples include OTP verification, QR login, enterprise SSO approval, and security confirmations.&lt;/p&gt;

&lt;p&gt;To test this behavior, I used &lt;em&gt;&lt;strong&gt;Codex&lt;/strong&gt;&lt;/em&gt; together with BrowserAct and created a workflow that required OTP verification.&lt;/p&gt;

&lt;p&gt;My objective was straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let the agent open the login page&lt;/li&gt;
&lt;li&gt;Enter the email automatically&lt;/li&gt;
&lt;li&gt;Pause when OTP is required&lt;/li&gt;
&lt;li&gt;Preserve browser state&lt;/li&gt;
&lt;li&gt;Resume execution after human input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I provided the following prompt to the agent:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use BrowserAct for this workflow. 

Open: https://practice.expandtesting.com/otp-login 

Actions: 
1. Launch BrowserAct 
2. Open the website 
3. Continue the login workflow 
4. If human interaction becomes necessary for OTP, preserve browser state and use BrowserAct's collaboration capability 
5. Resume execution after collaboration completes
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnpnsk3nl1umlgz3d4gzh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnpnsk3nl1umlgz3d4gzh.png" alt="prompt" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent launched BrowserAct, created a browser session, and navigated to the login page.&lt;/p&gt;

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

&lt;p&gt;When the workflow reached the authentication stage, BrowserAct detected that human interaction was required and generated a &lt;em&gt;collaboration link&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;I opened the collaboration link and completed the login process manually.&lt;/p&gt;

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

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

&lt;p&gt;Once authentication finished, control automatically returned to the agent without restarting the browser session.&lt;/p&gt;

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

&lt;p&gt;The interesting part was that the browser state remained active throughout the interruption. The agent paused execution, handed control to a human when necessary, and then continued from the exact same session once the required action had been completed.&lt;/p&gt;

&lt;p&gt;For production workflows involving authentication, verification, or approval steps, this feels significantly more practical than forcing complete automation.&lt;/p&gt;


&lt;h3&gt;
  
  
  Fifth Test: Running Multiple Browser Sessions
&lt;/h3&gt;

&lt;p&gt;Another scenario I wanted to test was running multiple independent browser sessions.&lt;/p&gt;

&lt;p&gt;Long-running AI systems rarely perform a single task. They may monitor dashboards, analyze feedback, review customer activity, and collect information simultaneously.&lt;/p&gt;

&lt;p&gt;I created several browser sessions locally.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="nt"&gt;--session&lt;/span&gt; reviews browser open chrome_local_102863481715294440 https://reddit.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="nt"&gt;--session&lt;/span&gt; ops browser open chrome_local_102863481715294440 https://status.openai.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="nt"&gt;--session&lt;/span&gt; community browser open chrome_local_102863481715294440 https://dev.to
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;I then listed active sessions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act session list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The output showed multiple active sessions operating independently.&lt;/p&gt;

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

&lt;p&gt;This separation becomes useful because each workflow maintains its own execution state while avoiding interference with other tasks.&lt;/p&gt;
&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;p&gt;After spending some time testing BrowserAct, I understand why it attracted attention during its Product Hunt launch.&lt;/p&gt;

&lt;p&gt;The value does not come from simply opening browsers and clicking buttons.&lt;/p&gt;

&lt;p&gt;The interesting part is treating the browser as an execution layer for AI agents and handling the problems that appear in real environments.&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;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=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.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>cli</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>The Code Review Metrics No One Is Tracking..</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Mon, 29 Jun 2026 17:09:37 +0000</pubDate>
      <link>https://dev.to/dev_kiran/the-code-review-metrics-no-one-is-tracking-2mm6</link>
      <guid>https://dev.to/dev_kiran/the-code-review-metrics-no-one-is-tracking-2mm6</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;When teams talk about engineering metrics, the conversation usually moves toward speed. We often look at things like pull request turnaround time, lead time, deployment frequency, and how quickly changes move through the system.&lt;/p&gt;

&lt;p&gt;These are useful metrics because they tell us how efficiently work is flowing through the development process. But after spending time on larger projects and working across different teams, I started noticing that speed alone doesn't always tell the full story.&lt;/p&gt;

&lt;p&gt;I've seen teams merge pull requests quickly and still spend a lot of time later dealing with repeated issues, hotfixes, and bugs that somehow escaped review. I've also seen teams with slower review cycles that ended up having fewer production issues because they consistently caught missing pieces earlier.&lt;/p&gt;

&lt;p&gt;That made me think about whether we sometimes focus too much on &lt;em&gt;how fast reviews move&lt;/em&gt; and not enough on &lt;em&gt;whether reviews are actually helping improve code quality.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let's get into it 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Quick Verdict
&lt;/h2&gt;

&lt;p&gt;&lt;a href="//qodo.ai"&gt;Qodo&lt;/a&gt; is probably one of the better options if your goal is not just measuring review speed but understanding review quality across a team. Instead of only showing statistics around pull request activity, it tries to surface patterns that are easy to miss during day-to-day development. Things like recurring issues, repeated review findings, critical problems appearing across repositories, and whether developers are actually resolving suggestions start becoming visible.&lt;/p&gt;

&lt;p&gt;That becomes more useful as projects grow because the challenge usually changes over time. In smaller projects, the focus is often on moving code quickly. In larger systems with more developers and more pull requests, the bigger challenge becomes understanding whether the same problems keep appearing repeatedly and slowly affecting quality.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Looking Only at PR Velocity
&lt;/h2&gt;

&lt;p&gt;Let's imagine two teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team A&lt;/strong&gt; has an average review time of around 15 minutes. Pull requests move quickly, deployments happen frequently, and every dashboard looks healthy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team B&lt;/strong&gt; takes closer to 40 minutes on average to review pull requests. From the outside it initially looks like Team B is moving more slowly.&lt;/p&gt;

&lt;p&gt;But after a few months, a different picture starts appearing.&lt;/p&gt;

&lt;p&gt;Team A repeatedly runs into missing edge cases, production fixes, and review discussions that seem strangely familiar. Reviewers continue asking for missing tests, validation updates, and similar changes over and over again.&lt;/p&gt;

&lt;p&gt;Team B, despite taking longer during reviews, catches many of these issues before code reaches production.&lt;/p&gt;

&lt;p&gt;At that point the discussion becomes less about "Which team reviews faster?" and more about "Which team is preventing problems from repeating?"&lt;/p&gt;

&lt;p&gt;That difference is important because pull request speed by itself doesn't tell us whether reviews are actually doing their job.&lt;/p&gt;




&lt;h2&gt;
  
  
  Metrics I Think Teams Ignore Too Often
&lt;/h2&gt;

&lt;p&gt;I don't think these replace &lt;a href="https://dora.dev/guides/dora-metrics/" rel="noopener noreferrer"&gt;DORA metrics&lt;/a&gt; or existing engineering metrics. I think they help explain the things happening underneath them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Repeated Review Comments
&lt;/h3&gt;

&lt;p&gt;Most teams eventually start seeing the same comments appear repeatedly in reviews.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Missing test coverage&lt;/p&gt;

&lt;p&gt;Validation missing&lt;/p&gt;

&lt;p&gt;Logging not updated&lt;/p&gt;

&lt;p&gt;Missing null handling&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If reviewers repeatedly ask for the same fixes, there is usually something deeper happening. It often means team standards are unclear, patterns are not consistently enforced, or reviewers are spending time doing repetitive work that could probably be automated.&lt;/p&gt;

&lt;p&gt;Over time this also creates review fatigue because developers and reviewers start seeing the same discussions repeatedly.&lt;/p&gt;




&lt;h3&gt;
  
  
  Resolution Rate
&lt;/h3&gt;

&lt;p&gt;This was one of the more interesting things I started thinking about.&lt;/p&gt;

&lt;p&gt;Detecting issues isn't necessarily difficult. Most tools can generate findings and suggestions. The more important question is whether developers actually resolve them.&lt;/p&gt;

&lt;p&gt;Let's imagine your team detected 150 review findings this month. That initially sounds useful.&lt;/p&gt;

&lt;p&gt;But then imagine that only 50 of those findings actually got resolved.&lt;/p&gt;

&lt;p&gt;Now the discussion changes. Instead of asking how many issues were found, you start asking whether developers trust the findings enough to act on them. If suggestions consistently get ignored, then the issue may not be lack of detection. The issue might be noise.&lt;/p&gt;




&lt;h3&gt;
  
  
  Average Findings Per Pull Request
&lt;/h3&gt;

&lt;p&gt;This metric becomes interesting when you stop looking at it as a fixed number and start looking at trends.&lt;/p&gt;

&lt;p&gt;Let's say your average findings per pull request increased from &lt;em&gt;1.4&lt;/em&gt; to &lt;em&gt;4.8&lt;/em&gt; over a few months.&lt;/p&gt;

&lt;p&gt;That increase by itself doesn't automatically mean quality became worse.&lt;/p&gt;

&lt;p&gt;Maybe AI-generated code started becoming part of the workflow. Maybe more developers joined the project. Maybe complexity increased as new services were added.&lt;/p&gt;

&lt;p&gt;The actual number isn't usually the important part. The trend and the reasons behind it tend to reveal much more.&lt;/p&gt;




&lt;h3&gt;
  
  
  Critical Findings Across Repositories
&lt;/h3&gt;

&lt;p&gt;Some issues never fail CI and never break builds.&lt;/p&gt;

&lt;p&gt;Examples might include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing authorization checks&lt;/li&gt;
&lt;li&gt;Dependency-related risks&lt;/li&gt;
&lt;li&gt;Missing audit logging&lt;/li&gt;
&lt;li&gt;Breaking changes in shared services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you see one isolated issue, it may not look important.&lt;/p&gt;

&lt;p&gt;But if similar issues repeatedly appear across repositories and teams, they stop feeling like isolated bugs. At that point they start looking more like process problems or architectural patterns that need attention.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Made Me Think About This
&lt;/h2&gt;

&lt;p&gt;Recently I was reading about &lt;a href="https://www.qodo.ai/blog/introducing-findings-page/" rel="noopener noreferrer"&gt;Qodo's Findings page&lt;/a&gt; and the idea behind it caught my attention.&lt;/p&gt;

&lt;p&gt;Most review feedback today lives inside pull requests. Someone opens a PR, reviewers leave comments, fixes get pushed, and eventually the pull request gets merged. After that, the conversation mostly disappears.&lt;/p&gt;

&lt;p&gt;The problem with that workflow is that patterns disappear too.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.qodo.ai/blog/introducing-findings-page/" rel="noopener noreferrer"&gt;Findings page&lt;/a&gt; tries to look across repositories and over longer periods of time by surfacing things like recurring findings, critical issues, resolution trends, and repeated review patterns.&lt;/p&gt;

&lt;p&gt;What I found interesting wasn't really the feature itself. It was the way it changes the perspective.&lt;/p&gt;

&lt;p&gt;If the same validation issue appears in thirty pull requests over two months, that no longer feels like an individual PR issue. It starts feeling like a signal that something larger is happening in the team's workflow.&lt;/p&gt;

&lt;p&gt;You can read more about monitoing organization-wide pull request findings here: &lt;a href="https://docs.qodo.ai/governance/view-all-findings-in-organization" rel="noopener noreferrer"&gt;https://docs.qodo.ai/governance/view-all-findings-in-organization&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  A Practical Example
&lt;/h2&gt;

&lt;p&gt;Let's imagine your team created 150 pull requests over the last month.&lt;/p&gt;

&lt;p&gt;The dashboard initially looks healthy because review time is improving, deployment frequency has increased, and pull requests are moving smoothly.&lt;/p&gt;

&lt;p&gt;But when you start looking deeper, you notice that 42 pull requests had missing test coverage, 28 repeated similar validation problems, and dependency-related risks kept appearing across multiple repositories.&lt;/p&gt;

&lt;p&gt;The conversation naturally becomes more useful because people stop asking why reviews are slow and start asking why the same problems continue appearing repeatedly.&lt;/p&gt;

&lt;p&gt;That usually leads to more meaningful improvements because now the focus shifts from speed alone toward improving the development process itself.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Want to Read More?
&lt;/h2&gt;

&lt;p&gt;If you want to explore this area further, &lt;a href="//qodo.ai"&gt;Qodo&lt;/a&gt; has a &lt;a href="https://www.qodo.ai/academy/" rel="noopener noreferrer"&gt;learning hub&lt;/a&gt; with a few useful resources around AI-assisted review workflows and code quality.&lt;/p&gt;

&lt;p&gt;Some good starting points are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.qodo.ai/academy/ai-code-review/" rel="noopener noreferrer"&gt;What is AI Code Review&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
A good introduction to how AI review works and the kinds of problems it tries to catch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.qodo.ai/academy/ai-generated-code-in-enterprise/" rel="noopener noreferrer"&gt;Reviewing AI-generated Code&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Covers common patterns and mistakes teams are seeing as AI-generated code becomes more common.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.qodo.ai/academy/ai-code-review-tools-comparison-and-benchmarks/" rel="noopener noreferrer"&gt;AI Code Review Tools Comparison&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
Useful if you want to understand how different approaches and tools compare.&lt;/p&gt;




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

&lt;p&gt;Metrics like deployment frequency and lead time still matter and they will continue to matter. But they don't always explain why teams repeatedly run into certain problems.&lt;/p&gt;

&lt;p&gt;As development teams generate more code and AI continues increasing review volume, understanding review quality probably becomes more important too.&lt;/p&gt;

&lt;p&gt;Questions around recurring findings, issue resolution, and repeated patterns often tell a more complete story than review speed alone because they reveal the hidden work that teams keep paying for repeatedly.&lt;/p&gt;

&lt;p&gt;A fast pull request is useful, but a healthy review process is usually much more valuable over time.&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;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=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.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>codenewbie</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>AI Can Generate Code Faster. The Bigger Challenge Is Reviewing It 😐</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sat, 27 Jun 2026 18:46:30 +0000</pubDate>
      <link>https://dev.to/dev_kiran/ai-can-generate-code-faster-the-bigger-challenge-is-reviewing-it-1edf</link>
      <guid>https://dev.to/dev_kiran/ai-can-generate-code-faster-the-bigger-challenge-is-reviewing-it-1edf</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;AI coding assistants have changed the way many teams build software. Tasks like generating components, creating tests, writing boilerplate, or handling repetitive refactors can now happen in minutes instead of hours.&lt;/p&gt;

&lt;p&gt;The productivity gain is real and that part is easy to notice.&lt;/p&gt;

&lt;p&gt;What becomes interesting after using these tools for a while is that a different bottleneck starts appearing. Code generation becomes faster, but the review process often stays the same.&lt;/p&gt;

&lt;p&gt;Teams can generate hundreds of lines of code within minutes, but someone still has to answer important questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this actually solve the requirement?&lt;/li&gt;
&lt;li&gt;Are edge cases covered?&lt;/li&gt;
&lt;li&gt;Will this introduce side effects?&lt;/li&gt;
&lt;li&gt;Does it align with existing patterns?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The speed of writing code has changed. The need for confidence has not.&lt;/p&gt;

&lt;p&gt;That is where I think the conversation around AI-assisted development is starting to shift.&lt;/p&gt;

&lt;p&gt;The challenge is becoming less about generating code and more about making sure the generated code is actually safe to ship.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Reviewing AI-Generated Code Like Regular Code
&lt;/h2&gt;

&lt;p&gt;Imagine asking an AI coding assistant to implement coupon validation for premium users.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add coupon validation for premium users and create tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A few seconds later you get:&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;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isPremium&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
   &lt;span class="nf"&gt;applyCoupon&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;Nothing immediately looks wrong. The code is clean, there are no syntax issues, tests may pass, and the implementation appears complete.&lt;/p&gt;

&lt;p&gt;But pull request reviews usually go beyond reading diffs.&lt;/p&gt;

&lt;p&gt;Reviewers start asking questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens if the coupon has expired?&lt;/li&gt;
&lt;li&gt;Does this affect payment calculations?&lt;/li&gt;
&lt;li&gt;Should audit logs be updated?&lt;/li&gt;
&lt;li&gt;Are there services depending on this behavior?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where AI-generated code becomes interesting.&lt;/p&gt;

&lt;p&gt;It can often be functionally correct while still missing important implementation details. Research around larger AI-generated projects has also shown that functional correctness does not necessarily translate into maintainable system design. Teams still encounter duplicated logic, complexity growth, weak exception handling, and architectural inconsistencies.&lt;/p&gt;

&lt;p&gt;Eventually humans catch these issues.&lt;/p&gt;

&lt;p&gt;The question becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can we catch them earlier?&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  A Different Workflow: Cursor Builds, &lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; Reviews
&lt;/h2&gt;

&lt;p&gt;One thing I found interesting is thinking about AI code generation and AI review as two separate responsibilities.&lt;/p&gt;

&lt;p&gt;Instead of treating generation and validation as the same problem, &lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; positions itself as a quality layer across the development workflow.&lt;/p&gt;

&lt;p&gt;The process becomes something like:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate → Review → Push → Review Again → Ship&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather than:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate → Push → Hope the PR catches everything&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 1: Feed standards before code gets generated
&lt;/h3&gt;

&lt;p&gt;AI assistants work from context. If they do not know your architecture patterns, naming conventions, or domain rules, they fall back to generic assumptions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; introduces a shared rule system(&lt;a href="https://www.qodo.ai/blog/how-i-use-qodos-agent-skills-to-auto-fix-issues-in-pull-requests/" rel="noopener noreferrer"&gt;agent-skills&lt;/a&gt;) that can provide those standards before generation starts. The same rules used later in reviews can also guide code generation itself. That means expectations stay consistent throughout the workflow instead of changing between development and review.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Review locally before code leaves the IDE
&lt;/h3&gt;

&lt;p&gt;Most review feedback arrives after a pull request is opened.&lt;/p&gt;

&lt;p&gt;By then developers have often switched context and mentally moved on from the implementation.&lt;/p&gt;

&lt;p&gt;One thing &lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; does differently is shifting review earlier into development itself. Local changes can be reviewed directly inside the IDE before they ever reach a repository.&lt;/p&gt;

&lt;p&gt;That means issues such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing tests&lt;/li&gt;
&lt;li&gt;Duplicated logic&lt;/li&gt;
&lt;li&gt;Potential bugs&lt;/li&gt;
&lt;li&gt;Violations of team standards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;can surface while the implementation is still fresh in your head. &lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; describes this as a shift-left review approach where quality checks happen before PR discussions even begin.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 3: Review pull requests with full context
&lt;/h3&gt;

&lt;p&gt;Traditional PR reviews usually focus on changed lines.&lt;/p&gt;

&lt;p&gt;The challenge is that code changes rarely live in isolation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt;'s review system attempts to include broader context such as repository history, related code, dependencies, and organizational standards when evaluating a pull request. Multiple review agents then focus on different concerns like duplicated logic, breaking changes, critical bugs, and rule enforcement.&lt;/p&gt;

&lt;p&gt;That changes the type of feedback you receive.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Variable naming could improve&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You may get something closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This update changes payment behavior but related audit handling appears missing&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The feedback becomes more focused on intent and impact rather than surface-level observations.&lt;/p&gt;


&lt;h2&gt;
  
  
  AI Review Is Not Replacing Human Review
&lt;/h2&gt;

&lt;p&gt;I do not think AI review replaces engineers.&lt;/p&gt;

&lt;p&gt;Human reviewers still understand business decisions, architecture trade-offs, and product context in ways AI systems currently struggle with.&lt;/p&gt;

&lt;p&gt;Where AI review becomes useful is reducing repetitive work and helping teams focus attention where it matters.&lt;/p&gt;

&lt;p&gt;It can surface missing pieces, highlight risks, and point out areas worth investigating.&lt;/p&gt;

&lt;p&gt;The role feels less like replacing code review and more like adding another layer of verification.&lt;/p&gt;


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

&lt;p&gt;AI has already changed how quickly code gets written.&lt;/p&gt;

&lt;p&gt;The next challenge is making sure quality scales with that speed.&lt;/p&gt;

&lt;p&gt;What stood out to me is that &lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; is not trying to become another code generator. The idea seems closer to becoming a quality layer that sits alongside development and review workflows.&lt;/p&gt;

&lt;p&gt;Cursor builds.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo&lt;/a&gt; reviews.&lt;/p&gt;

&lt;p&gt;That separation actually feels natural.&lt;/p&gt;

&lt;p&gt;Because as teams generate more code with AI, confidence in what gets shipped becomes just as important as speed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Resources &amp;amp; Getting Started
&lt;/h2&gt;

&lt;p&gt;If you want to explore the workflow further, here are a few useful resources from Qodo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get started with Qodo:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://www.qodo.ai/" rel="noopener noreferrer"&gt;Qodo Platform&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation and setup guides:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://docs.qodo.ai/" rel="noopener noreferrer"&gt;Qodo Documentation&lt;/a&gt;&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;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=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.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>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Best AI Code Review Tools for Catching Breaking Changes 🔥</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Mon, 22 Jun 2026 19:51:45 +0000</pubDate>
      <link>https://dev.to/dev_kiran/best-ai-code-review-tools-for-catching-breaking-changes-51g2</link>
      <guid>https://dev.to/dev_kiran/best-ai-code-review-tools-for-catching-breaking-changes-51g2</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;Most code review tools are good at finding syntax problems, style issues, and missing test cases. The harder problem is finding changes that look harmless in a pull request but later break another service, API consumer, or application.&lt;/p&gt;

&lt;p&gt;A renamed field, a modified function signature, or a small schema change can easily pass review. The code itself still works, but the impact shows up after deployment.&lt;/p&gt;

&lt;p&gt;This is where &lt;a href="https://www.qodo.ai/academy/ai-code-review/" rel="noopener noreferrer"&gt;AI code review&lt;/a&gt; becomes more interesting. Instead of looking only at the current file, some tools can understand context and identify changes that might affect other parts of the system.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Quick Verdict
&lt;/h2&gt;

&lt;p&gt;&lt;a href="//qodo.ai"&gt;Qodo&lt;/a&gt; is the best &lt;a href="https://www.qodo.ai/academy/ai-code-review/" rel="noopener noreferrer"&gt;AI code review&lt;/a&gt; tool for catching breaking changes and reviewing high impact pull requests. It can fit naturally into GitHub workflows, analyze pull requests with more repository context, and focus on changes that can affect downstream systems.&lt;/p&gt;

&lt;p&gt;For teams dealing with shared APIs, AI generated code, or larger codebases with multiple dependencies, this becomes useful because the review is not only checking code quality. It is also asking whether the change can break something after deployment.&lt;/p&gt;

&lt;p&gt;That becomes even more useful when using a focused Breaking Changes agent that reviews things like API contracts, function signatures, interface changes, and backward compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually counts as a breaking change?
&lt;/h2&gt;

&lt;p&gt;Breaking changes usually happen when code changes affect consumers outside the current file or service.&lt;/p&gt;

&lt;p&gt;Common examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Function signature changes&lt;/li&gt;
&lt;li&gt;Removed or renamed fields&lt;/li&gt;
&lt;li&gt;API response updates&lt;/li&gt;
&lt;li&gt;Database schema modifications&lt;/li&gt;
&lt;li&gt;Shared library changes&lt;/li&gt;
&lt;li&gt;Interface updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Before:&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="p"&gt;{&lt;/span&gt;
   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;john@example.com&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;After:&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="p"&gt;{&lt;/span&gt;
   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fullName&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;John&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;john@example.com&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;The change itself looks small and clean. During review, many developers would approve this without a second thought.&lt;/p&gt;

&lt;p&gt;The issue starts when another service still expects the &lt;code&gt;name&lt;/code&gt; field. The code passes review, deployments succeed, and then suddenly downstream systems start failing.&lt;/p&gt;

&lt;p&gt;Traditional review tools often miss this because there is no syntax problem. The problem is the impact of the change.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. &lt;a href="//qodo.ai"&gt;Qodo&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="//qodo.ai"&gt;Qodo&lt;/a&gt; becomes interesting because it can focus on pull request reasoning instead of leaving generic comments on every file.&lt;/p&gt;

&lt;p&gt;Many AI review systems give suggestions around naming, formatting, or code cleanup. Those suggestions are useful, but they do not always help with production risks.&lt;/p&gt;

&lt;p&gt;A focused Breaking Changes agent could instead ask questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did an API contract change?&lt;/li&gt;
&lt;li&gt;Did a function signature change?&lt;/li&gt;
&lt;li&gt;Did a shared interface change?&lt;/li&gt;
&lt;li&gt;Can dependent services fail?&lt;/li&gt;
&lt;li&gt;Is backward compatibility affected?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Before:&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="nf"&gt;getUser&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;After:&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="nf"&gt;getUser&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="nx"&gt;includeMetadata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The code still works and tests might still pass.&lt;/p&gt;

&lt;p&gt;A Breaking Changes agent could still flag this and warn that consumers may still rely on the previous function signature. This creates more useful feedback because it focuses on downstream impact rather than only code style.&lt;/p&gt;

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

&lt;p&gt;Teams working with shared APIs, larger repositories, AI generated code, and pull requests where breaking downstream systems is a bigger concern.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. &lt;a href="https://github.com/features/copilot" rel="noopener noreferrer"&gt;GitHub Copilot&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot has already become part of many developer workflows and provides pull request summaries, code explanations, and development assistance.&lt;/p&gt;

&lt;p&gt;It works well when teams want a broad coding assistant inside GitHub.&lt;/p&gt;

&lt;p&gt;The limitation for this use case is that Copilot focuses more on overall developer productivity than specialized breaking change analysis.&lt;/p&gt;

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

&lt;p&gt;Teams looking for general AI assistance and coding productivity.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. &lt;a href="https://www.coderabbit.ai/" rel="noopener noreferrer"&gt;CodeRabbit&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;CodeRabbit automates pull request reviews and generates comments around changes.&lt;/p&gt;

&lt;p&gt;The setup process is simple and the pull request summaries can help teams handling a large number of reviews.&lt;/p&gt;

&lt;p&gt;Sometimes broader review systems generate many suggestions and comments. Over time developers can start ignoring reviews if too much low value feedback appears.&lt;/p&gt;

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

&lt;p&gt;Teams wanting automated pull request reviews with minimal setup.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. &lt;a href="https://aws.amazon.com/codeguru/profiler/" rel="noopener noreferrer"&gt;Amazon CodeGuru Reviewer&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Amazon CodeGuru Reviewer focuses more on code quality, performance, and security recommendations.&lt;/p&gt;

&lt;p&gt;It can identify inefficient code patterns and suggest improvements across applications running in AWS environments.&lt;/p&gt;

&lt;p&gt;Its focus is usually broader code quality analysis rather than contract awareness or downstream impact detection.&lt;/p&gt;

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

&lt;p&gt;AWS teams focused on performance and quality improvements.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. &lt;a href="https://www.sonarsource.com/products/sonarqube/" rel="noopener noreferrer"&gt;SonarQube&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;SonarQube has been a common choice for static analysis and code quality checks for years. With newer AI related capabilities and integrations, teams are using it alongside AI workflows.&lt;/p&gt;

&lt;p&gt;It performs well for identifying maintainability issues, security risks, and technical debt.&lt;/p&gt;

&lt;p&gt;Breaking changes can still require additional context because static analysis alone may not understand the impact across multiple systems.&lt;/p&gt;

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

&lt;p&gt;Teams that already rely heavily on code quality gates and static analysis.&lt;/p&gt;
&lt;h2&gt;
  
  
  6. &lt;a href="https://snyk.io/product/snyk-code/" rel="noopener noreferrer"&gt;Snyk Code&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Snyk Code mainly focuses on security analysis and code scanning.&lt;/p&gt;

&lt;p&gt;For development teams where security and review happen together, it can become part of the pull request workflow.&lt;/p&gt;

&lt;p&gt;While it is not designed specifically for breaking change detection, it helps catch risks that could eventually create larger issues in production.&lt;/p&gt;

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

&lt;p&gt;Security focused development teams.&lt;/p&gt;
&lt;h2&gt;
  
  
  Learning resources worth checking
&lt;/h2&gt;

&lt;p&gt;If you want to go deeper into AI code review, Qodo also has a &lt;a href="https://www.qodo.ai/academy/" rel="noopener noreferrer"&gt;learning hub&lt;/a&gt; with practical articles around the topic. Some useful pieces include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.qodo.ai/academy/ai-code-review/" rel="noopener noreferrer"&gt;What is AI code review&lt;/a&gt;, which explains how AI reviews work and what they can actually detect&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.qodo.ai/academy/ai-generated-code-in-enterprise/" rel="noopener noreferrer"&gt;Reviewing AI generated code&lt;/a&gt;, which covers common patterns and mistakes developers often miss&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These resources are useful if you want to understand not just the tools, but also the review process itself.&lt;/p&gt;
&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;When reviewing pull requests, the question is usually not whether AI can explain code better. The more useful question is whether the change can create problems after deployment.&lt;/p&gt;

&lt;p&gt;A tool that creates twenty comments is not always more valuable than a tool that catches one issue that could break production.&lt;/p&gt;

&lt;p&gt;For catching breaking changes, fewer and more relevant signals usually provide more value than large amounts of feedback.&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;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=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.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>programming</category>
      <category>productivity</category>
      <category>ai</category>
      <category>tooling</category>
    </item>
    <item>
      <title>🔥7 Tools Every AI Agent Developer Should Know in 2026</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Mon, 22 Jun 2026 06:38:55 +0000</pubDate>
      <link>https://dev.to/dev_kiran/7-tools-every-ai-agent-developer-should-know-in-2026-5471</link>
      <guid>https://dev.to/dev_kiran/7-tools-every-ai-agent-developer-should-know-in-2026-5471</guid>
      <description>&lt;p&gt;Hello Devs👋&lt;/p&gt;

&lt;p&gt;A year ago, most AI projects were glorified chatbots.&lt;/p&gt;

&lt;p&gt;Today, we're building agents that browse websites, execute workflows, analyze data, monitor systems, interact with SaaS products, and collaborate with humans.&lt;/p&gt;

&lt;p&gt;The challenge is no longer getting an LLM to answer questions. The challenge is giving AI agents reliable access to the real world.&lt;/p&gt;

&lt;p&gt;After experimenting with dozens of frameworks and platforms, I've found that successful AI agents usually rely on a small set of tools that solve very specific problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reasoning&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Browser interaction&lt;/li&gt;
&lt;li&gt;Workflow orchestration&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Knowledge retrieval&lt;/li&gt;
&lt;li&gt;Human collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building AI agents in 2026, these are seven tools worth knowing.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. &lt;a href="https://www.browseract.ai/Kiran" rel="noopener noreferrer"&gt;BrowserAct&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Most AI agents fail when they leave the comfort of APIs and enter the browser.&lt;/p&gt;

&lt;p&gt;Modern websites are full of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic content&lt;/li&gt;
&lt;li&gt;Login flows&lt;/li&gt;
&lt;li&gt;CAPTCHA challenges&lt;/li&gt;
&lt;li&gt;Anti-bot systems&lt;/li&gt;
&lt;li&gt;Multi-step workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where BrowserAct becomes interesting.&lt;/p&gt;

&lt;p&gt;BrowserAct is a browser automation CLI built for AI agents. It gives agents real browser control, anti-detection browser environments, human handoff when automation gets stuck, parallel sessions that do not interfere with each other, and independent browser identities for multi-account workflows.&lt;/p&gt;

&lt;p&gt;Instead of simply opening pages and clicking buttons, it helps agents operate inside real-world browser environments while supporting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anti-detection browser profiles&lt;/li&gt;
&lt;li&gt;Session management&lt;/li&gt;
&lt;li&gt;Human handoff&lt;/li&gt;
&lt;li&gt;Parallel browser tasks&lt;/li&gt;
&lt;li&gt;Multi-account isolation&lt;/li&gt;
&lt;li&gt;Reusable browser skills&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I tested a simple BrowserAct workflow locally first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installing BrowserAct:&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;uv tool &lt;span class="nb"&gt;install &lt;/span&gt;browser-act-cli &lt;span class="nt"&gt;--python&lt;/span&gt; 3.12
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx7ezda0fyjr4q0jhhehk.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx7ezda0fyjr4q0jhhehk.png" alt="BrowserAct"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To run my local browser, I listed the available browser profiles.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act browser list-profiles
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc7s9esn9q4w9vli5jiq2.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc7s9esn9q4w9vli5jiq2.png" alt="browser-act browser list-profiles"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I then created a browser using my existing Chrome profile.&lt;/p&gt;

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

&lt;p&gt;Now, Im going to extract the content from the website example.com&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act stealth-extract https://example.com &lt;span class="nt"&gt;--content-type&lt;/span&gt; markdown
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6za78wnbdyfhhceblotp.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6za78wnbdyfhhceblotp.png" alt="browser-act stealth-extract"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Using BrowserAct with an AI Agent
&lt;/h3&gt;

&lt;p&gt;I'm using Codex as the agent runtime for this experiment.&lt;/p&gt;

&lt;p&gt;We can instruct the agent to use &lt;code&gt;browser-act&lt;/code&gt; whenever browser interaction is required, such as opening pages, clicking buttons, handling login flows, or extracting structured data.&lt;/p&gt;

&lt;p&gt;Here is my Agent prompt.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Set up BrowserAct &lt;span class="k"&gt;for &lt;/span&gt;me. Read the BrowserAct skill first: &lt;span class="o"&gt;[&lt;/span&gt;https://github.com/browser-act/skills/tree/main/browser-act]&lt;span class="o"&gt;(&lt;/span&gt;https://github.com/browser-act/skills/blob/main/browser-act/SKILL.md&lt;span class="o"&gt;)&lt;/span&gt;/SKILL.md Install or update the browser-act skill, &lt;span class="k"&gt;then &lt;/span&gt;verify it works. Use BrowserAct when I need an AI agent to browse, click, fill forms, handle login flows, solve CAPTCHAs, bypass bot detection, or extract structured data from websites. After setup, open this repository &lt;span class="k"&gt;in &lt;/span&gt;my browser: https://github.com/browser-act/skills If I am logged &lt;span class="k"&gt;in &lt;/span&gt;to GitHub, ask me whether you should star it &lt;span class="k"&gt;for &lt;/span&gt;me as a quick demo that browser interaction works. Only click the star &lt;span class="k"&gt;if &lt;/span&gt;I explicitly say yes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Here is how the agent executed the workflow:&lt;/p&gt;

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

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

&lt;p&gt;The agent successfully completed the task and starred the repository after receiving explicit confirmation.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;While starring a repository is simple, the important part is that the agent successfully opened a real website, preserved browser state, interacted with UI elements, and completed an action inside an authenticated session.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Real Use Case: Competitor Monitoring Agent
&lt;/h2&gt;

&lt;p&gt;Imagine building an agent that monitors competitor pricing across multiple ecommerce platforms.&lt;/p&gt;

&lt;p&gt;A simple scraper often breaks because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pages require login&lt;/li&gt;
&lt;li&gt;Content is dynamically rendered&lt;/li&gt;
&lt;li&gt;Risk-control systems trigger&lt;/li&gt;
&lt;li&gt;Browser fingerprints get flagged&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With BrowserAct, the workflow becomes:&lt;/p&gt;

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

&lt;p&gt;The key advantage is that browser identity, cookies, proxies, and session state remain isolated and reusable.&lt;/p&gt;
&lt;h3&gt;
  
  
  Real Use Case: Human Handoff
&lt;/h3&gt;

&lt;p&gt;Every automation eventually encounters a step that requires a human.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;QR code login&lt;/li&gt;
&lt;li&gt;SMS verification&lt;/li&gt;
&lt;li&gt;Enterprise SSO approval&lt;/li&gt;
&lt;li&gt;Security confirmation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most automation tools simply fail at this point.&lt;/p&gt;

&lt;p&gt;BrowserAct keeps the browser session alive and allows a human to complete the required action. Once verification is finished, the agent continues from the same session instead of restarting the workflow.&lt;/p&gt;

&lt;p&gt;This sounds simple, but it solves one of the most common production bottlenecks in browser-based agents.&lt;/p&gt;
&lt;h4&gt;
  
  
  Testing Human Handoff with an AI Agent
&lt;/h4&gt;

&lt;p&gt;To see how BrowserAct handles real interruptions, I tested the workflow using Codex as the AI agent runtime.&lt;/p&gt;

&lt;p&gt;The goal was simple: let the agent handle the login process automatically, pause when human input becomes necessary, and then continue from the same browser session.&lt;/p&gt;

&lt;p&gt;Here is the prompt I gave the agent:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use BrowserAct for this workflow.

Open:
https://practice.expandtesting.com/otp-login

Actions:

1. Launch BrowserAct
2. Open the OTP login page
3. Fill the email field with:
   practice@expandtesting.com
4. Continue the login flow
5. If OTP verification is required:

   - Preserve browser state
   - Pause execution
   - Ask me for the OTP code
   - Wait for my response

6. After I provide the OTP:
   - Resume from the same session
   - Complete login
   - Confirm success

Do not restart the browser session if human input is needed.
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm7wp8cg3x741vip3aalt.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm7wp8cg3x741vip3aalt.png" alt="Agent Prompt"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Here is the Agent executions
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Agent creating a browser session called &lt;em&gt;expandtesting_otp_login&lt;/em&gt; for the execution&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9zeg37raunkdbi064i5.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr9zeg37raunkdbi064i5.png" alt="_expandtesting_otp_login_ "&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The agent entered the email automatically and paused at the &lt;strong&gt;OTP&lt;/strong&gt; step while preserving the browser session.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fang4sxm7joxj0h8z5u4v.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fang4sxm7joxj0h8z5u4v.png" alt="OTP"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After I provided the OTP, the agent resumed execution and completed authentication successfully.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F80puxsgx81v4jw5e1iec.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F80puxsgx81v4jw5e1iec.png" alt="Success"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What stood out here was not the OTP itself.&lt;/p&gt;

&lt;p&gt;The interesting part was that the browser session remained active throughout the interruption. The workflow continued from the existing state instead of restarting the login process from the beginning.&lt;/p&gt;
&lt;h3&gt;
  
  
  Real Use Case: Multi-Agent Operations
&lt;/h3&gt;

&lt;p&gt;Suppose you're running:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer support monitoring&lt;/li&gt;
&lt;li&gt;Order review&lt;/li&gt;
&lt;li&gt;Feedback analysis&lt;/li&gt;
&lt;li&gt;Dashboard reporting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of forcing everything into one browser session, BrowserAct allows each task to run independently while maintaining the required account state.&lt;/p&gt;

&lt;p&gt;To understand how BrowserAct handles parallel workflows, I created multiple independent browser sessions locally.&lt;/p&gt;

&lt;p&gt;Start separate browser sessions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="nt"&gt;--session&lt;/span&gt; reviews browser open chrome_local_102863481715294440 https://reddit.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="nt"&gt;--session&lt;/span&gt; ops browser open chrome_local_102863481715294440 https://status.openai.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act &lt;span class="nt"&gt;--session&lt;/span&gt; dev-community browser open chrome_local_102863481715294440 https://dev.to
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Checking active browser sessions:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;browser-act session list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;/p&gt;

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

&lt;p&gt;The active session list showed that each workflow was isolated even though the browser profile remained shared.&lt;/p&gt;

&lt;p&gt;This separation matters for long-running AI systems because browser state, cookies, and task execution stay independent and avoid cross-workflow interference.&lt;/p&gt;

&lt;p&gt;For teams building agents that interact heavily with web applications, BrowserAct fills a gap that traditional browser automation tools were never designed to solve.&lt;/p&gt;

&lt;p&gt;GitHub Repo:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://github.com/browser-act/skills" rel="noopener noreferrer"&gt;https://github.com/browser-act/skills&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  2. LangGraph by LangChain
&lt;/h2&gt;

&lt;p&gt;Reasoning alone is rarely enough for production agents.&lt;/p&gt;

&lt;p&gt;As agents become more capable, you quickly run into problems like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-step workflows&lt;/li&gt;
&lt;li&gt;Long-running tasks&lt;/li&gt;
&lt;li&gt;Human approvals&lt;/li&gt;
&lt;li&gt;State persistence&lt;/li&gt;
&lt;li&gt;Multi-agent coordination&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where LangGraph becomes useful.&lt;/p&gt;

&lt;p&gt;LangGraph is designed specifically for building stateful AI agents that operate through graph-based workflows rather than simple request-response loops.&lt;/p&gt;

&lt;p&gt;Instead of forcing everything into a single prompt, it allows developers to define controlled execution paths while still preserving agent flexibility.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stateful workflows&lt;/li&gt;
&lt;li&gt;Human-in-the-loop checkpoints&lt;/li&gt;
&lt;li&gt;Durable execution&lt;/li&gt;
&lt;li&gt;Multi-agent coordination&lt;/li&gt;
&lt;li&gt;Retry and recovery handling&lt;/li&gt;
&lt;li&gt;Streaming execution&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Real Use Case: Customer Support Agent
&lt;/h3&gt;

&lt;p&gt;Imagine a support agent handling enterprise tickets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read ticket details&lt;/li&gt;
&lt;li&gt;Retrieve account information&lt;/li&gt;
&lt;li&gt;Check documentation&lt;/li&gt;
&lt;li&gt;Escalate complex issues&lt;/li&gt;
&lt;li&gt;Request human approval when needed&lt;/li&gt;
&lt;li&gt;Return a final response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without orchestration, these workflows become messy very quickly.&lt;/p&gt;

&lt;p&gt;LangGraph helps structure the decision flow while preserving memory and state.&lt;/p&gt;

&lt;p&gt;Repository / Docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.langchain.com/oss/python/langgraph/overview" rel="noopener noreferrer"&gt;&lt;strong&gt;https://docs.langchain.com/oss/python/langgraph/overview&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Mem0 by Mem0
&lt;/h2&gt;

&lt;p&gt;Most agents have terrible memory.&lt;/p&gt;

&lt;p&gt;They either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forget previous interactions&lt;/li&gt;
&lt;li&gt;Stuff everything into context windows&lt;/li&gt;
&lt;li&gt;Waste tokens repeatedly&lt;/li&gt;
&lt;li&gt;Lose long-term user preferences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mem0 solves this problem by acting as a persistent memory layer for AI agents.&lt;/p&gt;

&lt;p&gt;Rather than replaying full conversations every time, it extracts useful information, stores it, and retrieves only what matters.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent long-term memory&lt;/li&gt;
&lt;li&gt;Automatic memory extraction&lt;/li&gt;
&lt;li&gt;Memory compression&lt;/li&gt;
&lt;li&gt;Cross-session recall&lt;/li&gt;
&lt;li&gt;User preference tracking&lt;/li&gt;
&lt;li&gt;Reduced token usage&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Real Use Case: AI Personal Assistant
&lt;/h3&gt;

&lt;p&gt;Imagine an assistant helping a user over several months.&lt;/p&gt;

&lt;p&gt;Instead of repeatedly asking:&lt;/p&gt;

&lt;p&gt;"What programming language do you use?"&lt;br&gt;
"What projects are you working on?"&lt;br&gt;
"What are your preferences?"&lt;/p&gt;

&lt;p&gt;The agent remembers previous interactions and becomes more useful over time.&lt;/p&gt;

&lt;p&gt;This makes interactions feel less like chatting with a stateless model and more like working with an actual assistant.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. n8n
&lt;/h2&gt;

&lt;p&gt;Building an AI agent is one thing.&lt;/p&gt;

&lt;p&gt;Connecting it to the rest of your stack is a completely different challenge.&lt;/p&gt;

&lt;p&gt;Agents rarely operate in isolation. They usually need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trigger workflows&lt;/li&gt;
&lt;li&gt;Update databases&lt;/li&gt;
&lt;li&gt;Send emails&lt;/li&gt;
&lt;li&gt;Connect with SaaS products&lt;/li&gt;
&lt;li&gt;Call APIs&lt;/li&gt;
&lt;li&gt;Execute scheduled tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where n8n becomes useful.&lt;/p&gt;

&lt;p&gt;n8n is a workflow automation platform that helps AI agents interact with external systems through visual workflows and programmable logic.&lt;/p&gt;

&lt;p&gt;Instead of writing custom integrations for every service, developers can connect agents to hundreds of tools while keeping workflows manageable.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual workflow builder&lt;/li&gt;
&lt;li&gt;AI agent integrations&lt;/li&gt;
&lt;li&gt;Self-hosted deployment&lt;/li&gt;
&lt;li&gt;API connectivity&lt;/li&gt;
&lt;li&gt;Scheduled workflows&lt;/li&gt;
&lt;li&gt;Large integration ecosystem&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Real Use Case: Lead Qualification Agent
&lt;/h3&gt;

&lt;p&gt;Imagine an AI sales agent processing incoming leads:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read lead information&lt;/li&gt;
&lt;li&gt;Analyze qualification criteria&lt;/li&gt;
&lt;li&gt;Update CRM records&lt;/li&gt;
&lt;li&gt;Send personalized emails&lt;/li&gt;
&lt;li&gt;Create support tickets&lt;/li&gt;
&lt;li&gt;Notify sales teams&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without workflow orchestration, every integration requires additional code and maintenance.&lt;/p&gt;

&lt;p&gt;n8n helps coordinate these actions while keeping the workflow transparent and easy to modify.&lt;/p&gt;

&lt;p&gt;Link / Docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;&lt;strong&gt;https://n8n.io/&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Langfuse
&lt;/h2&gt;

&lt;p&gt;AI agents become difficult to debug once they move into production.&lt;/p&gt;

&lt;p&gt;When something goes wrong, questions appear quickly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why did the agent fail?&lt;/li&gt;
&lt;li&gt;Which prompt caused the issue?&lt;/li&gt;
&lt;li&gt;Which tool produced incorrect output?&lt;/li&gt;
&lt;li&gt;Why did token usage suddenly increase?&lt;/li&gt;
&lt;li&gt;Why did response quality drop?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where Langfuse becomes useful.&lt;/p&gt;

&lt;p&gt;Langfuse is an observability platform designed for LLM applications and AI agents.&lt;/p&gt;

&lt;p&gt;Instead of guessing what happened during execution, developers can inspect traces, prompts, model outputs, evaluations, and performance metrics.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request tracing&lt;/li&gt;
&lt;li&gt;Prompt debugging&lt;/li&gt;
&lt;li&gt;Agent evaluation&lt;/li&gt;
&lt;li&gt;Cost monitoring&lt;/li&gt;
&lt;li&gt;Performance analytics&lt;/li&gt;
&lt;li&gt;Session replay&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Real Use Case: Production Agent Debugging
&lt;/h3&gt;

&lt;p&gt;Imagine a customer support agent that suddenly starts returning poor responses.&lt;/p&gt;

&lt;p&gt;A typical debugging workflow might look like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open execution traces&lt;/li&gt;
&lt;li&gt;Inspect prompts&lt;/li&gt;
&lt;li&gt;Review tool outputs&lt;/li&gt;
&lt;li&gt;Analyze model decisions&lt;/li&gt;
&lt;li&gt;Compare successful runs&lt;/li&gt;
&lt;li&gt;Identify failure patterns&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without observability, debugging often becomes trial and error.&lt;/p&gt;

&lt;p&gt;Langfuse helps developers understand what actually happened during execution.&lt;/p&gt;

&lt;p&gt;Link / Docs:&lt;/p&gt;

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


&lt;h2&gt;
  
  
  6. Qdrant
&lt;/h2&gt;

&lt;p&gt;Many AI agents become significantly more useful when they can access external knowledge.&lt;/p&gt;

&lt;p&gt;The challenge is that agents often need to work with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Internal knowledge bases&lt;/li&gt;
&lt;li&gt;PDFs&lt;/li&gt;
&lt;li&gt;Support tickets&lt;/li&gt;
&lt;li&gt;Research data&lt;/li&gt;
&lt;li&gt;Large collections of text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where Qdrant becomes useful.&lt;/p&gt;

&lt;p&gt;Qdrant is a vector database designed for semantic search and retrieval workflows.&lt;/p&gt;

&lt;p&gt;Instead of relying only on the model's built-in knowledge, developers can store embeddings and retrieve relevant information dynamically.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vector search&lt;/li&gt;
&lt;li&gt;Hybrid search&lt;/li&gt;
&lt;li&gt;Metadata filtering&lt;/li&gt;
&lt;li&gt;Scalable retrieval&lt;/li&gt;
&lt;li&gt;Fast indexing&lt;/li&gt;
&lt;li&gt;Production deployment support&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Real Use Case: Internal Knowledge Assistant
&lt;/h3&gt;

&lt;p&gt;Imagine building an AI assistant for a company.&lt;/p&gt;

&lt;p&gt;The workflow could look like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User asks a question&lt;/li&gt;
&lt;li&gt;Generate embeddings&lt;/li&gt;
&lt;li&gt;Search relevant documents&lt;/li&gt;
&lt;li&gt;Retrieve matching information&lt;/li&gt;
&lt;li&gt;Add context to the prompt&lt;/li&gt;
&lt;li&gt;Generate a final answer&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without retrieval systems, the model depends only on what it already knows.&lt;/p&gt;

&lt;p&gt;Qdrant helps agents access updated information and organization-specific knowledge.&lt;/p&gt;

&lt;p&gt;Link / Docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://qdrant.tech/" rel="noopener noreferrer"&gt;&lt;strong&gt;https://qdrant.tech&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  7. HumanLayer
&lt;/h2&gt;

&lt;p&gt;No matter how capable AI agents become, some decisions still require human involvement.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Financial approvals&lt;/li&gt;
&lt;li&gt;Sensitive actions&lt;/li&gt;
&lt;li&gt;Escalations&lt;/li&gt;
&lt;li&gt;Security checks&lt;/li&gt;
&lt;li&gt;Compliance reviews&lt;/li&gt;
&lt;li&gt;Critical business decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where HumanLayer becomes useful.&lt;/p&gt;

&lt;p&gt;HumanLayer is designed to add human approval and collaboration workflows into AI agents.&lt;/p&gt;

&lt;p&gt;Instead of allowing agents to operate without oversight, developers can introduce checkpoints where humans review and approve actions before execution continues.&lt;/p&gt;

&lt;p&gt;Key capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Human approval workflows&lt;/li&gt;
&lt;li&gt;Slack integration&lt;/li&gt;
&lt;li&gt;Escalation handling&lt;/li&gt;
&lt;li&gt;Human checkpoints&lt;/li&gt;
&lt;li&gt;Agent collaboration&lt;/li&gt;
&lt;li&gt;Action gating&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Real Use Case: Financial Approval Agent
&lt;/h3&gt;

&lt;p&gt;Imagine an AI agent responsible for preparing payment requests:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gather payment information&lt;/li&gt;
&lt;li&gt;Validate transaction details&lt;/li&gt;
&lt;li&gt;Generate recommendations&lt;/li&gt;
&lt;li&gt;Send approval request&lt;/li&gt;
&lt;li&gt;Wait for human confirmation&lt;/li&gt;
&lt;li&gt;Execute approved actions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Without human collaboration layers, agents may perform actions that require oversight.&lt;/p&gt;

&lt;p&gt;HumanLayer helps agents safely involve people when decisions become sensitive.&lt;/p&gt;

&lt;p&gt;Link / Docs:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://humanlayer.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;https://humanlayer.dev&lt;/strong&gt;&lt;/a&gt;&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;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=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.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>cli</category>
      <category>automation</category>
    </item>
    <item>
      <title>Wiring AI Code Review into a Bitbucket + Jira Workflow</title>
      <dc:creator>Kiran Naragund</dc:creator>
      <pubDate>Sun, 21 Jun 2026 19:02:11 +0000</pubDate>
      <link>https://dev.to/dev_kiran/wiring-ai-code-review-into-a-bitbucket-jira-workflow-1ke8</link>
      <guid>https://dev.to/dev_kiran/wiring-ai-code-review-into-a-bitbucket-jira-workflow-1ke8</guid>
      <description>&lt;p&gt;Hello Devs 👋&lt;/p&gt;

&lt;p&gt;If your team uses Bitbucket + Jira, your workflow probably looks something like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick a Jira ticket&lt;/li&gt;
&lt;li&gt;Create a branch&lt;/li&gt;
&lt;li&gt;Push code&lt;/li&gt;
&lt;li&gt;Open a pull request&lt;/li&gt;
&lt;li&gt;Get reviews&lt;/li&gt;
&lt;li&gt;Merge and close the ticket&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pretty straightforward.&lt;/p&gt;

&lt;p&gt;But as projects start growing and more developers join the team, things slowly become messy.&lt;/p&gt;

&lt;p&gt;You start seeing situations like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PRs with very little context&lt;/li&gt;
&lt;li&gt;Requirements getting missed during implementation&lt;/li&gt;
&lt;li&gt;The same review comments appearing repeatedly&lt;/li&gt;
&lt;li&gt;Tickets marked as "done" while edge cases are still missing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most discussions around AI code review focus heavily on GitHub workflows.&lt;/p&gt;

&lt;p&gt;But many teams still work inside Bitbucket + Jira every day.&lt;/p&gt;

&lt;p&gt;So I wanted to understand something:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where does AI code review actually fit into this workflow?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not just PR summaries. Not just generated comments..&lt;/p&gt;

&lt;p&gt;Can it actually help developers during day-to-day work?&lt;/p&gt;

&lt;p&gt;Let's get into it 🚀&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Bitbucket + Jira Workflows Feel Different
&lt;/h2&gt;

&lt;p&gt;Bitbucket and Jira already integrate really well.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Link branches directly to Jira tickets&lt;/li&gt;
&lt;li&gt;Connect pull requests to issues&lt;/li&gt;
&lt;li&gt;Track development progress automatically&lt;/li&gt;
&lt;li&gt;Trigger CI/CD workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem usually is not integration.&lt;/p&gt;

&lt;p&gt;The harder part is making sure implementation actually matches what the ticket intended.&lt;/p&gt;

&lt;p&gt;Review discussions often become:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did we update all affected services?&lt;/li&gt;
&lt;li&gt;Does this fully match the Jira requirement?&lt;/li&gt;
&lt;li&gt;Are tests missing?&lt;/li&gt;
&lt;li&gt;Could this change affect something else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Human reviewers catch a lot of this. But not always.&lt;/p&gt;

&lt;p&gt;That's where AI review starts becoming interesting. Not as a replacement for reviews. More like an additional validation layer.&lt;/p&gt;




&lt;h3&gt;
  
  
  A Simple Bitbucket + Jira Workflow
&lt;/h3&gt;

&lt;p&gt;Let’s take a basic example.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Create a Jira ticket
&lt;/h4&gt;

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

&lt;p&gt;&lt;strong&gt;PAY-142&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"&lt;em&gt;Add coupon validation for premium users&lt;/em&gt;"&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 2: Create a linked branch
&lt;/h4&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;feature/PAY-142-coupon-validation&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bitbucket automatically links the branch with Jira.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3: Implement the change
&lt;/h4&gt;

&lt;p&gt;You add something like:&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;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isPremium&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
   &lt;span class="nf"&gt;applyCoupon&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;Looks fine.&lt;/p&gt;

&lt;p&gt;PR opens successfully.&lt;/p&gt;

&lt;p&gt;Tests pass.&lt;/p&gt;

&lt;p&gt;Everything seems okay.&lt;/p&gt;
&lt;h4&gt;
  
  
  Step 4: Review the PR
&lt;/h4&gt;

&lt;p&gt;Normally reviewers look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code quality&lt;/li&gt;
&lt;li&gt;Naming&lt;/li&gt;
&lt;li&gt;Logic&lt;/li&gt;
&lt;li&gt;Tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI reviewers can add another layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did related files also need updates?&lt;/li&gt;
&lt;li&gt;Are edge cases missing?&lt;/li&gt;
&lt;li&gt;Does the implementation fully match the ticket?&lt;/li&gt;
&lt;li&gt;Could this affect shared services?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of replacing reviews, it helps fill small gaps.&lt;/p&gt;


&lt;h2&gt;
  
  
  Where I Found &lt;a href="//qodo.ai"&gt;Qodo&lt;/a&gt; Interesting
&lt;/h2&gt;

&lt;p&gt;While exploring AI review tools for this workflow, one thing I noticed with &lt;a href="//qodo.ai"&gt;Qodo&lt;/a&gt; was that it tries to review more than just the changed lines inside a pull request.&lt;/p&gt;

&lt;p&gt;Instead of focusing only on the PR diff, it attempts to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Related files&lt;/li&gt;
&lt;li&gt;Existing code patterns&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Previous review context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Imagine the Jira ticket says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add audit logging for payment updates&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Implementation:&lt;/p&gt;

&lt;p&gt;updatePayment();&lt;/p&gt;

&lt;p&gt;The code works.&lt;/p&gt;

&lt;p&gt;Tests pass.&lt;/p&gt;

&lt;p&gt;PR gets approved.&lt;/p&gt;

&lt;p&gt;Everything looks fine.&lt;/p&gt;

&lt;p&gt;Except logging was never added.&lt;/p&gt;

&lt;p&gt;Traditional checks may not catch that.&lt;/p&gt;

&lt;p&gt;A reviewer might miss it too.&lt;/p&gt;

&lt;p&gt;In larger projects, where a single Jira ticket touches multiple files or services, having another layer looking for missing pieces can be useful.&lt;/p&gt;

&lt;p&gt;I liked this because it felt less like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Here's a random AI suggestion"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and more like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Something related to this change might be missing"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That context becomes more useful as projects grow.&lt;/p&gt;


&lt;h3&gt;
  
  
  SonarQube vs AI Review in This Workflow
&lt;/h3&gt;

&lt;p&gt;SonarQube still has an important role.&lt;/p&gt;

&lt;p&gt;It helps with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Security checks&lt;/li&gt;
&lt;li&gt;✅ Code smells&lt;/li&gt;
&lt;li&gt;✅ Quality gates&lt;/li&gt;
&lt;li&gt;✅ Coverage rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But SonarQube mainly answers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is something technically wrong?&lt;/li&gt;
&lt;li&gt;AI review often tries to answer:&lt;/li&gt;
&lt;li&gt;Does this implementation make sense in context?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both solve different problems.&lt;/p&gt;


&lt;h2&gt;
  
  
  📚 Want to Read More?
&lt;/h2&gt;

&lt;p&gt;If you want to learn more about AI-assisted reviews and workflows, Qodo has a &lt;a href="https://www.qodo.ai/academy/" rel="noopener noreferrer"&gt;learning hub&lt;/a&gt; with some useful resources.&lt;/p&gt;

&lt;p&gt;A few interesting ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.qodo.ai/academy/ai-code-review/" rel="noopener noreferrer"&gt;What is AI Code Review&lt;/a&gt;&lt;br&gt;
Good starting point if you want to understand how AI review works and what it tries to catch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.qodo.ai/academy/ai-generated-code-in-enterprise/" rel="noopener noreferrer"&gt;Reviewing AI Generated Code&lt;/a&gt;&lt;br&gt;
Covers common mistakes and patterns teams see when reviewing AI-written code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.qodo.ai/academy/ai-code-review-tools-comparison-and-benchmarks/" rel="noopener noreferrer"&gt;AI Code Review Tools Comparison&lt;/a&gt;&lt;br&gt;
Useful if you want to compare approaches and understand where different tools fit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;AI code review is not replacing Jira workflows or human reviewers.&lt;/p&gt;

&lt;p&gt;It adds another layer between:&lt;/p&gt;

&lt;p&gt;Ticket → Code → Pull Request&lt;/p&gt;

&lt;p&gt;For Bitbucket + Jira teams, that can help reduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Missing requirements&lt;/li&gt;
&lt;li&gt;Repeated review comments&lt;/li&gt;
&lt;li&gt;Small issues that become larger problems later&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most discussions online focus on GitHub.&lt;/p&gt;

&lt;p&gt;But for teams already using Bitbucket and Jira every day, there is still a lot of value in adding AI review to the workflow.&lt;/p&gt;
&lt;h2&gt;
  
  
  👨‍💻 TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ Jira tracks requirements&lt;/li&gt;
&lt;li&gt;✅ Bitbucket manages code changes&lt;/li&gt;
&lt;li&gt;✅ AI review adds another validation layer&lt;/li&gt;
&lt;li&gt;✅ Useful when PRs affect multiple files or services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As always, tools help, but good reviews still need humans.&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;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=150,height=150,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.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>productivity</category>
      <category>automation</category>
    </item>
    <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://dev.to/dev_kiran/from-mvp-to-production-tools-that-grow-with-your-saas-148</link>
      <guid>https://dev.to/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://dev.to/dev_kiran/enterprise-ai-code-review-in-real-world-teams-4m5l</link>
      <guid>https://dev.to/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://dev.to/dev_kiran/can-ai-code-review-actually-improve-dora-metrics-3790</link>
      <guid>https://dev.to/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://dev.to/dev_kiran/setting-up-ai-code-review-in-bitbucket-a-practical-guide-and-comparison-19dp</link>
      <guid>https://dev.to/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>
  </channel>
</rss>
