<?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: LooksGoodToMeow</title>
    <description>The latest articles on DEV Community by LooksGoodToMeow (@looksgoodtomeow).</description>
    <link>https://dev.to/looksgoodtomeow</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%2F4021679%2F65c9ebf6-f4c5-4244-b42d-cd8d356bfc52.png</url>
      <title>DEV Community: LooksGoodToMeow</title>
      <link>https://dev.to/looksgoodtomeow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/looksgoodtomeow"/>
    <language>en</language>
    <item>
      <title>I built an AI code reviewer with 6 parallel agents. Here’s the architecture, warts and all.</title>
      <dc:creator>LooksGoodToMeow</dc:creator>
      <pubDate>Sat, 11 Jul 2026 12:22:49 +0000</pubDate>
      <link>https://dev.to/looksgoodtomeow/i-built-an-ai-code-reviewer-with-6-parallel-agents-heres-the-architecture-warts-and-all-dfc</link>
      <guid>https://dev.to/looksgoodtomeow/i-built-an-ai-code-reviewer-with-6-parallel-agents-heres-the-architecture-warts-and-all-dfc</guid>
      <description>&lt;p&gt;Six months ago I got fed up with my AI code review tool.&lt;/p&gt;

&lt;p&gt;Two problems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It charged roughly &lt;strong&gt;3.5× the raw OpenAI API cost&lt;/strong&gt; while pretending that wasn't happening.&lt;/li&gt;
&lt;li&gt;It kept flagging phantom SQL injection in a codebase that literally had &lt;strong&gt;no SQL&lt;/strong&gt;, while completely missing a real authorization bypass in the same pull request.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination broke my trust.&lt;/p&gt;

&lt;p&gt;So I cancelled my subscription and started building my own.&lt;/p&gt;

&lt;p&gt;Today I'm launching &lt;strong&gt;LGTM (Looks Good To Meow)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This isn't a launch post about features.&lt;/p&gt;

&lt;p&gt;It's about the architecture, because that's the interesting part.&lt;/p&gt;




&lt;h2&gt;
  
  
  The one-prompt failure mode
&lt;/h2&gt;

&lt;p&gt;The obvious implementation looks like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give one LLM a giant system prompt telling it to review security, bugs, performance, readability, best practices and documentation all at once.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I built exactly that first.&lt;/p&gt;

&lt;p&gt;It didn't work.&lt;/p&gt;

&lt;p&gt;The model spread its attention across every category equally.&lt;/p&gt;

&lt;p&gt;That meant:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Critical security issues got buried beneath variable naming suggestions.&lt;/li&gt;
&lt;li&gt;Performance regressions were mixed together with documentation comments.&lt;/li&gt;
&lt;li&gt;The review became 30+ unordered findings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Beta users simply stopped reading after the first few comments.&lt;/p&gt;

&lt;p&gt;I tried making the prompt more aggressive.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Prioritize security above everything else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That solved one problem and created another.&lt;/p&gt;

&lt;p&gt;Security became better.&lt;/p&gt;

&lt;p&gt;Everything else became dramatically worse.&lt;/p&gt;

&lt;p&gt;The fundamental issue remained.&lt;/p&gt;

&lt;p&gt;One prompt was trying to solve six different problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Six agents in parallel
&lt;/h2&gt;

&lt;p&gt;Instead of making one model do everything, I split the review into six independent reviewers.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Agent&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔒 Security&lt;/td&gt;
&lt;td&gt;Auth, injection, secrets, XSS, unsafe deserialization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🐞 Bugs&lt;/td&gt;
&lt;td&gt;Correctness, null handling, race conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Performance&lt;/td&gt;
&lt;td&gt;N+1 queries, quadratic loops, allocations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📖 Readability&lt;/td&gt;
&lt;td&gt;Naming, function size, cognitive complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Best Practices&lt;/td&gt;
&lt;td&gt;Language idioms and architectural patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📝 Documentation&lt;/td&gt;
&lt;td&gt;JSDoc, docstrings, README updates&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each receives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the same PR diff&lt;/li&gt;
&lt;li&gt;its own specialized system prompt&lt;/li&gt;
&lt;li&gt;zero knowledge of the other reviewers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every agent returns structured JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"security"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"findings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"file"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/api/user.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Missing authorization check"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"DELETE endpoint allows any authenticated user to delete accounts."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"suggested_fix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verify ownership or admin role before deletion."&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six reports come back simultaneously.&lt;/p&gt;

&lt;p&gt;That is where the interesting part begins.&lt;/p&gt;




&lt;h2&gt;
  
  
  The synthesizer
&lt;/h2&gt;

&lt;p&gt;Simply concatenating six reports produces garbage.&lt;/p&gt;

&lt;p&gt;Real pull requests can easily end up with 40–60 findings.&lt;/p&gt;

&lt;p&gt;Nobody reads that.&lt;/p&gt;

&lt;p&gt;The synthesizer converts six raw reports into one review.&lt;/p&gt;

&lt;p&gt;It performs four jobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Deduplication
&lt;/h2&gt;

&lt;p&gt;Security and bug reviewers frequently report the same issue.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Missing null check&lt;/li&gt;
&lt;li&gt;Unsafe input validation&lt;/li&gt;
&lt;li&gt;Missing authorization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of showing duplicates, the synthesizer groups findings by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;file&lt;/li&gt;
&lt;li&gt;line&lt;/li&gt;
&lt;li&gt;category&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and keeps the strongest explanation.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Conflict resolution
&lt;/h2&gt;

&lt;p&gt;Sometimes two reviewers disagree.&lt;/p&gt;

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

&lt;p&gt;Security says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add rate limiting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Performance says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Remove rate limiting to improve latency.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They're both technically correct.&lt;/p&gt;

&lt;p&gt;So I built a simple precedence system.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Security
    &amp;gt;
Correctness
    &amp;gt;
Performance
    &amp;gt;
Style
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When conflicts occur, the final report still includes both viewpoints so the developer can override the decision.&lt;/p&gt;




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

&lt;p&gt;Ordering matters more than people realize.&lt;/p&gt;

&lt;p&gt;Nobody wants this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Rename variable&lt;/li&gt;
&lt;li&gt;Missing JSDoc&lt;/li&gt;
&lt;li&gt;Catastrophic auth bypass&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Instead, findings are sorted by:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Severity
→ Category Weight
→ File
→ Line
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Critical issues always appear first.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Final verdict
&lt;/h2&gt;

&lt;p&gt;Finally the synthesizer emits one overall review.&lt;/p&gt;

&lt;p&gt;Possible outputs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Approve&lt;/li&gt;
&lt;li&gt;🟡 Request Changes&lt;/li&gt;
&lt;li&gt;❌ Block&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;based entirely on blocker findings.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why only show 10 findings?
&lt;/h2&gt;

&lt;p&gt;One surprising lesson from beta testing:&lt;/p&gt;

&lt;p&gt;People don't read long reviews.&lt;/p&gt;

&lt;p&gt;The dashboard originally showed everything.&lt;/p&gt;

&lt;p&gt;Average review length:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;27 findings&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Almost nobody reached the bottom.&lt;/p&gt;

&lt;p&gt;Today LGTM only surfaces the &lt;strong&gt;top 10 findings&lt;/strong&gt; plus a summary.&lt;/p&gt;

&lt;p&gt;Everything else stays available inside the dashboard.&lt;/p&gt;

&lt;p&gt;Ten wasn't chosen mathematically.&lt;/p&gt;

&lt;p&gt;It was chosen because users actually read ten.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building the synthesizer took longer than everything else
&lt;/h2&gt;

&lt;p&gt;Early versions had weird behavior.&lt;/p&gt;

&lt;p&gt;The longest report usually won.&lt;/p&gt;

&lt;p&gt;Not because it found better issues.&lt;/p&gt;

&lt;p&gt;Because the model subconsciously treated verbose output as more important.&lt;/p&gt;

&lt;p&gt;I fixed that by normalizing token counts before synthesis.&lt;/p&gt;

&lt;p&gt;Then another issue appeared.&lt;/p&gt;

&lt;p&gt;The synthesizer became &lt;em&gt;too&lt;/em&gt; aggressive.&lt;/p&gt;

&lt;p&gt;Different findings got merged together.&lt;/p&gt;

&lt;p&gt;That caused genuine bugs to disappear.&lt;/p&gt;

&lt;p&gt;The fix was introducing a confidence score for every finding so uncertain matches remained separate.&lt;/p&gt;

&lt;p&gt;Most of the work wasn't building reviewers.&lt;/p&gt;

&lt;p&gt;It was teaching them how to disagree.&lt;/p&gt;




&lt;h2&gt;
  
  
  Some detectors are &lt;strong&gt;not&lt;/strong&gt; LLMs
&lt;/h2&gt;

&lt;p&gt;The CI/CD scanner doesn't use AI.&lt;/p&gt;

&lt;p&gt;It shouldn't.&lt;/p&gt;

&lt;p&gt;It consists of 16 deterministic detectors.&lt;/p&gt;

&lt;p&gt;Example:&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;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request_target&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;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.pull_request.head.sha }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a classic &lt;code&gt;pull_request_target&lt;/code&gt; vulnerability.&lt;/p&gt;

&lt;p&gt;Static analysis detects it instantly.&lt;/p&gt;

&lt;p&gt;I benchmarked several popular LLMs.&lt;/p&gt;

&lt;p&gt;Two missed it completely.&lt;/p&gt;

&lt;p&gt;One detected it but couldn't explain why it was dangerous.&lt;/p&gt;

&lt;p&gt;Pattern matching wins here.&lt;/p&gt;

&lt;p&gt;Another example:&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;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sk_live_xxxxxxxxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Detected immediately.&lt;/p&gt;

&lt;p&gt;No reasoning required.&lt;/p&gt;

&lt;p&gt;Another:&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;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;some-org/action@main&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unpinned GitHub Actions.&lt;/p&gt;

&lt;p&gt;Again, deterministic.&lt;/p&gt;

&lt;p&gt;Not AI.&lt;/p&gt;

&lt;p&gt;The scanner currently includes detectors for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pull_request_target&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;hardcoded secrets&lt;/li&gt;
&lt;li&gt;unpinned actions&lt;/li&gt;
&lt;li&gt;privileged Docker containers&lt;/li&gt;
&lt;li&gt;curl piped to shell&lt;/li&gt;
&lt;li&gt;world-writable permissions&lt;/li&gt;
&lt;li&gt;missing least privilege tokens&lt;/li&gt;
&lt;li&gt;sudo without passwords&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;...and several more.&lt;/p&gt;

&lt;p&gt;Sometimes boring software beats AI.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bring Your Own Key (BYOK)
&lt;/h2&gt;

&lt;p&gt;Another decision I made early:&lt;/p&gt;

&lt;p&gt;LGTM never owns your API usage.&lt;/p&gt;

&lt;p&gt;You connect your own:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI&lt;/li&gt;
&lt;li&gt;Anthropic&lt;/li&gt;
&lt;li&gt;Gemini&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every review runs against your account.&lt;/p&gt;

&lt;p&gt;Not mine.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your token usage appears directly on your provider bill.&lt;/li&gt;
&lt;li&gt;I don't proxy or resell tokens.&lt;/li&gt;
&lt;li&gt;I don't silently mark up usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most AI products bundle token costs into subscriptions.&lt;/p&gt;

&lt;p&gt;Eventually someone pays for that.&lt;/p&gt;

&lt;p&gt;Usually the customer.&lt;/p&gt;

&lt;p&gt;I preferred making pricing explicit.&lt;/p&gt;

&lt;p&gt;The downside is obvious.&lt;/p&gt;

&lt;p&gt;Users now have two bills.&lt;/p&gt;

&lt;p&gt;For solo developers that's usually cheaper.&lt;/p&gt;

&lt;p&gt;For larger organizations wanting one invoice, it's friction.&lt;/p&gt;

&lt;p&gt;I'm considering managed API keys in the future.&lt;/p&gt;

&lt;p&gt;Not today.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;₹0/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hobby&lt;/td&gt;
&lt;td&gt;₹399/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pro&lt;/td&gt;
&lt;td&gt;₹999/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Top-ups are available separately for additional reviews and CI scans.&lt;/p&gt;

&lt;p&gt;Payments are handled through &lt;strong&gt;Dodo Payments&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;li&gt;GitHub App&lt;/li&gt;
&lt;li&gt;Fly.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CLI:&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;-g&lt;/span&gt; @tarin/lgtm-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;I'm the only person building this.&lt;/p&gt;

&lt;p&gt;The part I'm watching most closely isn't whether the AI finds bugs.&lt;/p&gt;

&lt;p&gt;It's whether the synthesizer makes the same prioritization decisions that experienced engineers would.&lt;/p&gt;

&lt;p&gt;If it disagrees with your judgment, I want to know why.&lt;/p&gt;

&lt;p&gt;That's the failure mode I'm most interested in fixing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;🌐 Website&lt;br&gt;&lt;br&gt;
&lt;a href="https://looksgoodtomeow.in" rel="noopener noreferrer"&gt;https://looksgoodtomeow.in&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🚀 Dashboard&lt;br&gt;&lt;br&gt;
&lt;a href="https://app.looksgoodtomeow.in" rel="noopener noreferrer"&gt;https://app.looksgoodtomeow.in&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📚 Documentation&lt;br&gt;&lt;br&gt;
&lt;a href="https://docs.looksgoodtomeow.in" rel="noopener noreferrer"&gt;https://docs.looksgoodtomeow.in&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🏆 Product Hunt&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.producthunt.com/products/lgtm-looks-good-to-meow?utm_source=other&amp;amp;utm_medium=social" rel="noopener noreferrer"&gt;https://www.producthunt.com/products/lgtm-looks-good-to-meow?utm_source=other&amp;amp;utm_medium=social&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🐛 Feedback &amp;amp; Issues&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/tarinagarwal/lgtm-feedback" rel="noopener noreferrer"&gt;https://github.com/tarinagarwal/lgtm-feedback&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;If you're building AI developer tools, I'd genuinely love to hear how you're approaching review quality, ranking, or synthesis. I think that's where the next generation of AI coding tools will differentiate themselves.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>devops</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
