{"slug": "i-built-an-ai-that-reviews-every-pr-automatically-because-nobody-was-reviewing", "title": "I built an AI that reviews every PR automatically (because nobody was reviewing mine)", "summary": "The article describes how the author built \"PushSafe,\" an AI tool that automatically reviews every pull request (PR) on GitHub by posting inline comments on code diffs. It was created because the author was shipping code quickly with AI assistance but missing critical bugs—such as null errors, missing awaits, and hardcoded secrets—that caused production crashes and user churn. PushSafe is free, requires no credit card, and aims to catch basic but embarrassing mistakes that a human reviewer would normally spot.", "body_md": "I've been vibe coding for months.\n\nCursor writes the code. Claude fixes the bugs. I ship.\n\nFast. Really fast.\n\nBut nobody was reviewing my code.\n\nNot me. Not a teammate. Nobody.\n\nI'd read the diff quickly, it looked fine, I merged it.\n\nThen a user found the bug I missed.\n\nThey didn't email me. They just left.\n\n## The real problem with vibe coding\n\nAI helps you write code faster than ever.\n\nIt does not stop you from shipping broken code.\n\nYou prompt Claude. It writes 200 lines.\n\nYou read it once. Looks fine. You merge it.\n\nBut did you check what happens when\n\nthe user object is null?\n\nDid you check what happens when the API times out?\n\nYou didn't. Nobody does.\n\n## The bugs that kill your SaaS\n\nThey're not exotic. They're embarrassing.\n\n``` js\n// null not handled\nconst user = getUser(id)\nconsole.log(user.email) // crashes in prod\n\n// missing await\nconst data = fetchUserData(id)\nreturn data.profile // returns Promise not data\n\n// hardcoded secret\nconst stripe = new Stripe(\"sk_live_4eC39...\")\n// committed to GitHub. game over.\n```\n\nBasic stuff. The kind of thing a junior dev\n\ncatches in 30 seconds.\n\nBut you have no junior dev.\n\n## What I built\n\nPushSafe connects to your GitHub repos and\n\nautomatically reviews every PR you open.\n\nPosts inline comments on the diff.\n\nLike a teammate who never sleeps.\n\nStack: Next.js · Supabase · GitHub Webhooks ·\n\nOpenRouter · Vercel\n\n## What it catches\n\n- Null/undefined crashes\n- Missing await\n- SQL injection\n- Hardcoded secrets\n- Logic errors\n- Unhandled promises\n\n## What it ignores\n\n- Formatting\n- Semicolons\n- Indentation\n- All the noise\n\nYour linter handles style.\n\nPushSafe handles the stuff that wakes you up at 3am.\n\n## Try it\n\n[pushsafe](//pushsafe.xyz) — free, no credit card, 2 min setup.\n\nFollow along on X [kshaaneali](https://x.com/kshaaneali)", "url": "https://wpnews.pro/news/i-built-an-ai-that-reviews-every-pr-automatically-because-nobody-was-reviewing", "canonical_source": "https://dev.to/kshaaneali/i-built-an-ai-that-reviews-every-pr-automatically-because-nobody-was-reviewing-mine-5bjd", "published_at": "2026-05-23 17:43:44+00:00", "updated_at": "2026-05-23 18:03:02.767302+00:00", "lang": "en", "topics": ["artificial-intelligence", "developer-tools", "startups", "products", "open-source"], "entities": ["PushSafe", "Cursor", "Claude", "GitHub", "OpenRouter", "Vercel", "Supabase", "Stripe"], "alternates": {"html": "https://wpnews.pro/news/i-built-an-ai-that-reviews-every-pr-automatically-because-nobody-was-reviewing", "markdown": "https://wpnews.pro/news/i-built-an-ai-that-reviews-every-pr-automatically-because-nobody-was-reviewing.md", "text": "https://wpnews.pro/news/i-built-an-ai-that-reviews-every-pr-automatically-because-nobody-was-reviewing.txt", "jsonld": "https://wpnews.pro/news/i-built-an-ai-that-reviews-every-pr-automatically-because-nobody-was-reviewing.jsonld"}}