<?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: DebtDraft</title>
    <description>The latest articles on DEV Community by DebtDraft (@debtdraft).</description>
    <link>https://dev.to/debtdraft</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%2F4177977%2F5a35162b-794a-4c1d-bb03-03d6c9736473.png</url>
      <title>DEV Community: DebtDraft</title>
      <link>https://dev.to/debtdraft</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/debtdraft"/>
    <language>en</language>
    <item>
      <title>Code Quality Tools for GitHub: SonarQube Alternatives (2026)</title>
      <dc:creator>DebtDraft</dc:creator>
      <pubDate>Sat, 31 Oct 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/debtdraft/code-quality-tools-for-github-sonarqube-alternatives-2026-6e</link>
      <guid>https://dev.to/debtdraft/code-quality-tools-for-github-sonarqube-alternatives-2026-6e</guid>
      <description>&lt;p&gt;If you want code quality feedback on every pull request, SonarQube is the name everyone knows. It is also not the only option, and for some GitHub teams it is not the easiest one. This guide compares the main alternatives by what they cost, how they charge, what they check, and who they suit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Want the closest full replacement with many languages? Look at &lt;strong&gt;Codacy&lt;/strong&gt; or &lt;strong&gt;DeepSource&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want one health score on every pull request, plus stats and trend lines for each repository, for JavaScript or TypeScript projects? Look at &lt;strong&gt;DebtDraft&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want security scanning first? Look at &lt;strong&gt;Semgrep&lt;/strong&gt;, &lt;strong&gt;Snyk Code&lt;/strong&gt;, or &lt;strong&gt;CodeQL&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want to find which files cost your team the most? Look at &lt;strong&gt;CodeScene&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want coverage reports only? Look at &lt;strong&gt;Codecov&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want an AI reviewer to comment on pull requests? Look at &lt;strong&gt;CodeRabbit&lt;/strong&gt;. It is a different kind of tool from the rest.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparison table
&lt;/h2&gt;

&lt;p&gt;Prices checked 2026-10-30 on each vendor's page.&lt;/p&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;Free option&lt;/th&gt;
&lt;th&gt;Paid price&lt;/th&gt;
&lt;th&gt;Charged by&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DebtDraft&lt;/td&gt;
&lt;td&gt;Up to three connected repositories&lt;/td&gt;
&lt;td&gt;Pro $9 a month or $90 a year&lt;/td&gt;
&lt;td&gt;Account, flat price&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SonarQube Cloud&lt;/td&gt;
&lt;td&gt;Private projects up to 50k lines of code&lt;/td&gt;
&lt;td&gt;Team from $34 a month for up to 100k lines&lt;/td&gt;
&lt;td&gt;Lines of code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codacy&lt;/td&gt;
&lt;td&gt;Developer plan; free for open source&lt;/td&gt;
&lt;td&gt;Team $18 per dev a month billed yearly ($21 monthly), up to 30 devs&lt;/td&gt;
&lt;td&gt;Developer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSource&lt;/td&gt;
&lt;td&gt;Open Source plan, public repos only&lt;/td&gt;
&lt;td&gt;Team $24 per user a month billed yearly&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qlty&lt;/td&gt;
&lt;td&gt;1,000 analysis minutes a month, no trends&lt;/td&gt;
&lt;td&gt;Pro $20 per contributor a month&lt;/td&gt;
&lt;td&gt;Contributor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodeScene&lt;/td&gt;
&lt;td&gt;Not stated&lt;/td&gt;
&lt;td&gt;€18 per active author a month billed yearly&lt;/td&gt;
&lt;td&gt;Active author&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qodana&lt;/td&gt;
&lt;td&gt;Community plan&lt;/td&gt;
&lt;td&gt;Ultimate $5 per active contributor a month billed annually, minimum 3&lt;/td&gt;
&lt;td&gt;Active contributor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Semgrep&lt;/td&gt;
&lt;td&gt;Free for up to 10 contributors and 10 repos&lt;/td&gt;
&lt;td&gt;Teams from $30 per contributor a month per product&lt;/td&gt;
&lt;td&gt;Contributor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Snyk&lt;/td&gt;
&lt;td&gt;100 Snyk Code tests a month&lt;/td&gt;
&lt;td&gt;Team from $25 a month, up to 10 developers&lt;/td&gt;
&lt;td&gt;Tests and developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codecov&lt;/td&gt;
&lt;td&gt;1 user on private repos, 250 uploads a month&lt;/td&gt;
&lt;td&gt;Team about $4 to $5 per user, Pro $12 per user&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodeRabbit&lt;/td&gt;
&lt;td&gt;Free reviews for public repos only&lt;/td&gt;
&lt;td&gt;Essentials $24 per user a month billed yearly ($30 monthly)&lt;/td&gt;
&lt;td&gt;User&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Does SonarQube support pull requests for free?
&lt;/h2&gt;

&lt;p&gt;It depends on which product you mean.&lt;/p&gt;

&lt;p&gt;SonarQube Community Build is free and self-hosted, but it analyzes only the main branch. Pull request analysis starts in the Developer edition.&lt;/p&gt;

&lt;p&gt;SonarQube Cloud has a free plan for private projects up to 50k lines of code, and Sonar describes pull request and main branch analysis as part of it. Public open source projects are covered by a separate free program.&lt;/p&gt;

&lt;p&gt;Past 50k lines, SonarQube Cloud Team starts at $34 a month for up to 100k lines of code. It is priced by lines of code, and only the largest branch of a project counts.&lt;/p&gt;

&lt;p&gt;So the old advice "SonarQube has no free pull request comments" is out of date. The accurate version: free pull request analysis on private code stops at 50k lines, and after that you pay by lines of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why do teams look for an alternative?
&lt;/h2&gt;

&lt;p&gt;Reviewers on G2 often mention three things: setup and CI configuration effort, false positives that need tuning on older codebases, and resource use on large projects. These are opinions from review sites, and many roundup posts repeat them without checking. Treat them as reasons to try something, not proof that SonarQube is wrong for you.&lt;/p&gt;

&lt;p&gt;Other common reasons are practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pricing basis.&lt;/strong&gt; Lines of code, seats, or tests can all be a bad fit for how your team grows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope.&lt;/strong&gt; Some teams only want pull request feedback, not a full quality platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup effort.&lt;/strong&gt; A GitHub Action is usually easier to maintain than a server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How should you choose?
&lt;/h2&gt;

&lt;p&gt;Ask four questions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Which languages do you use?&lt;/strong&gt; Some tools cover dozens. Others cover one family well.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do you need comments on pull requests?&lt;/strong&gt; If yes, check that the free plan includes them for private repositories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How does it charge?&lt;/strong&gt; Per seat, per line of code, per test, or a flat price. This decides what the bill looks like when the team doubles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do you want security, quality, or both?&lt;/strong&gt; Security scanners and quality platforms overlap less than the marketing suggests.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What does each tool do, and who is it for?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Codacy
&lt;/h3&gt;

&lt;p&gt;A hosted quality and security platform. The Developer plan is free and includes an IDE plugin plus code quality and security scans. The Team plan adds pull request and repository features for up to 30 developers and 100 private repositories. Free forever for open source. It fits teams that want a broad hosted platform and accept per-developer pricing.&lt;/p&gt;

&lt;h3&gt;
  
  
  DeepSource
&lt;/h3&gt;

&lt;p&gt;Code quality analysis with AI review. The Open Source plan covers unlimited public repositories and reviews up to 1,000 pull requests a month. Private repositories need the Team plan at $24 per user a month billed yearly. It fits teams that want automated review and fixes and are fine paying per user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qlty
&lt;/h3&gt;

&lt;p&gt;The successor to Code Climate Quality, built around maintainability checks and coverage. The free plan gives 1,000 analysis minutes a month and unlimited contributors, but no trends, hotspots, or shared configurations. Pro is $20 per contributor a month. The detail worth knowing: trend history is a paid feature there.&lt;/p&gt;

&lt;h3&gt;
  
  
  CodeScene
&lt;/h3&gt;

&lt;p&gt;Analyzes your Git history to find hotspots, meaning the files that change often and are hard to maintain, and produces a code health score. It also reviews pull requests with quality gates. Pricing is €18 per active author a month billed yearly, where an active author is someone who committed in the past three months. It fits teams who want to decide where to spend refactoring time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qodana
&lt;/h3&gt;

&lt;p&gt;JetBrains' tool that runs IDE inspections in CI. A free Community plan exists. Ultimate is $5 per active contributor a month billed annually, but the catch is it has a minimum of 3 contributors. It fits teams already using JetBrains IDEs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Semgrep
&lt;/h3&gt;

&lt;p&gt;A security-first scanner with rules you can read and write. The Free Edition covers up to 10 contributors and 10 repositories, including code scanning and supply chain scanning. The Teams plan charges per contributor and per product. It is not a coverage or complexity tool, so it pairs with one rather than replacing SonarQube.&lt;/p&gt;

&lt;h3&gt;
  
  
  Snyk Code
&lt;/h3&gt;

&lt;p&gt;Static security analysis within a wider security platform that also covers dependencies, containers, and infrastructure as code. The free plan limits you to 100 Snyk Code tests a month. Team starts at $25 a month for up to 10 developers. Security focused, so it does not replace a code quality platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  CodeQL
&lt;/h3&gt;

&lt;p&gt;GitHub's own code scanning engine. It is built for security queries and runs through GitHub code scanning. It is free for public repositories. For private repositories, check GitHub's current pricing for code security features. It is powerful but heavier to configure than a linter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Codecov
&lt;/h3&gt;

&lt;p&gt;Coverage reporting and pull request coverage comments. The free Developer plan is limited to one user on private repositories and 250 private uploads a month. Team is listed at about $4 to $5 per user, and Pro at $12. It does one job: coverage.&lt;/p&gt;

&lt;h3&gt;
  
  
  CodeRabbit
&lt;/h3&gt;

&lt;p&gt;An AI reviewer that comments on pull requests. It is not a static analyzer. Free reviews apply to public repositories. Private repositories need a paid plan, starting at $24 per user a month billed yearly. It fits teams that want opinions in natural language on their diffs. It does not produce a stable score you can track over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is DebtDraft, and who is it for?
&lt;/h2&gt;

&lt;p&gt;DebtDraft is a GitHub Action that posts one comment on each pull request with a health score. The score combines five signals: cyclomatic complexity, test coverage, code duplication, outdated dependencies, and known-vulnerable dependencies. A changed-lines view shows how the pull request itself affects those signals, separate from the whole repository. A dashboard shows each repository's trend over time.&lt;/p&gt;

&lt;p&gt;Setup is one workflow step plus an API key. There is no server to run.&lt;/p&gt;

&lt;p&gt;Pricing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; up to three connected repositories, all signals on every pull request, one comment updated on every push, and full trend history on the dashboard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pro:&lt;/strong&gt; $9 a month or $90 a year, a flat price for your account and not per contributor. It includes everything in Free plus unlimited repositories and extra features. The current list is on &lt;a href="https://debtdraft.dev/pricing" rel="noopener noreferrer"&gt;https://debtdraft.dev/pricing&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What to know before you try it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complexity, duplication, and coverage analysis are built for JavaScript and TypeScript projects today. The dependency checks work from lockfiles and manifests, so they apply to any language that has them.&lt;/li&gt;
&lt;li&gt;It focuses on five signals instead of a large rule set of bug and code-smell checks.&lt;/li&gt;
&lt;li&gt;Coverage comes from the reports your own tests already produce.&lt;/li&gt;
&lt;li&gt;For security, it reports known-vulnerable dependencies. It does not scan your own code for flaws, so it pairs well with a security scanner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It fits JavaScript and TypeScript teams that want a clear health score on every pull request and a trend for each repository, with no server to run and no per-seat pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one should you pick?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A health score on every pull request and trend lines per repository, for JavaScript and TypeScript projects:&lt;/strong&gt; DebtDraft.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Many languages and a hosted platform:&lt;/strong&gt; Codacy or DeepSource.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security is the priority:&lt;/strong&gt; Semgrep, Snyk Code, or CodeQL, ideally next to a quality tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where to refactor first:&lt;/strong&gt; CodeScene.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JetBrains shop:&lt;/strong&gt; Qodana.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Only coverage:&lt;/strong&gt; Codecov.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opinions on diffs from an AI:&lt;/strong&gt; CodeRabbit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staying on SonarQube:&lt;/strong&gt; reasonable if you already run it and the main branch checks meet your needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is SonarQube free?
&lt;/h3&gt;

&lt;p&gt;SonarQube Community Build is free and self-hosted. SonarQube Cloud has a free plan for private projects up to 50k lines of code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does SonarQube Community Build analyze pull requests?
&lt;/h3&gt;

&lt;p&gt;No. It analyzes the main branch only. Pull request analysis starts in the Developer edition.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the best free SonarQube alternative for GitHub?
&lt;/h3&gt;

&lt;p&gt;It depends on the job. Semgrep's free edition covers up to 10 contributors and 10 repositories for security scanning. Codacy's Developer plan is free. DebtDraft is free for up to three connected repositories. Which fits depends on which part of SonarQube you rely on.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do these tools charge per user?
&lt;/h3&gt;

&lt;p&gt;Most do: Codacy, DeepSource, Qlty, CodeScene, Qodana, Semgrep, Codecov, and CodeRabbit all price per person. SonarQube Cloud charges by lines of code, Snyk by tests and developers, and DebtDraft is a flat price per account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use more than one?
&lt;/h3&gt;

&lt;p&gt;Yes, and many teams do. A quality tool plus a security scanner is a common pairing, since they check different things.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final note
&lt;/h2&gt;

&lt;p&gt;Compare on your own repository before you commit. Most tools above have a free plan or a trial, so a week on a real project tells you more than any list. If a JavaScript or TypeScript project is what you have, you can try DebtDraft at &lt;a href="https://debtdraft.dev" rel="noopener noreferrer"&gt;https://debtdraft.dev&lt;/a&gt;. Sign in with GitHub and the dashboard walks you through setup.&lt;/p&gt;

&lt;p&gt;Disclosure: this article is published by DebtDraft, which is one of the tools listed. It is listed first in the table and has its own section. Every price in this article comes from the vendor's own pricing page and was checked on 2026-10-30. Prices change, so confirm before you buy.&lt;/p&gt;

</description>
      <category>github</category>
      <category>codequality</category>
      <category>devops</category>
      <category>javascript</category>
    </item>
    <item>
      <title>How to Review AI-Generated Pull Requests: A Checklist Before You Merge</title>
      <dc:creator>DebtDraft</dc:creator>
      <pubDate>Sun, 25 Oct 2026 13:13:54 +0000</pubDate>
      <link>https://dev.to/debtdraft/how-to-review-ai-generated-pull-requests-a-checklist-before-you-merge-2d49</link>
      <guid>https://dev.to/debtdraft/how-to-review-ai-generated-pull-requests-a-checklist-before-you-merge-2d49</guid>
      <description>&lt;p&gt;A pull request can look perfect. Clean names, tidy functions, a green CI check. And half of the new tests can still assert nothing.&lt;/p&gt;

&lt;p&gt;AI-written code does not look sloppy. It looks like a competent person wrote it, and that is exactly the problem. Your instincts for spotting bad code are tuned to messy code, and this is not messy.&lt;/p&gt;

&lt;p&gt;If your team merges AI-generated code, here is a checklist to run before you do. Each item also notes what a bot can check for you, so your attention goes to the things only a human can judge.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Does it solve the actual problem?
&lt;/h2&gt;

&lt;p&gt;AI is very good at satisfying the letter of a prompt while missing the intent. Before you read the diff, read the ticket. Write down in one sentence what this change should do.&lt;/p&gt;

&lt;p&gt;Then look at the file list. If the ticket was about one endpoint and the pull request touches nine files, ask why. Agents love to "improve" things nobody asked them to touch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human's job:&lt;/strong&gt; compare the change to the intent.&lt;br&gt;
&lt;strong&gt;Bot's job:&lt;/strong&gt; none. This one is yours.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Is the diff small enough to review?
&lt;/h2&gt;

&lt;p&gt;If you cannot hold the change in your head, you cannot review it. A big AI-generated diff gets a skim and a quick approval, and that is where bugs get through.&lt;/p&gt;

&lt;p&gt;If the diff is too large, send it back and ask for smaller pieces. This is not rude. It is the same thing you would ask of a human colleague.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human's job:&lt;/strong&gt; push back on size.&lt;br&gt;
&lt;strong&gt;Bot's job:&lt;/strong&gt; none. This one is yours.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Do the imports and APIs actually exist?
&lt;/h2&gt;

&lt;p&gt;Generated code often calls methods or options that sound right but do not exist in your installed version. Confident-looking code is not proof.&lt;/p&gt;

&lt;p&gt;For anything unfamiliar, check it against the official docs for the version in your lockfile. Pay special attention to new dependencies the change adds. Ask yourself whether you would have chosen that package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human's job:&lt;/strong&gt; verify unfamiliar calls and new packages.&lt;br&gt;
&lt;strong&gt;Bot's job:&lt;/strong&gt; a dependency check can flag packages that are outdated or have known vulnerabilities, so you do not have to look each one up.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Do the new lines have tests, and do those tests mean anything?
&lt;/h2&gt;

&lt;p&gt;This is the one that gets the least attention.&lt;/p&gt;

&lt;p&gt;Overall coverage is a project-wide number. A pull request can add a lot of untested code and barely move it, because the old, well-tested code dilutes the result. The opposite also happens: a refactor can lower overall coverage even though the new code is fine.&lt;/p&gt;

&lt;p&gt;What you want to know is &lt;strong&gt;patch coverage&lt;/strong&gt;: of the lines this pull request changed, how many are exercised by tests? That number says much more about this specific change than the project average does.&lt;/p&gt;

&lt;p&gt;Then check what the tests actually assert. A quick trick: flip one assertion and see whether the test still passes. If it does, the test is decoration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Looks like a test. Proves nothing.&lt;/span&gt;
&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;creates a user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &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;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sam&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nf"&gt;expect&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="nf"&gt;toBeDefined&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;&lt;strong&gt;Human's job:&lt;/strong&gt; read the assertions.&lt;br&gt;
&lt;strong&gt;Bot's job:&lt;/strong&gt; report coverage for the changed lines separately from the project total, so a gap is visible without opening a coverage report.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Did it copy something that already exists?
&lt;/h2&gt;

&lt;p&gt;AI does not know your codebase the way you do. It often writes a new helper next to an identical one that already lives three folders away. Every copy is a place where the next bug fix has to be made twice.&lt;/p&gt;

&lt;p&gt;Search for similar logic before approving. A new utility function should make you ask whether one already exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human's job:&lt;/strong&gt; recognize existing helpers you know about.&lt;br&gt;
&lt;strong&gt;Bot's job:&lt;/strong&gt; a duplication check can flag repeated blocks the pull request introduced.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. What happens when things go wrong?
&lt;/h2&gt;

&lt;p&gt;Generated code handles the happy path beautifully. Check the unhappy paths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens with empty input or missing values?&lt;/li&gt;
&lt;li&gt;What happens on a timeout or a failed network call?&lt;/li&gt;
&lt;li&gt;Are errors swallowed silently? An empty &lt;code&gt;catch&lt;/code&gt; block is a classic.&lt;/li&gt;
&lt;li&gt;Does it log anything useful when it fails?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Human's job:&lt;/strong&gt; think about failure cases.&lt;br&gt;
&lt;strong&gt;Bot's job:&lt;/strong&gt; a complexity check can point at functions that have grown many branches, which is where failure handling usually hides.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Did a secret slip in?
&lt;/h2&gt;

&lt;p&gt;Agents copy examples. Sometimes an example contains something that looks like a real key, and sometimes it is one. Check for hardcoded tokens, passwords and connection strings in the diff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human's job:&lt;/strong&gt; glance at config and environment changes.&lt;br&gt;
&lt;strong&gt;Bot's job:&lt;/strong&gt; a secrets scan on the changed lines is cheap and catches the obvious cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist you can paste into your pull request template
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;-&lt;/span&gt; [ ] I can state in one sentence what this change should do
&lt;span class="p"&gt;-&lt;/span&gt; [ ] The files changed match the task
&lt;span class="p"&gt;-&lt;/span&gt; [ ] The diff is small enough to review properly
&lt;span class="p"&gt;-&lt;/span&gt; [ ] New imports and API calls exist in our installed versions
&lt;span class="p"&gt;-&lt;/span&gt; [ ] New dependencies are justified, current and safe
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Changed lines have tests that fail when the code breaks
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Nothing duplicates a helper we already have
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Empty, null and failure cases are handled
&lt;span class="p"&gt;-&lt;/span&gt; [ ] No secrets in the diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Let a bot do the boring half
&lt;/h2&gt;

&lt;p&gt;Items 3, 4, 5, 6 and 7 are partly mechanical. A human reading the diff is a slow and tired way to check them, and the review energy is better spent on item 1 and on the design questions only you can answer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://debtdraft.dev" rel="noopener noreferrer"&gt;DebtDraft&lt;/a&gt; is built for this. It is a GitHub Action that leaves one comment on each pull request with a health score across the signals above: complexity, test coverage, duplication, outdated dependencies and known-vulnerable dependencies. It also shows the changed lines on their own, so you can see what this specific pull request did, and a dashboard shows how your repository trends over time.&lt;/p&gt;

&lt;p&gt;It is free for up to three repositories, and setup is one workflow step. If you try it, let us know what you think.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What is the sneakiest problem you have seen in an AI-generated pull request? Share it with us in the comments.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why Did Supabase Pause My Project? How to Restore It and Stop It Happening Again</title>
      <dc:creator>DebtDraft</dc:creator>
      <pubDate>Wed, 21 Oct 2026 12:03:36 +0000</pubDate>
      <link>https://dev.to/debtdraft/why-did-supabase-pause-my-project-how-to-restore-it-and-stop-it-happening-again-42jp</link>
      <guid>https://dev.to/debtdraft/why-did-supabase-pause-my-project-how-to-restore-it-and-stop-it-happening-again-42jp</guid>
      <description>&lt;p&gt;You open your app and nothing loads. You check the Supabase dashboard and there it is: &lt;strong&gt;"Your project has been paused."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't panic. Your data is almost certainly fine, and you can usually bring the project back in a couple of clicks. Short answer: Supabase pauses Free plan projects after about a week of low activity. Below is why your Supabase project was paused, how to restore it, and how to stop it happening again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why did Supabase pause my project?
&lt;/h2&gt;

&lt;p&gt;Supabase pauses Free plan projects that show low activity over a 7-day period. It does this to save server resources. A project that is not on a paid plan and has not had enough database activity in the last week is a candidate.&lt;/p&gt;

&lt;p&gt;The important detail is the word &lt;em&gt;database&lt;/em&gt; activity. Opening the project page once in a blue moon is not the same as your app actually querying it. If you built something, shipped it to a few friends, and moved on to the next idea, this is exactly the pattern that gets a project paused.&lt;/p&gt;

&lt;p&gt;You should get a warning email about a week before the pause, and a second email once it has happened. Check your spam folder. Those emails go to the project owner's address, which is not always the one you check daily.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to restore a paused Supabase project
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the Supabase dashboard and select the paused project.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Resume project&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Wait a few minutes while it comes back up, then test your app.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;According to Supabase's current docs, you can restore a paused project for up to a year after it was paused. That window has changed before (it was once 90 days), so don't rely on a number you read in a blog post, including this one. Check what your own dashboard offers, and do it sooner rather than later.&lt;/p&gt;

&lt;p&gt;Two things worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paused projects don't count toward the free project limit, so you can keep other projects going while you sort this out.&lt;/li&gt;
&lt;li&gt;If you upgrade to a paid plan, projects stop being paused for inactivity, and you may get expired restore options back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What if the Resume button is missing?
&lt;/h2&gt;

&lt;p&gt;If the project has been paused for a long time, the one-click restore can be gone. In that case the dashboard offers you a download of the latest backup instead. The rough recovery path looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the backup from the dashboard.&lt;/li&gt;
&lt;li&gt;Create a new Supabase project.&lt;/li&gt;
&lt;li&gt;Restore the backup into the new project.&lt;/li&gt;
&lt;li&gt;Update your app with the &lt;strong&gt;new&lt;/strong&gt; project URL and keys.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Be honest with yourself about step 3. Some people report that restoring an old backup into a fresh project throws errors around roles, extensions or the &lt;code&gt;auth&lt;/code&gt;, &lt;code&gt;storage&lt;/code&gt; and &lt;code&gt;vault&lt;/code&gt; schemas, especially if a lot of time has passed. If that happens, don't keep hammering it. Open a support request from the dashboard and say how long the project has been paused.&lt;/p&gt;

&lt;p&gt;And step 4 is the one people forget. A new project means a new URL and new keys. If your app still points at the old ones, it will fail in confusing ways even though the restore worked.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to stop Supabase from pausing your project
&lt;/h2&gt;

&lt;p&gt;From quickest to most permanent:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Generate real activity.&lt;/strong&gt; After you get the warning email, visit the project in the dashboard, or make requests to it from your app. A few database requests a day is usually enough to prevent a pause.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Add a small scheduled request.&lt;/strong&gt; If you have a side project that nobody visits every day, a scheduled job that does one simple read keeps it awake. Here is a GitHub Actions example. Put the project URL and the anon key in repository secrets, never in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Keep Supabase awake&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;schedule&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;9&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1,4"&lt;/span&gt;   &lt;span class="c1"&gt;# Monday and Thursday&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ping&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read one row&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;API_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SUPABASE_URL }}/rest/v1/YOUR_TABLE&lt;/span&gt;
          &lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SUPABASE_ANON_KEY }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;curl -sf "$API_URL?select=id&amp;amp;limit=1" \&lt;/span&gt;
            &lt;span class="s"&gt;-H "apikey: $API_KEY"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two catches. GitHub can switch off scheduled workflows in a repo that has had no activity for a while, so check on it now and then. And this is a stopgap for a hobby project, not a plan for something people depend on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Upgrade to a paid plan.&lt;/strong&gt; This is the real fix. Projects on a paid plan are not subject to automatic pausing for inactivity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Before real users show up
&lt;/h2&gt;

&lt;p&gt;A pause is a good reminder that "works on my machine" and "ready for users" are different things. A quick pre-launch check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do you know where your backups are, and have you tried restoring one?&lt;/li&gt;
&lt;li&gt;Does anything important depend on a project that can go to sleep?&lt;/li&gt;
&lt;li&gt;Are your API keys and project URLs in environment variables, not in the code?&lt;/li&gt;
&lt;li&gt;Does your app fail gracefully when the database is unreachable, or does it just show a blank page?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is hard, but it is much easier to do on a calm Tuesday than during an outage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick answers
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does Supabase delete my data when it pauses a project?&lt;/strong&gt; Pausing is not the same as deleting. Your data is kept so the project can be restored, but only for a limited time, so don't leave it indefinitely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long until Supabase pauses an inactive project?&lt;/strong&gt; After low activity over a 7-day period on the Free plan, with a warning email roughly a week before.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can paid projects be paused?&lt;/strong&gt; No. Projects on a paid plan are not paused for inactivity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will restoring change my API keys?&lt;/strong&gt; Restoring in place keeps your project. If you have to recover into a &lt;strong&gt;new&lt;/strong&gt; project, you get a new URL and new keys, and you have to update your app.&lt;/p&gt;




&lt;p&gt;If you're tidying up a project before launch anyway, you might also care about what is quietly happening inside the code itself. That is why we built &lt;a href="https://debtdraft.dev" rel="noopener noreferrer"&gt;DebtDraft&lt;/a&gt;, a GitHub Action that leaves one comment on each pull request with a health score built from a handful of essential signals, plus a dashboard that shows how your repo is trending over time. It is free for up to three repositories, and setup only takes a few minutes.&lt;/p&gt;

&lt;p&gt;Have you had a project paused at a bad moment? What would have saved you? Tell us in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>database</category>
      <category>postgres</category>
      <category>supabase</category>
    </item>
    <item>
      <title>You accidentally pushed your .env to GitHub. Here's what to do next.</title>
      <dc:creator>DebtDraft</dc:creator>
      <pubDate>Sun, 18 Oct 2026 11:48:50 +0000</pubDate>
      <link>https://dev.to/debtdraft/you-accidentally-pushed-your-env-to-github-heres-what-to-do-next-54dp</link>
      <guid>https://dev.to/debtdraft/you-accidentally-pushed-your-env-to-github-heres-what-to-do-next-54dp</guid>
      <description>&lt;p&gt;You pushed your &lt;code&gt;.env&lt;/code&gt; file to GitHub. Maybe you noticed a minute later, maybe a week later. Either way, you open the repo, see your database password sitting in plain text, and your stomach drops.&lt;/p&gt;

&lt;p&gt;Your first instinct is to delete the file and push again. Don't stop there. Deleting the file doesn't remove it from your Git history, so the secret is still in an old commit. Anyone who cloned or forked the repo in the meantime still has it.&lt;/p&gt;

&lt;p&gt;The good news is that the fix is a short list of steps, and the order matters. Here is what to do next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Rotate the key before anything else
&lt;/h2&gt;

&lt;p&gt;Treat the secret as public from the moment it was pushed. Go to wherever it came from (your database host, your cloud provider, Stripe, OpenAI, whatever the key belongs to), revoke it, and create a new one. Then update the places that use it: your deployment settings, your CI secrets, your local &lt;code&gt;.env&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This comes first for a simple reason. GitHub's own guide to removing sensitive data says you need to revoke and/or rotate the secret, and that once you do, the leaked credential can't be used anymore. Sometimes that alone solves the problem.&lt;/p&gt;

&lt;p&gt;Rewriting history is slow and cannot be fully undone. Rotating takes a few minutes. Do the fast thing first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Remove .env from your Git history
&lt;/h2&gt;

&lt;p&gt;Now clean the repository so the file is gone from every commit. GitHub recommends a tool called &lt;code&gt;git filter-repo&lt;/code&gt; for this. Install it (GitHub's guide asks for version 2.47 or later), then work in a &lt;strong&gt;fresh clone&lt;/strong&gt;, not your usual working copy. &lt;code&gt;git filter-repo&lt;/code&gt; actually refuses to run in a copy that isn't fresh unless you force it, because a fresh clone is the easiest thing to throw away if something goes wrong.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:your-name/your-repo.git cleanup
&lt;span class="nb"&gt;cd &lt;/span&gt;cleanup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To remove the whole file from every commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git filter-repo &lt;span class="nt"&gt;--sensitive-data-removal&lt;/span&gt; &lt;span class="nt"&gt;--invert-paths&lt;/span&gt; &lt;span class="nt"&gt;--path&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the file's full path in the repository. If the file lived at other paths in the past, for example &lt;code&gt;server/.env&lt;/code&gt;, add those paths too, or run the command again.&lt;/p&gt;

&lt;p&gt;If you'd rather keep the file but wipe out specific strings, put them in a text file kept outside the repository folder, and use &lt;code&gt;--replace-text&lt;/code&gt; instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git filter-repo &lt;span class="nt"&gt;--sensitive-data-removal&lt;/span&gt; &lt;span class="nt"&gt;--replace-text&lt;/span&gt; ../secrets.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then check that it worked. This should print nothing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;--oneline&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why not git filter-branch?
&lt;/h3&gt;

&lt;p&gt;You will see older answers on the internet that use &lt;code&gt;git filter-branch&lt;/code&gt;. Skip them. The Git project itself recommends &lt;code&gt;git filter-repo&lt;/code&gt; over it, and the &lt;code&gt;git filter-repo&lt;/code&gt; documentation says the problems with &lt;code&gt;filter-branch&lt;/code&gt; can't be fixed without breaking compatibility, so it recommends you stop using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Force-push, then ask GitHub Support to clear the rest
&lt;/h2&gt;

&lt;p&gt;When you're happy with the result, push the rewritten history back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nt"&gt;--mirror&lt;/span&gt; origin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Git says &lt;code&gt;origin&lt;/code&gt; doesn't exist, add the remote back with &lt;code&gt;git remote add origin &amp;lt;your-repo-url&amp;gt;&lt;/code&gt; and push again. Two things you may see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rejected pushes to &lt;code&gt;refs/pull/&lt;/code&gt;:&lt;/strong&gt; these are expected. GitHub keeps its own references for pull requests, and you can't overwrite them from outside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other rejected branches:&lt;/strong&gt; if you have branch protection on, you may need to switch it off temporarily, push, and switch it back on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rewrite becomes irreversible after this push, so it's worth a pause. &lt;code&gt;git filter-repo&lt;/code&gt; records what it changed in &lt;code&gt;.git/filter-repo/changed-refs&lt;/code&gt;. If the number of affected refs is higher than you expected, discard the clone and start over before you push.&lt;/p&gt;

&lt;p&gt;Then contact GitHub Support through their support portal. Tell them the repository name, how many pull requests are affected, and the first changed commit shown in the &lt;code&gt;git filter-repo&lt;/code&gt; output. Support can clear pull request references and cached views of the old commits. Be aware that they only handle sensitive data, not ordinary mistakes, so say clearly what was leaked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Deal with forks and teammates
&lt;/h2&gt;

&lt;p&gt;There are two groups of people you can't fix with a command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forks.&lt;/strong&gt; If anyone forked your repo before you cleaned it up, their copy still has the old history. GitHub can't give you contact details for fork owners, so you'll have to ask them to delete their fork or remove the data. This is another reason Step 1 matters. If the key is dead, an old fork is harmless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teammates.&lt;/strong&gt; Everyone who cloned the repo before the rewrite should either re-clone it or carefully clean their local copy. If they have branches built on the old history, they should rebase them. Merging can bring the removed data straight back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Stop it happening again
&lt;/h2&gt;

&lt;p&gt;Once the incident is over, put some guard rails in place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add &lt;code&gt;.env&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt; before the next commit.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;".env"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also be careful with &lt;code&gt;git add .&lt;/code&gt; and &lt;code&gt;git commit -a&lt;/code&gt;. They are the easiest way to sweep up files you never meant to include.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Turn on GitHub push protection.&lt;/strong&gt; Push protection blocks a push that contains a recognized secret before it reaches the repository. For public repositories on GitHub.com it is on by default at the user level. For private repositories, an admin has to enable it, and it requires GitHub Secret Protection. If you choose to bypass it, GitHub asks for a reason: "it's used in tests" and "it's a false positive" close the alert, while "I'll fix it later" leaves an open alert behind. That last one is a useful reminder to actually fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use GitHub secret scanning.&lt;/strong&gt; Secret scanning runs automatically and for free on public repositories. It raises an alert in the repository when it finds a credential, and GitHub's advice on receiving an alert is the same as ours: rotate it immediately. For private repositories it is part of GitHub Secret Protection, which requires a GitHub Team or Enterprise Cloud plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run a scanner on your own machine or in CI.&lt;/strong&gt; Tools like &lt;a href="https://github.com/gitleaks/gitleaks" rel="noopener noreferrer"&gt;gitleaks&lt;/a&gt; and &lt;a href="https://github.com/trufflesecurity/trufflehog" rel="noopener noreferrer"&gt;trufflehog&lt;/a&gt; look through your files and your history for things that look like secrets. Both can run as a pre-commit check or in CI. Check their documentation for the current commands, since the flags change between versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more layer: check every pull request
&lt;/h2&gt;

&lt;p&gt;Push protection and local scanners work best before a secret leaves your machine. A second check on the pull request itself is a useful backup.&lt;/p&gt;

&lt;p&gt;We built &lt;a href="https://debtdraft.dev" rel="noopener noreferrer"&gt;DebtDraft&lt;/a&gt; for this kind of check. It is a GitHub Action that flags hardcoded secrets on a pull request's changed lines, along with other code health checks. The scan runs on your own runner, and secrets stay there. It won't stop the push, so use it alongside push protection, not instead of it. It's free for up to 3 repositories: &lt;a href="https://debtdraft.dev" rel="noopener noreferrer"&gt;debtdraft.dev&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Rotate the key.&lt;/li&gt;
&lt;li&gt;Rewrite history with &lt;code&gt;git filter-repo&lt;/code&gt; in a fresh clone.&lt;/li&gt;
&lt;li&gt;Force-push, then contact GitHub Support.&lt;/li&gt;
&lt;li&gt;Tell forks and teammates.&lt;/li&gt;
&lt;li&gt;Add guard rails so it doesn't happen again.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everyone pushes a secret at some point. The people who handle it well are the ones who rotate first and ask questions later.&lt;/p&gt;

</description>
      <category>security</category>
      <category>github</category>
      <category>git</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How many lines should a pull request be? We traced the 400-line rule to its source</title>
      <dc:creator>DebtDraft</dc:creator>
      <pubDate>Fri, 16 Oct 2026 22:00:14 +0000</pubDate>
      <link>https://dev.to/debtdraft/how-many-lines-should-a-pull-request-be-we-traced-the-400-line-rule-to-its-source-398c</link>
      <guid>https://dev.to/debtdraft/how-many-lines-should-a-pull-request-be-we-traced-the-400-line-rule-to-its-source-398c</guid>
      <description>&lt;p&gt;Search "how many lines should a pull request be" and you will find the same answer over and over: keep it under 400. Sometimes it is 200 to 400, sometimes "a few hundred". It is always stated as settled fact.&lt;/p&gt;

&lt;p&gt;We wanted to know where it comes from. It turns out to be a short trip.&lt;/p&gt;

&lt;h2&gt;
  
  
  The source: one team at Cisco, in 2006
&lt;/h2&gt;

&lt;p&gt;The number traces back to a &lt;a href="https://www.stickyminds.com/article/largest-case-study-code-reviews-ever" rel="noopener noreferrer"&gt;study&lt;/a&gt; that SmartBear, a code review tool vendor, ran with a Cisco team. Over ten months, 50 developers on three continents had every change reviewed before it went into version control. The study collected metrics from 2,500 reviews covering 3.2 million lines of code, all run through SmartBear's own review tool.&lt;/p&gt;

&lt;p&gt;The headline finding is that defect density dropped sharply once a review went past about 200 lines. &lt;a href="https://smartbear.com/learn/code-review/best-practices-for-peer-code-review/" rel="noopener noreferrer"&gt;SmartBear's current guidance&lt;/a&gt; turns that into advice: review no more than 200 to 400 lines at a time, because beyond 400 the ability to find defects diminishes.&lt;/p&gt;

&lt;p&gt;That is a real study with real data. It is also where most of the evidence stops.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it measured, and what it didn't
&lt;/h2&gt;

&lt;p&gt;Defect density in this study means defects found per amount of code reviewed. So a drop past 200 lines means reviewers found fewer defects per line. SmartBear reads that as reviewers losing focus. We read it the same way.&lt;/p&gt;

&lt;p&gt;What it cannot tell you is whether the code had fewer bugs, or whether the PR was a bad idea to ship. It measures how well people read, not how risky the change was.&lt;/p&gt;

&lt;p&gt;A few more things worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It was one team, on one product, in 2006, reviewing in a dedicated tool before commit. A modern pull request on GitHub, with CI and a long discussion thread, is a different thing.&lt;/li&gt;
&lt;li&gt;Jason Cohen's write-up of the study says the statistical methods and the experimental controls are covered in the book, not in the article.&lt;/li&gt;
&lt;li&gt;The "70 to 90% defect discovery" figure that often rides along with the 400 lines is on SmartBear's page without a source attached.&lt;/li&gt;
&lt;li&gt;The company that published the number sells the tool that reviews code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that makes the number wrong. It makes it a starting point, not a law.&lt;/p&gt;

&lt;h2&gt;
  
  
  The newer numbers, and why they seem to disagree
&lt;/h2&gt;

&lt;p&gt;Two vendors publish more recent data, and at first glance they conflict.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linearb.io/library/engineering-benchmarks-and-research" rel="noopener noreferrer"&gt;LinearB's 2026 benchmarks&lt;/a&gt; cover 8,109,244 pull requests from 4,813 teams. They rate PR size at the 75th percentile: under 100 lines is Elite, 100 to 155 is Good, 156 to 228 is Fair, and above 228 needs improvement. Their page does not say whether size counts added lines, deleted lines, or both.&lt;/p&gt;

&lt;p&gt;Graphite, in a &lt;a href="https://graphite.com/blog/the-ideal-pr-is-50-lines-long" rel="noopener noreferrer"&gt;2023 post&lt;/a&gt;, argues the ideal median PR is 50 lines, with 25 to 100 as a range. They found 50-line changes were reviewed and merged about 40% faster than 250-line changes. Their revert chart, built from a sample of 10 million PRs, shows the least reverted PRs were 25 to 50 lines. The gap is small in absolute terms though: revert rates sit between roughly 1% and 1.6% at almost every size. Their users also skew toward small PRs, which they note themselves.&lt;/p&gt;

&lt;p&gt;The two are not really fighting. LinearB reports the 75th percentile of a team's PRs. Graphite reports the median. Three quarters of a team's PRs under 100 lines and a median of 50 can both be true for the same team. They are two views of the same distribution.&lt;/p&gt;

&lt;p&gt;Both vendors also sell tools that measure PR size and review speed. Neither number is wrong for that reason, but both come from people who profit when you care about the metric.&lt;/p&gt;

&lt;p&gt;One more detail from the &lt;a href="https://linearb.io/library/engineering-benchmarks-and-research" rel="noopener noreferrer"&gt;LinearB data&lt;/a&gt; is worth a note. In their breakdown, the 75th percentile PR is about 157 lines unassisted, about 293 for agent-written PRs, and about 408 for AI-assisted ones. They are clear that this is correlation, not cause. It does show that the "right" size depends on how the code was written.&lt;/p&gt;

&lt;h2&gt;
  
  
  What none of this shows
&lt;/h2&gt;

&lt;p&gt;No source we found shows that a PR over 400 lines is more likely to ship a bug. The Cisco study is about review quality. The vendor data is about speed and reverts. Neither follows the code after it merges.&lt;/p&gt;

&lt;p&gt;Size also counts lines, not review effort. A 2,000-line PR that moves a directory is easier to review than a 60-line change to a payment flow. Generated files, lockfiles and migrations inflate counts without adding load. Graphite's own revert chart has an odd tail too: PRs over 10,000 lines look slightly safer, which the author guesses is because the biggest changes are refactors.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we would do with it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Treat 200 to 400 lines as a reasonable ceiling for one review sitting, not a rule. It is the best-supported number, and it is about reading, not shipping.&lt;/li&gt;
&lt;li&gt;Measure your own median and your own 75th percentile. That is what the vendors report, and it is the only number that describes your team.&lt;/li&gt;
&lt;li&gt;Exclude lockfiles, generated files and pure moves from the count.&lt;/li&gt;
&lt;li&gt;When a change must be large, say what to read. A short "start here" note in the description does more than splitting a PR arbitrarily.&lt;/li&gt;
&lt;li&gt;Care about what is in the lines. A small PR that adds a branch-heavy function with no test is a bigger problem than a long one that is mostly deleted code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is why we built &lt;a href="https://debtdraft.dev" rel="noopener noreferrer"&gt;DebtDraft&lt;/a&gt;. It is a GitHub Action that leaves an updating comment on each pull request with a health score, and a view of just the lines that PR changed. We make it, so weigh our view accordingly.&lt;/p&gt;

&lt;p&gt;So what is your number? How many lines do you keep a pull request to? At what number does a PR become overwhelming to you?&lt;/p&gt;

</description>
      <category>codereview</category>
      <category>git</category>
      <category>github</category>
      <category>productivity</category>
    </item>
    <item>
      <title>We scored 6 popular JavaScript repos. The technical debt wasn't in the code.</title>
      <dc:creator>DebtDraft</dc:creator>
      <pubDate>Thu, 15 Oct 2026 11:13:02 +0000</pubDate>
      <link>https://dev.to/debtdraft/we-scored-6-popular-javascript-repos-the-technical-debt-wasnt-in-the-code-4d0i</link>
      <guid>https://dev.to/debtdraft/we-scored-6-popular-javascript-repos-the-technical-debt-wasnt-in-the-code-4d0i</guid>
      <description>&lt;p&gt;We expected to find copy-paste.&lt;/p&gt;

&lt;p&gt;Six popular JavaScript projects, the kind you've probably seen in a package.json somewhere. A lot of people say AI-generated code is piling up technical debt, and duplicated code is the usual first suspect. So we ran all six through the same five checks and waited for the duplication number to come back ugly.&lt;/p&gt;

&lt;p&gt;It mostly didn't. The ugly numbers were somewhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we went looking for duplication
&lt;/h2&gt;

&lt;p&gt;The worry isn't made up. GitClear, a company that sells code analytics, looked at &lt;a href="https://www.gitclear.com/ai_assistant_code_quality_2025_research" rel="noopener noreferrer"&gt;211 million changed lines&lt;/a&gt; from 2020 to 2024. It reported that lines classified as copy-pasted rose from 8.3% to 12.3% between 2021 and 2024, and that 2024 was the first year copy-pasted lines outnumbered moved ones. &lt;a href="https://devclass.com/2025/02/20/ai-is-eroding-code-quality-states-new-in-depth-report/" rel="noopener noreferrer"&gt;Coverage of the report&lt;/a&gt; put the rise in duplicated blocks at about eightfold.&lt;/p&gt;

&lt;p&gt;That is a trend across many repositories over time. What we did is different and much smaller: a snapshot of six mature projects on one day. It cannot say anything about AI. It can say what healthy, well-known code looks like right now, which is a useful baseline to hold your own repo against.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we did
&lt;/h2&gt;

&lt;p&gt;We picked six well-known JavaScript and TypeScript projects: a web framework, a faster web framework, a validation library, a build tool, a state library and an HTTP server. We cloned each one, scored its default branch, and ran the same five checks on every project.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cyclomatic complexity, counted per function&lt;/li&gt;
&lt;li&gt;Duplicated lines&lt;/li&gt;
&lt;li&gt;Test coverage&lt;/li&gt;
&lt;li&gt;Outdated dependencies&lt;/li&gt;
&lt;li&gt;Known vulnerabilities in the installed dependency tree&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All six were scanned on October 15, 2026. We are not naming them. This is a baseline, not a leaderboard, and a score on one day says little about the maintainers who fix things every week.&lt;/p&gt;

&lt;p&gt;Coverage came out empty for all six. None of them commit a coverage report, so a fresh clone has nothing to read. We left it out instead of inventing a number.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code held up
&lt;/h2&gt;

&lt;p&gt;Let's start with duplication. The share of duplicated lines ranged from 0% to about 20%.&lt;/p&gt;

&lt;p&gt;The two highest looked scary until we opened the list. In the web framework, the duplicated blocks were test files that repeat each other. In the faster web framework, much of it was adapter files that mirror files elsewhere in the repo. The validation library, third highest, had one file per language. Still duplication, but it looks deliberate, not accidental.&lt;/p&gt;

&lt;p&gt;Complexity was calmer than we expected. We flagged functions above a cyclomatic complexity of 10. Between 0.1% and 4.4% of functions crossed that line, depending on the project. A couple were real monsters: two projects had a function above 100. They're easy to point at, and a small share of the whole.&lt;/p&gt;

&lt;p&gt;Nothing here makes a project good. But if you came in expecting a pile of copy-paste, there was no pile.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dependencies were the problem
&lt;/h2&gt;

&lt;p&gt;Then we looked at what each project depends on.&lt;/p&gt;

&lt;p&gt;Between 8% and 51% of the dependencies we could check were a breaking release behind the latest version. In the worst project, about half of what it uses is a major version, or the equivalent, out of date.&lt;/p&gt;

&lt;p&gt;Then the vulnerabilities. Four of the six commit a lockfile, so there's a real installed tree to audit. All four had known high-severity vulnerabilities somewhere in it, and two had critical ones. The other two don't commit a lockfile at all, so there was nothing for us to audit.&lt;/p&gt;

&lt;p&gt;Put together, three projects got an F, one got a D-, one a B and one a B+.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a good project can get an F
&lt;/h2&gt;

&lt;p&gt;A grade that looks at the full installed tree counts the tooling too: build, test and lint packages that never ship to your users. We didn't check how many of the vulnerable packages we found fall in that group, so don't read an F as "this library is dangerous".&lt;/p&gt;

&lt;p&gt;We still think counting them is right. Your CI runs that tooling with your tokens and your source. But a low grade here means the project has more dependency debt than code debt, and that's where we'd look first.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check on your own repo
&lt;/h2&gt;

&lt;p&gt;You don't need a tool for a first pass.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Count the breaking-behind dependencies.&lt;/strong&gt; Run &lt;code&gt;npm outdated&lt;/code&gt; and look at the Current vs Latest columns. Anything a major version behind is a breaking upgrade waiting for you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit the lockfile.&lt;/strong&gt; Run &lt;code&gt;npm audit&lt;/code&gt; against it. If you have no lockfile, that's the finding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look at the lines your last pull request changed.&lt;/strong&gt; Duplication and untested code hide in a diff much better than in a whole repo. A repo-level number can stay green while the new code is the worst in the project.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The third matters most for AI-written changes. Say a reviewer is reading 400 changed lines. The diff can't show that 90 of them already exist in another file, because it only shows what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  One disclosure
&lt;/h2&gt;

&lt;p&gt;We build DebtDraft, a GitHub Action that runs these five checks and posts one score on every pull request. We used it to produce the numbers above, with the same settings on all six. Everything in the previous section works without it.&lt;/p&gt;

&lt;p&gt;What would you check first on your own repo: duplication, dependencies, or the lines your last pull request changed?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codequality</category>
      <category>security</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Your AI-written PR passes the tests. Here is what it still hides.</title>
      <dc:creator>DebtDraft</dc:creator>
      <pubDate>Wed, 14 Oct 2026 10:52:31 +0000</pubDate>
      <link>https://dev.to/debtdraft/your-ai-written-pr-passes-the-tests-here-is-what-it-still-hides-4gj</link>
      <guid>https://dev.to/debtdraft/your-ai-written-pr-passes-the-tests-here-is-what-it-still-hides-4gj</guid>
      <description>&lt;p&gt;You know the pull request. 40 files changed, clean naming, tidy comments, green checks. It looks like a senior engineer wrote it on a good day.&lt;/p&gt;

&lt;p&gt;Then three weeks later someone asks why there are four nearly identical functions, and nobody can say which one is the real one.&lt;/p&gt;

&lt;p&gt;AI-assisted pull requests are polished. That is the problem. Polish makes a reviewer relax, and review is where this kind of debt gets in. Two 2026 studies of agent-authored pull requests point at the same thing: &lt;a href="https://arxiv.org/abs/2601.21276" rel="noopener noreferrer"&gt;one&lt;/a&gt; finds that plausible-looking AI code hides redundancy and less reuse, and &lt;a href="https://arxiv.org/abs/2601.21102" rel="noopener noreferrer"&gt;another&lt;/a&gt; finds that quiet agent contributions can raise complexity and still get merged.&lt;/p&gt;

&lt;p&gt;So here are five things everyone must check before merging an AI-written pull request. None of them need special tooling to start.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Did the complexity of the touched functions go up?
&lt;/h2&gt;

&lt;p&gt;Open the functions the diff touched, not the whole file. Count the branches: every &lt;code&gt;if&lt;/code&gt;, loop, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;, &lt;code&gt;||&lt;/code&gt;, ternary and &lt;code&gt;case&lt;/code&gt; adds a path.&lt;/p&gt;

&lt;p&gt;A function that was 4 paths and is now 14 is a review item, even if every line is readable. Readable and simple are different things.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Are the changed lines covered, or just the file?
&lt;/h2&gt;

&lt;p&gt;A file at 90% coverage can ship a new function with zero tests. Overall percentages hide this because the old, well-tested code props the number up.&lt;/p&gt;

&lt;p&gt;Ask a narrower question: of the lines this pull request added or changed, how many does a test actually run? That number is often much lower than the headline.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Did it add duplication?
&lt;/h2&gt;

&lt;p&gt;AI tools love to write a new helper instead of finding the one you already have. Search the repo for two or three distinctive lines from the new code. If the same logic already lives somewhere else, you just got two bugs to fix instead of one.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Did it add or bump dependencies?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff main &lt;span class="nt"&gt;--&lt;/span&gt; package.json package-lock.json
npm outdated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check every new package: is it maintained, is it popular for a reason, and do you really need it for ten lines of code? Assistants add packages the way people add browser tabs.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Are any of those dependencies known to be vulnerable?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm audit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it on the branch and on main, then compare. What matters is what this pull request introduced, not what you already had. A new advisory arriving with the diff is a reason to stop and look.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the changed lines matter
&lt;/h2&gt;

&lt;p&gt;Notice the pattern. All five checks are about the diff, not the repository. A repo-wide score tells you how the project is doing. It will not tell you whether this pull request made it worse.&lt;/p&gt;

&lt;p&gt;Reviewers are not lazy. A 40 file diff is just hard to hold in your head, and the polish of AI-written code does half the persuading for you. A short checklist beats trusting your gut on file 31.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing it without the manual work
&lt;/h2&gt;

&lt;p&gt;Disclosure: I work on DebtDraft, a GitHub Action that runs these five checks (complexity, coverage, duplication, outdated dependencies and known-vulnerable dependencies) and posts a comment on the pull request which updates in place. It shows the health of the whole codebase and, separately, of just the changed lines. Free for up to three repositories. Find it on the &lt;a href="https://github.com/marketplace/actions/debtdraft" rel="noopener noreferrer"&gt;GitHub Marketplace&lt;/a&gt; or at &lt;a href="https://debtdraft.dev" rel="noopener noreferrer"&gt;debtdraft.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Either way, the checklist above works without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;What do you check first when a pull request is clearly AI-written? Is there a signal you trust more than any of these five?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codereview</category>
      <category>codequality</category>
      <category>github</category>
    </item>
    <item>
      <title>Know your pull request's health before you merge it</title>
      <dc:creator>DebtDraft</dc:creator>
      <pubDate>Mon, 12 Oct 2026 01:08:02 +0000</pubDate>
      <link>https://dev.to/debtdraft/know-your-pull-requests-health-before-you-merge-it-78</link>
      <guid>https://dev.to/debtdraft/know-your-pull-requests-health-before-you-merge-it-78</guid>
      <description>&lt;p&gt;Most code health problems do not arrive in one big commit. They arrive one reasonable pull request at a time: a function that grows a little too complex, a dependency that falls behind, a change that ships without tests. By the time anyone notices, the problem is everywhere.&lt;/p&gt;

&lt;p&gt;DebtDraft is a GitHub Action that makes that visible at the moment it matters, &lt;strong&gt;inside&lt;/strong&gt; the pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;On every pull request and every push to your default branch, DebtDraft scores your repository on five signals:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Code complexity&lt;/li&gt;
&lt;li&gt;Test coverage&lt;/li&gt;
&lt;li&gt;Duplication&lt;/li&gt;
&lt;li&gt;Outdated dependencies&lt;/li&gt;
&lt;li&gt;Vulnerable dependencies&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The result is one score and one letter grade, posted as a single comment on the pull request. A separate section looks only at the lines the change touches, so you can see what this change did, not just the state of the whole repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Track it over time
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcjp94p04axobb3o1pqdl.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%2Fcjp94p04axobb3o1pqdl.png" alt="A screenshot of the dashboard tracking your repository health over time." width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A hosted dashboard shows every connected repository with its current grade and its trend. You can open a repository to see the score history, and open any scan to see which functions, files and dependencies are behind the number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;Add one step to your workflow, generate and add the API key, and commit the workflow. That's it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy
&lt;/h2&gt;

&lt;p&gt;Secrets detection runs entirely on your runner, and secrets never leave it, not even to our own dashboard. Your source code is never uploaded. Privacy is not a privilege. It's a right.&lt;/p&gt;

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

&lt;p&gt;DebtDraft is free for up to three repositories right now.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://debtdraft.dev?utm_source=devto" rel="noopener noreferrer"&gt;https://debtdraft.dev?utm_source=devto&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Marketplace: &lt;a href="https://github.com/marketplace/actions/debtdraft" rel="noopener noreferrer"&gt;https://github.com/marketplace/actions/debtdraft&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We would love to hear which signal matters most to your team!&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>security</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
