<?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: DontaRuffin</title>
    <description>The latest articles on DEV Community by DontaRuffin (@dontaruffin).</description>
    <link>https://dev.to/dontaruffin</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F93997%2F4c5147fc-5049-4afc-b53f-067ad30d70e6.png</url>
      <title>DEV Community: DontaRuffin</title>
      <link>https://dev.to/dontaruffin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dontaruffin"/>
    <language>en</language>
    <item>
      <title>I got tired of paying $240/month for a code reviewer that ignored half our standards</title>
      <dc:creator>DontaRuffin</dc:creator>
      <pubDate>Wed, 27 May 2026 19:55:59 +0000</pubDate>
      <link>https://dev.to/dontaruffin/i-got-tired-of-paying-240month-for-a-code-reviewer-that-ignored-half-our-standards-46gb</link>
      <guid>https://dev.to/dontaruffin/i-got-tired-of-paying-240month-for-a-code-reviewer-that-ignored-half-our-standards-46gb</guid>
      <description>&lt;h2&gt;
  
  
  I got tired of paying $240/month for a code reviewer that ignored half our standards
&lt;/h2&gt;

&lt;p&gt;At a 10-person team, CodeRabbit runs you around $240/month ($24/user/month billed annually). Greptile is around $300/month ($30/user). Cursor BugBot is around $400/month ($40/user).&lt;/p&gt;

&lt;p&gt;For that price, you'd expect the tool to know your team's specific rules. It doesn't. It knows &lt;em&gt;its&lt;/em&gt; rules — generic best practices that apply to every codebase equally, which means they apply to yours specifically not at all.&lt;/p&gt;

&lt;p&gt;We had a no-&lt;code&gt;any&lt;/code&gt; TypeScript rule that we'd explained to every new hire for two years. We had an auth check pattern every route had to follow. We had a list of things the previous team had learned the hard way.&lt;/p&gt;

&lt;p&gt;None of that made it into the code reviewer. It flagged missing semicolons and suggested refactors nobody asked for.&lt;/p&gt;




&lt;h2&gt;
  
  
  The real problem isn't review quality. It's review relevance.
&lt;/h2&gt;

&lt;p&gt;The tools in this space are competing on who catches the most bugs. That's the wrong race for most teams.&lt;/p&gt;

&lt;p&gt;A team of 10 shipping production software doesn't need an AI to find every edge case in every PR. They need the AI to enforce &lt;em&gt;their&lt;/em&gt; standards — the ones written down nowhere, living only in the heads of whoever's been there longest.&lt;/p&gt;

&lt;p&gt;That problem got worse when we started shipping AI-generated code. Cursor and Claude Code are fast. The output is mostly correct. But it has consistent failure patterns: &lt;code&gt;any&lt;/code&gt; types everywhere types get hard, unhandled promises, hallucinated imports from libraries the model half-remembered, happy-path-only error handling.&lt;/p&gt;

&lt;p&gt;Generic review tools don't know to look for those things specifically. They treat AI-generated code the same as hand-written code and produce the same boilerplate feedback.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://solonreview.dev" rel="noopener noreferrer"&gt;Solon AI&lt;/a&gt; reviews every PR against a playbook — a JSON file that describes your team's specific rules. Flat $29/month, no per-seat math.&lt;/p&gt;

&lt;p&gt;Today I'm open-sourcing the playbook library: &lt;strong&gt;&lt;a href="https://github.com/Solon-Dev/solon-playbooks" rel="noopener noreferrer"&gt;github.com/Solon-Dev/solon-playbooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Four playbooks to start:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js + TypeScript&lt;/strong&gt; — 12 rules for App Router codebases. Covers the mistakes that don't show up in linters: &lt;code&gt;useEffect&lt;/code&gt; for data fetching, unvalidated route handler input, client components where server components would work, raw &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tags, missing HTTP status codes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt; — 12 rules based on OWASP Top 10 for JavaScript/TypeScript. Hardcoded secrets, SQL injection, missing auth checks, IDOR vulnerabilities, &lt;code&gt;localStorage&lt;/code&gt; for auth tokens, &lt;code&gt;eval&lt;/code&gt; with user input. The things that cause breaches, not the things that cause code review comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility (WCAG 2.2)&lt;/strong&gt; — 11 rules for Level AA compliance. Focus on the gaps automated tools miss: focus management, keyboard patterns, ARIA correctness, live regions for dynamic content. Automated tools like axe and Lighthouse miss a significant portion of real accessibility issues — semantic structure, keyboard patterns, and focus management require human judgment that automated tools don't have. A playbook encodes that judgment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vibe Coder&lt;/strong&gt; — 12 rules built specifically for AI-generated code. This one took the longest to write because it required cataloging what Cursor and Claude Code get wrong most often: type escape hatches, floating promises, wrong third-party API signatures (the model knows the library but not the version you're running), unnecessary &lt;code&gt;useEffect&lt;/code&gt; for derived state, empty catch blocks.&lt;/p&gt;

&lt;p&gt;The Vibe Coder playbook is the one I'd start with if your team is shipping any meaningful volume of AI-generated code. The failure modes are consistent enough that they're worth encoding explicitly.&lt;/p&gt;




&lt;h2&gt;
  
  
  How the playbook format works
&lt;/h2&gt;

&lt;p&gt;Each rule has an ID, a severity (&lt;code&gt;blocking&lt;/code&gt;, &lt;code&gt;warning&lt;/code&gt;, or &lt;code&gt;info&lt;/code&gt;), a description, and a bad/good example:&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;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"no-any-escape-hatches"&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;"No 'any' type escape hatches"&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;"blocking"&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;"AI models default to 'any' when they're unsure about a type..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"examples"&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;"bad"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"function transform(data: any): any { return data.map((item: any) =&amp;gt; item.value); }"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"good"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"interface DataItem { value: string; } function transform(data: DataItem[]): string[] { return data.map(item =&amp;gt; item.value); }"&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;Solon reads the playbook, builds a review prompt from your rules, runs the diff through Claude Haiku, and posts the result as a PR comment. Blocking violations require a human decision before the PR merges.&lt;/p&gt;

&lt;p&gt;You can stack multiple playbooks:&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;"playbooks"&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="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="s2"&gt;"nextjs-typescript"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vibe-coder"&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="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blocking"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"warning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"info"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="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;h2&gt;
  
  
  Why open source the playbooks
&lt;/h2&gt;

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

&lt;p&gt;First, these are more useful if the community improves them. The Vibe Coder playbook in particular is going to need updates as the models evolve. A fintech team is going to have security rules I haven't thought of. A team running a design system is going to have accessibility rules I missed.&lt;/p&gt;

&lt;p&gt;Second, the playbooks are not the product. The enforcement is the product. A JSON file sitting in a GitHub repo doesn't help you — it helps you when something is reading it on every PR.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's in the repo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solon-playbooks/
├── README.md
├── schema.json
├── nextjs-typescript/playbook.json
├── security/playbook.json
├── accessibility/playbook.json
└── vibe-coder/playbook.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full schema is included if you want to write your own or validate contributions. MIT license — use these in any tool.&lt;/p&gt;

&lt;p&gt;Contributions welcome. If your team has a playbook that's earned its way into your process, open a PR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Solon-Dev/solon-playbooks" rel="noopener noreferrer"&gt;github.com/Solon-Dev/solon-playbooks&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to see them enforced automatically on your PRs: &lt;a href="https://solonreview.dev" rel="noopener noreferrer"&gt;solonreview.dev&lt;/a&gt; — free tier is 25 reviews/month, no card required.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>typescript</category>
      <category>opensource</category>
      <category>aitools</category>
    </item>
    <item>
      <title>I built an AI tool that enforces your team's coding standards on every PR automatically</title>
      <dc:creator>DontaRuffin</dc:creator>
      <pubDate>Sat, 11 Apr 2026 14:57:20 +0000</pubDate>
      <link>https://dev.to/dontaruffin/i-built-an-ai-tool-that-enforces-your-teams-coding-standards-on-every-pr-automatically-46ml</link>
      <guid>https://dev.to/dontaruffin/i-built-an-ai-tool-that-enforces-your-teams-coding-standards-on-every-pr-automatically-46ml</guid>
      <description>&lt;p&gt;Every team has a checklist of things they &lt;em&gt;should&lt;/em&gt; verify in every PR — accessibility compliance, security patterns, code quality rules — but manual checks get forgotten. Tech debt accumulates.&lt;/p&gt;

&lt;p&gt;I built Solon AI to solve this. It connects to your GitHub repos as a GitHub App and automatically enforces your team's playbook rules on every pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Connect your repo to Solon AI&lt;/li&gt;
&lt;li&gt;Configure your playbook rules in the dashboard (no config files needed)&lt;/li&gt;
&lt;li&gt;Open a PR — Solon reviews it automatically and posts a comment&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example output
&lt;/h2&gt;

&lt;p&gt;I added this intentionally bad code to a test PR:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"photo.jpg"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;button&amp;gt;&lt;/span&gt;Click me&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Solon caught both violations immediately:&lt;/p&gt;

&lt;h2&gt;
  
  
  What's built
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub App webhook&lt;/strong&gt; — zero setup, works automatically on every PR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual playbook configuration&lt;/strong&gt; — no config files, configure rules in the dashboard UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BLOCKING/WARNING severity&lt;/strong&gt; — teams decide what blocks vs warns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review history dashboard&lt;/strong&gt; — every review saved, searchable, deletable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; — check standards directly from Claude Code or Cursor before opening a PR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ethics by design&lt;/strong&gt; — no user_id in reviews, diff-only processing, human override always maintained&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Free tier: 25 reviews/month, 1 repo&lt;br&gt;
Pro: $29/month flat — unlimited reviews, unlimited repos, no per-seat fees&lt;/p&gt;

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

&lt;p&gt;Next.js 15, TypeScript, Neon Postgres, Claude Haiku, GitHub App webhooks, Stripe, Vercel&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking for
&lt;/h2&gt;

&lt;p&gt;Engineering managers at teams of 10–50 developers tired of catching the same PR issues every sprint. Happy to set you up on Pro free in exchange for honest feedback.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://solonreview.dev" rel="noopener noreferrer"&gt;solonreview.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>github</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
