<?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: Kenny Olawuwo.</title>
    <description>The latest articles on DEV Community by Kenny Olawuwo. (@heavykenny).</description>
    <link>https://dev.to/heavykenny</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%2F129285%2F7a098160-1166-424b-97ae-8c320940c3e8.jpg</url>
      <title>DEV Community: Kenny Olawuwo.</title>
      <link>https://dev.to/heavykenny</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/heavykenny"/>
    <language>en</language>
    <item>
      <title>Introducing aislop: The Quality Gate for AI-Written Code</title>
      <dc:creator>Kenny Olawuwo.</dc:creator>
      <pubDate>Sat, 06 Jun 2026 19:58:48 +0000</pubDate>
      <link>https://dev.to/scanaislop/introducing-aislop-the-quality-gate-for-ai-written-code-326g</link>
      <guid>https://dev.to/scanaislop/introducing-aislop-the-quality-gate-for-ai-written-code-326g</guid>
      <description>&lt;p&gt;I got tired of reviewing pull requests that looked fine until they were not.&lt;/p&gt;

&lt;p&gt;The code compiled. The tests passed. The diff looked reasonable. Then, buried in the middle, there would be a catch block that swallowed every error, a &lt;code&gt;TODO&lt;/code&gt; that returned fake data, or another &lt;code&gt;as any&lt;/code&gt; cast because the agent did not finish the type work.&lt;/p&gt;

&lt;p&gt;That is the part people underestimate about AI-generated code. The first problem is not that it is obviously broken. The first problem is that it often looks acceptable.&lt;/p&gt;

&lt;p&gt;I built &lt;code&gt;[aislop](https://github.com/scanaislop/aislop)&lt;/code&gt; for that gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What aislop is
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;aislop&lt;/code&gt; is an open-source CLI for scanning AI-written code before it reaches production. It looks for the patterns AI coding agents leave behind when they are optimizing for "make the prompt work" instead of "keep this codebase healthy."&lt;/p&gt;

&lt;p&gt;Run it once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aislop@latest scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install it and make it part of your local workflow:&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; &lt;span class="nt"&gt;--save-dev&lt;/span&gt; aislop
aislop scan &lt;span class="nt"&gt;--changes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It scores the code, reports findings, and can auto-fix the mechanical issues. The more important part is the gate: it gives your team a way to catch AI slop before it becomes normal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem it solves
&lt;/h2&gt;

&lt;p&gt;Claude Code, Cursor, Codex, Copilot, and other coding agents are useful. This is not an argument against them. I use them because they make real engineering work faster.&lt;/p&gt;

&lt;p&gt;But agents have a different failure profile than humans.&lt;/p&gt;

&lt;p&gt;They write error handling that makes the function stop throwing, even when that hides the real failure. They add comments that explain the code instead of explaining a decision. They duplicate helpers because discovering the existing helper requires context. They cast through type errors because the compiler is in the way of finishing the task.&lt;/p&gt;

&lt;p&gt;None of that means the agent is useless. It means the output needs a different quality gate.&lt;/p&gt;

&lt;p&gt;Your existing linter still matters. Tests still matter. Typechecking still matters. &lt;code&gt;aislop&lt;/code&gt; sits next to those tools and asks a narrower question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did an AI coding agent leave behind patterns that will make this code harder to maintain?&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;ul&gt;
&lt;li&gt;Narrative comments above self-explanatory code&lt;/li&gt;
&lt;li&gt;Swallowed exceptions and empty fallbacks&lt;/li&gt;
&lt;li&gt;Unsafe &lt;code&gt;as any&lt;/code&gt; casts&lt;/li&gt;
&lt;li&gt;Hallucinated imports&lt;/li&gt;
&lt;li&gt;Duplicated helpers and dead code&lt;/li&gt;
&lt;li&gt;Production TODO stubs&lt;/li&gt;
&lt;li&gt;Hardcoded environment values&lt;/li&gt;
&lt;li&gt;Oversized files and functions that agents kept appending to&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not always bugs on day one. That is why they survive review. The damage is cumulative: noisier files, weaker types, less trustworthy error handling, more duplicate logic, and slower future changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I wanted a dedicated tool
&lt;/h2&gt;

&lt;p&gt;General-purpose linters were designed around human-written code. They catch formatting issues, unused variables, unsafe syntax, and many useful correctness problems. They do not fully understand the repeated fingerprints of agent output.&lt;/p&gt;

&lt;p&gt;For example, a linter might catch this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But it probably will not catch this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&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;The second version is what agents often write. It looks like error handling. In production, it means "the sync failed" and "there were no records" now look identical.&lt;/p&gt;

&lt;p&gt;That is the kind of pattern &lt;code&gt;aislop&lt;/code&gt; is built to flag.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it fits
&lt;/h2&gt;

&lt;p&gt;Start with changed files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aislop scan &lt;span class="nt"&gt;--changes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add CI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aislop ci &lt;span class="nt"&gt;--changes&lt;/span&gt; &lt;span class="nt"&gt;--base&lt;/span&gt; origin/main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your team uses agent hooks, install one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aislop hook &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--claude&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is simple: keep the speed of AI-assisted development, but stop the low-quality residue from merging unnoticed.&lt;/p&gt;

&lt;p&gt;That is the bet behind &lt;code&gt;aislop&lt;/code&gt;: AI coding agents are here to stay, so code quality tooling has to adapt.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/scanaislop/aislop" rel="noopener noreferrer"&gt;github.com/scanaislop/aislop&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>ai</category>
      <category>codequality</category>
      <category>cleancode</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>What Is AI Slop in Code?</title>
      <dc:creator>Kenny Olawuwo.</dc:creator>
      <pubDate>Sat, 06 Jun 2026 19:43:55 +0000</pubDate>
      <link>https://dev.to/heavykenny/what-is-ai-slop-in-code-235a</link>
      <guid>https://dev.to/heavykenny/what-is-ai-slop-in-code-235a</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;AI slop in code is not just broken output. It is generated code that passes tests while making the codebase harder to maintain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI slop in code is not the same as code that fails to compile.&lt;/p&gt;

&lt;p&gt;That is the important part.&lt;/p&gt;

&lt;p&gt;Most AI slop compiles. It passes the happy-path tests. It satisfies the ticket. It looks fine if you skim the diff quickly.&lt;/p&gt;

&lt;p&gt;The problem is that it carries the fingerprints of a model completing a prompt, not an engineer thinking through how the system should age. Left alone, those fingerprints turn into technical debt.&lt;/p&gt;

&lt;h2&gt;
  
  
  A useful definition
&lt;/h2&gt;

&lt;p&gt;AI slop in code is generated code that appears functional but weakens maintainability, reliability, or clarity.&lt;/p&gt;

&lt;p&gt;It is code that says: "the task is done" while quietly making the system harder to work on.&lt;/p&gt;

&lt;p&gt;That can mean silent error handling. It can mean fake defaults. It can mean unsafe type casts. It can mean copied utilities, noisy comments, or production stubs that should never have left the agent session.&lt;/p&gt;

&lt;p&gt;The common thread is not that the code is obviously broken. The common thread is that the code is low-judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: narrative comments
&lt;/h2&gt;

&lt;p&gt;Agents often write comments like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// We are sorting the users by name so they appear in alphabetical order&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sortedUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The comment is grammatically correct. It is also useless. The code already says that.&lt;/p&gt;

&lt;p&gt;A good comment would explain a constraint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Product wants locale-aware sorting here because names include accents.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sortedUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;localeCompare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userLocale&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;The first comment is narration. The second comment preserves a decision.&lt;/p&gt;

&lt;p&gt;That difference matters because generated code can fill files with narration. Reviewers then spend more time reading words that carry no engineering signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: swallowed exceptions
&lt;/h2&gt;

&lt;p&gt;This is one of the most dangerous patterns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadInvoices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Invoice&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="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;billingApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;invoices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customerId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&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;The function now treats "the customer has no invoices" and "the billing API failed" as the same event.&lt;/p&gt;

&lt;p&gt;That is not resilience. It is lost information.&lt;/p&gt;

&lt;p&gt;AI agents write this because it makes the function easy to use. Callers do not need error handling. Tests are easy to write. The feature keeps moving.&lt;/p&gt;

&lt;p&gt;Then production breaks and nobody knows why the UI says there are no invoices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: unsafe casts
&lt;/h2&gt;

&lt;p&gt;When a model gets stuck on a type mismatch, it often reaches for a cast:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;return&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;profile&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;The compiler stops complaining. The real problem moves to runtime.&lt;/p&gt;

&lt;p&gt;One &lt;code&gt;as any&lt;/code&gt; might be a local compromise. Dozens of them across a codebase are a sign that the type system is being used as decoration, not protection.&lt;/p&gt;

&lt;p&gt;In AI-assisted teams, this can accumulate quickly because agents optimize for completing the requested change, not preserving type discipline across the whole system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: duplicate helpers
&lt;/h2&gt;

&lt;p&gt;Agents often regenerate instead of reuse.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;formatCurrency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NumberFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en-US&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;currency&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;USD&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;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&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 helper might already exist. The new copy works. It passes tests. Nobody notices until a future change updates one version but not the other.&lt;/p&gt;

&lt;p&gt;This is why AI slop is often an aggregate problem. A single duplicated helper is not a crisis. A codebase full of them is slow to change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters
&lt;/h2&gt;

&lt;p&gt;AI slop matters because agents can produce it at a rate humans rarely match.&lt;/p&gt;

&lt;p&gt;A human might introduce an unsafe cast after a long debugging session. An agent can introduce ten in one PR. A human might leave one sloppy fallback. An agent can spread the same fallback pattern across a feature.&lt;/p&gt;

&lt;p&gt;That changes the economics of review. You cannot rely only on human reviewers to notice every recurring pattern in larger and faster diffs.&lt;/p&gt;

&lt;p&gt;You need the normal tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tests&lt;/li&gt;
&lt;li&gt;typechecking&lt;/li&gt;
&lt;li&gt;linting&lt;/li&gt;
&lt;li&gt;security checks&lt;/li&gt;
&lt;li&gt;code review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you need a gate tuned for AI output.&lt;/p&gt;

&lt;p&gt;That is where &lt;code&gt;aislop&lt;/code&gt; fits. It scans for the recurring patterns that AI coding agents leave behind and turns them into visible findings before they merge.&lt;/p&gt;

&lt;p&gt;AI-generated code is not going away. The standard for shipping it has to get sharper.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codequality</category>
      <category>programming</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>AI Slop Is Becoming a Software Engineering Problem</title>
      <dc:creator>Kenny Olawuwo.</dc:creator>
      <pubDate>Sat, 06 Jun 2026 19:20:21 +0000</pubDate>
      <link>https://dev.to/heavykenny/ai-slop-is-becoming-a-software-engineering-problem-2n00</link>
      <guid>https://dev.to/heavykenny/ai-slop-is-becoming-a-software-engineering-problem-2n00</guid>
      <description>&lt;p&gt;AI coding tools have changed how software gets written.&lt;/p&gt;

&lt;p&gt;Developers are now using Cursor, Claude Code, Codex, Copilot, Windsurf, Cline, Lovable, Bolt and other agentic tools to move faster than ever. They can generate components, refactor services, write tests, scaffold APIs, migrate frameworks and explain unfamiliar codebases in minutes.&lt;/p&gt;

&lt;p&gt;That speed is real.&lt;/p&gt;

&lt;p&gt;But so is the mess it can leave behind.&lt;/p&gt;

&lt;p&gt;The more I used AI coding agents, the more I started noticing the same patterns across different projects. Not always broken code. Not always obviously bad code. But code that felt slightly off.&lt;/p&gt;

&lt;p&gt;Code that worked enough to pass a quick check, but carried strange decisions, unnecessary wrappers, swallowed errors, fake-looking abstractions, unused imports, hardcoded values, duplicated logic and comments that sounded confident but added no value.&lt;/p&gt;

&lt;p&gt;That is what I call &lt;strong&gt;AI slop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Not because AI-generated code is automatically bad. It is not. Some of it is genuinely useful.&lt;/p&gt;

&lt;p&gt;AI slop is the residue left behind when code is generated quickly but not properly cleaned, validated or shaped into something maintainable.&lt;/p&gt;

&lt;p&gt;And as more AI-written code reaches production, I think this is becoming one of the next important software engineering problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  What AI slop looks like
&lt;/h2&gt;

&lt;p&gt;AI slop is not one single thing.&lt;/p&gt;

&lt;p&gt;It is a category of patterns that tend to appear when coding agents are trying to be helpful, defensive or overly complete.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;saveUser&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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ignore&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A swallowed error like this might look harmless in a generated flow, but in production it can hide the exact failure you need to debug.&lt;/p&gt;

&lt;p&gt;Another common one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the classic “make TypeScript stop complaining” move. It gets the code past the compiler, but removes the safety you were using TypeScript for in the first place.&lt;/p&gt;

&lt;p&gt;Then you see things like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// This function processes the user data and returns the processed user data&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;userData&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;The comment adds nothing. The function adds nothing. But the codebase now has more noise.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;unused imports left behind after multiple agent iterations&lt;/li&gt;
&lt;li&gt;hardcoded URLs, IDs or configuration values&lt;/li&gt;
&lt;li&gt;TODO comments that become permanent&lt;/li&gt;
&lt;li&gt;over-defensive validation around already-typed inputs&lt;/li&gt;
&lt;li&gt;re-declared types that already exist elsewhere in the codebase&lt;/li&gt;
&lt;li&gt;dead code from previous attempts&lt;/li&gt;
&lt;li&gt;half-renamed variables&lt;/li&gt;
&lt;li&gt;duplicate helper functions&lt;/li&gt;
&lt;li&gt;console logs left in production paths&lt;/li&gt;
&lt;li&gt;broad catch blocks that hide real failures&lt;/li&gt;
&lt;li&gt;hallucinated imports or dependencies&lt;/li&gt;
&lt;li&gt;oversized functions generated in one pass&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Individually, each one can look small.&lt;/p&gt;

&lt;p&gt;Together, they make a codebase harder to trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem is not that AI writes bad code
&lt;/h2&gt;

&lt;p&gt;I do not think the right framing is “AI code is bad.”&lt;/p&gt;

&lt;p&gt;That is too lazy.&lt;/p&gt;

&lt;p&gt;The real issue is that AI coding agents optimise for completion. They are trying to satisfy the prompt, produce something plausible and keep the workflow moving.&lt;/p&gt;

&lt;p&gt;That means they can often generate code that looks done before it has been properly shaped.&lt;/p&gt;

&lt;p&gt;Human developers do this too, of course.&lt;/p&gt;

&lt;p&gt;The difference is scale.&lt;/p&gt;

&lt;p&gt;A developer might write messy code slowly. An AI agent can generate messy code across several files in seconds.&lt;/p&gt;

&lt;p&gt;That changes the review problem.&lt;/p&gt;

&lt;p&gt;Before, code review was mainly about checking what another human intentionally wrote. Now, review increasingly includes checking what an agent generated, why it generated it, whether it actually fits the surrounding codebase, and whether it introduced subtle maintainability debt.&lt;/p&gt;

&lt;p&gt;That is a different kind of burden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Existing tools were not really built for this
&lt;/h2&gt;

&lt;p&gt;We already have linters, formatters, static analysis tools, type checkers, security scanners and AI code reviewers.&lt;/p&gt;

&lt;p&gt;They all matter.&lt;/p&gt;

&lt;p&gt;ESLint can catch syntax and style issues. TypeScript can catch type errors. Snyk can catch known vulnerabilities. Sonar can flag quality issues. AI review tools can comment on pull requests.&lt;/p&gt;

&lt;p&gt;But AI slop sits in a slightly different space.&lt;/p&gt;

&lt;p&gt;It is not always a compiler error.&lt;/p&gt;

&lt;p&gt;It is not always a security vulnerability.&lt;/p&gt;

&lt;p&gt;It is not always something a formatter can fix.&lt;/p&gt;

&lt;p&gt;And by the time it reaches pull request review, the code has already been accepted into the developer’s workflow. Someone now has to spend time untangling it.&lt;/p&gt;

&lt;p&gt;The earlier you catch it, the cheaper it is to fix.&lt;/p&gt;

&lt;p&gt;That is why I think the next layer of developer tooling needs to move closer to the point of generation.&lt;/p&gt;

&lt;p&gt;Not just after the pull request.&lt;/p&gt;

&lt;p&gt;Not just after CI.&lt;/p&gt;

&lt;p&gt;But while the agent is producing the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-generated code needs a quality gate
&lt;/h2&gt;

&lt;p&gt;When agents become part of the development workflow, they also need guardrails.&lt;/p&gt;

&lt;p&gt;A quality gate for AI-generated code should be fast, deterministic and easy to run locally. It should not need another large model to judge the output. It should not give a different answer every time. It should catch repeatable patterns that developers already know are risky or noisy.&lt;/p&gt;

&lt;p&gt;That is the direction I have been exploring with &lt;strong&gt;&lt;a href="https://github.com/scanaislop/aislop" rel="noopener noreferrer"&gt;aislop&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/scanaislop/aislop" rel="noopener noreferrer"&gt;aislop&lt;/a&gt; is an open-source CLI that scans code for patterns commonly left behind by AI coding agents. It gives a score, highlights findings and focuses on things like swallowed errors, unsafe &lt;code&gt;as any&lt;/code&gt;, dead code, hallucinated imports, hardcoded values, useless comments, oversized functions and other slop patterns.&lt;/p&gt;

&lt;p&gt;The goal is not to replace human review.&lt;/p&gt;

&lt;p&gt;The goal is to stop obvious AI-generated mess from reaching human review in the first place.&lt;/p&gt;

&lt;p&gt;A simple workflow could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aislop scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or inside an agentic workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aislop scan &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent writes code, the scanner runs, and the feedback goes back into the loop before the code reaches the pull request.&lt;/p&gt;

&lt;p&gt;That is the part I find most interesting.&lt;/p&gt;

&lt;p&gt;Not just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Scan my repo.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Before you tell me the task is complete, prove that the code is clean enough to continue.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is where this category becomes useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deterministic checks still matter
&lt;/h2&gt;

&lt;p&gt;There is a lot of excitement around LLM-based code review, and I understand why. LLMs can explain, reason and catch things that simple rules may miss.&lt;/p&gt;

&lt;p&gt;But not everything needs another model.&lt;/p&gt;

&lt;p&gt;Some patterns are deterministic by nature.&lt;/p&gt;

&lt;p&gt;An empty catch block is either there or it is not.&lt;/p&gt;

&lt;p&gt;An unsafe cast is either there or it is not.&lt;/p&gt;

&lt;p&gt;An unused import is either there or it is not.&lt;/p&gt;

&lt;p&gt;A hardcoded secret-like value is either there or it is not.&lt;/p&gt;

&lt;p&gt;A file with large generated functions, repeated helpers and useless comments can be scored and flagged without sending it to an LLM.&lt;/p&gt;

&lt;p&gt;That matters because deterministic tools are fast, cheap, repeatable and easier to trust in CI.&lt;/p&gt;

&lt;p&gt;When code is being generated more frequently, we need tools that can keep up with that speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  False positives are the hard part
&lt;/h2&gt;

&lt;p&gt;The hardest part of building this kind of tool is not finding bad patterns.&lt;/p&gt;

&lt;p&gt;It is avoiding lazy judgement.&lt;/p&gt;

&lt;p&gt;There is a big difference between code that looks like slop and code that is intentionally written a certain way for a good reason.&lt;/p&gt;

&lt;p&gt;That is why false positives matter a lot.&lt;/p&gt;

&lt;p&gt;I learned this the hard way when someone ran aislop on a mature open-source Python project and the score came out badly. At first glance, it looked like the tool had found a lot. But after going through the findings one by one, many of them were not genuine issues. They were bugs in my own detection logic.&lt;/p&gt;

&lt;p&gt;So I fixed them.&lt;/p&gt;

&lt;p&gt;That experience made the tool better.&lt;/p&gt;

&lt;p&gt;It also made the philosophy clearer: the goal is not to shame codebases or produce dramatic scores. The goal is to give developers useful, fair feedback that helps them clean up the residue from AI-assisted development.&lt;/p&gt;

&lt;p&gt;A tool like this only earns trust when developers can look at the findings and say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Yeah, that is fair.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  This category will become more important
&lt;/h2&gt;

&lt;p&gt;The more code agents write, the more teams will need standards around agent output.&lt;/p&gt;

&lt;p&gt;I think we will start seeing questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the agent introduce unnecessary abstractions?&lt;/li&gt;
&lt;li&gt;Did it leave behind dead code?&lt;/li&gt;
&lt;li&gt;Did it swallow errors?&lt;/li&gt;
&lt;li&gt;Did it use unsafe casts to force the code through?&lt;/li&gt;
&lt;li&gt;Did it duplicate existing logic instead of reusing what was already there?&lt;/li&gt;
&lt;li&gt;Did it generate comments that explain nothing?&lt;/li&gt;
&lt;li&gt;Did it hardcode things that should live in config?&lt;/li&gt;
&lt;li&gt;Did it produce code that passes locally but creates long-term maintenance debt?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not theoretical questions.&lt;/p&gt;

&lt;p&gt;They are already showing up in real workflows.&lt;/p&gt;

&lt;p&gt;The companies and teams that benefit most from AI coding tools will not be the ones that blindly accept every generated diff. They will be the ones that build strong feedback loops around generation, validation, testing, review and cleanup.&lt;/p&gt;

&lt;p&gt;AI can help us write code faster.&lt;/p&gt;

&lt;p&gt;But speed without quality control just moves the bottleneck somewhere else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The tool: aislop
&lt;/h2&gt;

&lt;p&gt;This is why I started building &lt;strong&gt;aislop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;aislop is an open-source CLI for detecting the kind of code quality issues AI coding agents often leave behind. It scans your codebase locally, gives a score from 0 to 100, and highlights patterns like swallowed errors, unsafe &lt;code&gt;as any&lt;/code&gt;, dead code, hallucinated imports, hardcoded values, useless comments, oversized functions, duplicated logic and other signs of AI-generated mess.&lt;/p&gt;

&lt;p&gt;You can try it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aislop scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For CI or agentic workflows, you can also use JSON output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aislop scan &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/scanaislop/aislop" rel="noopener noreferrer"&gt;github.com/scanaislop/aislop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/aislop" rel="noopener noreferrer"&gt;npmjs.com/package/aislop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://scanaislop.com" rel="noopener noreferrer"&gt;scanaislop.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Before AI-generated code reaches pull request review, run a fast deterministic quality gate over it.&lt;/p&gt;

&lt;p&gt;Not to replace human review.&lt;/p&gt;

&lt;p&gt;But to catch the obvious slop early, while the agent or developer can still fix it quickly.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aislop</category>
      <category>scanaialop</category>
      <category>claude</category>
    </item>
    <item>
      <title>Introducing aislop: the quality gate for AI-written code</title>
      <dc:creator>Kenny Olawuwo.</dc:creator>
      <pubDate>Sat, 06 Jun 2026 19:14:46 +0000</pubDate>
      <link>https://dev.to/heavykenny/introducing-aislop-the-quality-gate-for-ai-written-code-54ag</link>
      <guid>https://dev.to/heavykenny/introducing-aislop-the-quality-gate-for-ai-written-code-54ag</guid>
      <description>&lt;p&gt;I got tired of reviewing pull requests that looked fine until they weren’t.&lt;/p&gt;

&lt;p&gt;The code compiled.&lt;br&gt;
The tests passed.&lt;br&gt;
The feature worked on the surface.&lt;/p&gt;

&lt;p&gt;But inside the diff, there would be things that should never have made it that far.&lt;/p&gt;

&lt;p&gt;A silent &lt;code&gt;catch {}&lt;/code&gt; swallowing every error.&lt;br&gt;
A &lt;code&gt;// TODO: implement this properly&lt;/code&gt; sitting in production code.&lt;br&gt;
A dozen &lt;code&gt;as any&lt;/code&gt; casts because the agent just forced the types through instead of wiring them properly.&lt;/p&gt;

&lt;p&gt;That is the gap I kept seeing with AI-generated code.&lt;/p&gt;

&lt;p&gt;Claude Code, Cursor, Copilot, Gemini, Codex — they are very good at producing code that satisfies the prompt. But satisfying the prompt and keeping a codebase healthy are not the same thing.&lt;/p&gt;

&lt;p&gt;That gap compounds over time.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/scanaislop/aislop" rel="noopener noreferrer"&gt;aislop&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;aislop is an open-source CLI and quality gate for teams using AI coding agents. It scans your codebase for the kind of patterns agents keep leaving behind. Not always bugs, but signals that the code was generated quickly without enough thought for maintainability.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;swallowed exceptions&lt;/li&gt;
&lt;li&gt;unsafe &lt;code&gt;as any&lt;/code&gt; casts&lt;/li&gt;
&lt;li&gt;production TODOs&lt;/li&gt;
&lt;li&gt;dead code&lt;/li&gt;
&lt;li&gt;narrative comments&lt;/li&gt;
&lt;li&gt;hardcoded URLs and config&lt;/li&gt;
&lt;li&gt;fake fallbacks that hide real failures&lt;/li&gt;
&lt;li&gt;duplicated logic from regenerated code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one looks small in isolation. But together, they create the kind of codebase that becomes harder to trust every sprint.&lt;/p&gt;

&lt;p&gt;You can run it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx aislop scan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or put it in CI so slop gets caught before it reaches main.&lt;/p&gt;

&lt;p&gt;The reason I think this deserves its own tool is simple: normal linters were built for general code quality. aislop is built specifically around the patterns AI agents leave behind.&lt;/p&gt;

&lt;p&gt;That is a different problem.&lt;/p&gt;

&lt;p&gt;It also works with agent workflows. If you are using Claude Code, Cursor, Gemini, or similar tools, aislop can run as part of the agent loop instead of only after the code is done.&lt;/p&gt;

&lt;p&gt;There is also an installable 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 scanaislop/aislop-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repo is open source here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/scanaislop/aislop" rel="noopener noreferrer"&gt;https://github.com/scanaislop/aislop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the site is here:&lt;/p&gt;

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

&lt;p&gt;If your team is using AI coding agents heavily, run it once on a repo that has had a lot of AI-generated commits.&lt;/p&gt;

&lt;p&gt;The first scan is usually very revealing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aislop</category>
      <category>codequality</category>
      <category>cleancode</category>
    </item>
    <item>
      <title>How to Deploy A Golang App to Heroku.</title>
      <dc:creator>Kenny Olawuwo.</dc:creator>
      <pubDate>Tue, 23 Jun 2020 00:20:22 +0000</pubDate>
      <link>https://dev.to/heavykenny/how-to-deploy-a-golang-app-to-heroku-5g1j</link>
      <guid>https://dev.to/heavykenny/how-to-deploy-a-golang-app-to-heroku-5g1j</guid>
      <description>&lt;p&gt;This is a step by step tutorial on how to deploy a Golang app on Heroku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements.
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Heroku Account&lt;/li&gt;
&lt;li&gt;Heroku CLI&lt;/li&gt;
&lt;li&gt;Golang v1.14 and above&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 1.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create a Heroku account using your email and password or log in if you already have an account.&lt;/p&gt;

&lt;p&gt;Download the Heroku CLI by running the command below on Mac OS&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="nv"&gt;$ &lt;/span&gt;brew tap heroku/brew &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew &lt;span class="nb"&gt;install &lt;/span&gt;heroku
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or go to &lt;a href="https://devcenter.heroku.com/articles/heroku-cli#download-and-install" rel="noopener noreferrer"&gt;https://devcenter.heroku.com/articles/heroku-cli#download-and-install&lt;/a&gt; to install on Windows.&lt;br&gt;
Login to Heroku from your terminal using the command&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="nv"&gt;$ &lt;/span&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will open your web browser to complete the login flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 2.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create Procfile by running&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;Procfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or just create it from the directory. Run &lt;code&gt;echo "web: [directory]" &amp;gt; Procfile replace [directory]&lt;/code&gt; e.g&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="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"web: currency"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Procfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 3.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Generate a go.mod file using &lt;code&gt;go mod init github.com/[user_name]/[project_name]&lt;/code&gt; e.g.&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="nv"&gt;$ &lt;/span&gt;go mod init github.com/heavykenny/currency
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 4.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Set variable names in&amp;nbsp;&lt;code&gt;.env&lt;/code&gt; file e.g. &lt;code&gt;PORT=8080&lt;/code&gt; using&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="nv"&gt;$ &lt;/span&gt;heroku config:set &lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also set other variables using this command.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Step 5.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Commit your code using the following commands&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="nv"&gt;$ &lt;/span&gt;git init
&lt;span class="nv"&gt;$ &lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Deploying to Heroku"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Step 6.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Create a Heroku application using heroku create [project_name] e.g.&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="nv"&gt;$ &lt;/span&gt;heroku create go-currency
&lt;span class="nv"&gt;$ &lt;/span&gt;git push heroku master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then proceed to test your app using &lt;code&gt;https://[project_name].herokuapp.com&lt;/code&gt; i.e.&lt;br&gt;
&lt;a href="https://go-currency.herokuapp.com" rel="noopener noreferrer"&gt;https://go-currency.herokuapp.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you encounter any error during any of these processes, do not hesitate to comment or reach out. Thank you.&lt;/p&gt;

</description>
      <category>go</category>
      <category>heroku</category>
      <category>deploy</category>
    </item>
  </channel>
</rss>
