feat: add new PR Reviewer page with alternative messaging

- Created /pr-reviewer route with new page component
- Implemented PRReviewerContent with edgier, more direct messaging
- Focus on AI-generated code risks and security concerns
- Uses same structure as /reviewer but with completely different copy
- Emphasizes paranoid senior developer angle
- Highlights specific issues: JWT bugs, regex backtracking, billing errors
This commit is contained in:
Roo Code 2025-11-03 14:31:12 +00:00
parent 5fb36d9c85
commit 7276ce00cf
2 changed files with 398 additions and 0 deletions

View file

@ -0,0 +1,333 @@
"use client"
import { ArrowRight, AlertTriangle, Bot, Shield, Brain, Zap, CheckCircle2 } from "lucide-react"
import Image from "next/image"
import { Button } from "@/components/ui"
import { AnimatedBackground } from "@/components/homepage"
import { AgentCarousel } from "@/components/reviewer/agent-carousel"
import { EXTERNAL_LINKS } from "@/lib/constants"
import { trackGoogleAdsConversion } from "@/lib/analytics/google-ads"
// Workaround for next/image choking on these for some reason
import hero from "/public/heroes/agent-reviewer.png"
export function PRReviewerContent() {
return (
<>
{/* Hero Section */}
<section className="relative flex md:h-[calc(70vh-theme(spacing.12))] items-center overflow-hidden">
<AnimatedBackground />
<div className="container relative flex items-center h-full z-10 mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid h-full relative gap-4 md:gap-20 lg:grid-cols-2">
<div className="flex flex-col px-4 justify-center space-y-6 sm:space-y-8">
<div>
<h1 className="text-3xl font-bold tracking-tight mt-8 md:text-left md:text-4xl lg:text-5xl lg:mt-0">
Your AI wrote the code. Roo made sure it&apos;s safe to ship.
</h1>
<div className="mt-4 max-w-lg space-y-4 text-base text-muted-foreground md:text-left sm:mt-6">
<p>
AI-generated commits are flooding PRs. Some are fine. Some disable JWT
verification. Roo PR Reviewer catches what slipped through before it hits prod.
</p>
<blockquote className="italic border-l-4 border-muted-foreground/30 pl-4 text-sm">
&quot;Bold strategy: a trust-based JWT system. What could possibly go
wrong?&quot;
</blockquote>
</div>
</div>
<div className="flex flex-col space-y-3 sm:flex-row sm:space-x-4 sm:space-y-0 md:items-center">
<Button
size="lg"
className="w-full sm:w-auto backdrop-blur-sm border hover:shadow-[0_0_20px_rgba(59,130,246,0.5)] transition-all duration-300"
asChild>
<a
href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO}
target="_blank"
rel="noopener noreferrer"
onClick={trackGoogleAdsConversion}
className="flex w-full items-center justify-center">
Try Roo Reviewer Free
<ArrowRight className="ml-2" />
</a>
</Button>
</div>
</div>
<div className="flex items-center justify-end mx-auto h-full mt-8 lg:mt-0">
<div className="md:w-[800px] md:h-[474px] relative overflow-clip">
<div className="block">
<Image
src={hero}
alt="Example of a code review generated by Roo Code PR Reviewer"
className="max-w-full h-auto"
width={800}
height={474}
/>
</div>
</div>
</div>
</div>
</div>
</section>
{/* The Problem Section */}
<section className="relative overflow-hidden border-t border-border py-20">
<div className="container relative z-10 mx-auto px-4 sm:px-6 lg:px-8">
<div className="mx-auto max-w-4xl">
<div className="flex items-center gap-3 mb-6">
<AlertTriangle className="size-8 text-amber-500" />
<h2 className="text-3xl font-bold tracking-tight sm:text-4xl">The Problem</h2>
</div>
<div className="space-y-4 text-lg text-muted-foreground">
<p>
AI&apos;s writing more code than ever and most of it <em>looks</em> right. But beneath
that green diff are:
</p>
<ul className="space-y-3 ml-6">
<li className="flex items-start gap-2">
<span className="text-red-500 mt-1"></span>
<span>silent security holes</span>
</li>
<li className="flex items-start gap-2">
<span className="text-red-500 mt-1"></span>
<span>rounding bugs that eat customer money</span>
</li>
<li className="flex items-start gap-2">
<span className="text-red-500 mt-1"></span>
<span>regexes that backtrack until your weekend&apos;s gone</span>
</li>
</ul>
<p className="font-semibold text-foreground pt-4">
Your team is reviewing more code than ever, but catching less.
</p>
</div>
</div>
</div>
</section>
{/* The Roo Fix Section */}
<section className="relative overflow-hidden border-t border-border py-20">
<div className="container relative z-10 mx-auto px-4 sm:px-6 lg:px-8">
<div className="mx-auto max-w-4xl">
<div className="flex items-center gap-3 mb-6">
<Bot className="size-8 text-blue-500" />
<h2 className="text-3xl font-bold tracking-tight sm:text-4xl">The Roo Fix</h2>
</div>
<div className="space-y-4 text-lg text-muted-foreground">
<p>
<strong className="text-foreground">Roo PR Reviewer</strong> fights AI chaos with AI
precision.
</p>
<p>
It reads your PRs like a senior engineer not a spellchecker. It flags the real
problems and skips the noise.
</p>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4 mt-6">
<div className="flex items-start gap-3">
<CheckCircle2 className="size-5 text-green-500 mt-1 flex-shrink-0" />
<span>Detects logic and security issues (not just lint)</span>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="size-5 text-green-500 mt-1 flex-shrink-0" />
<span>
Explains <em>why</em> the change is wrong, not just <em>what</em>
</span>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="size-5 text-green-500 mt-1 flex-shrink-0" />
<span>Integrates directly in GitHub PRs</span>
</div>
<div className="flex items-start gap-3">
<CheckCircle2 className="size-5 text-green-500 mt-1 flex-shrink-0" />
<span>Bring-your-own-API-key no token limits, no model throttling</span>
</div>
</div>
</div>
</div>
</div>
</section>
{/* How It Feels Section */}
<section className="relative overflow-hidden border-t border-border py-20">
<div className="container relative z-10 mx-auto px-4 sm:px-6 lg:px-8">
<div className="mx-auto max-w-4xl">
<div className="flex items-center gap-3 mb-6">
<Zap className="size-8 text-purple-500" />
<h2 className="text-3xl font-bold tracking-tight sm:text-4xl">How It Feels to Use Roo</h2>
</div>
<div className="space-y-4 text-lg text-muted-foreground">
<p>You open a PR, and Roo leaves comments like:</p>
<div className="space-y-4 mt-6">
<blockquote className="border-l-4 border-blue-500 bg-blue-500/5 p-4 italic">
&quot;Great news: &apos;1000&apos; is now cheaper than &apos;200&apos;. Sort
numerically; keep values as numbers.&quot;
</blockquote>
<blockquote className="border-l-4 border-amber-500 bg-amber-500/5 p-4 italic">
&quot;This regex can spend the weekend backtracking. Use a safe validator.&quot;
</blockquote>
<blockquote className="border-l-4 border-red-500 bg-red-500/5 p-4 italic">
&quot;Rounding errors become billing errors. Use `Decimal` end-to-end.&quot;
</blockquote>
</div>
<p className="font-semibold text-foreground pt-4">
It&apos;s like having that one paranoid senior dev back on your team but this one
never sleeps.
</p>
</div>
</div>
</div>
</section>
{/* Why Engineers Love It Section */}
<section className="relative overflow-hidden border-t border-border py-20">
<div className="container relative z-10 mx-auto px-4 sm:px-6 lg:px-8">
<div className="mx-auto max-w-4xl">
<div className="flex items-center gap-3 mb-6">
<Brain className="size-8 text-green-500" />
<h2 className="text-3xl font-bold tracking-tight sm:text-4xl">Why Engineers Love It</h2>
</div>
<div className="space-y-4 text-lg">
<div className="space-y-3">
<div className="flex items-start gap-3">
<span className="text-green-500 font-bold"></span>
<div>
<strong className="text-foreground">Fewer false positives</strong>
<span className="text-muted-foreground ml-1">
Roo comments are focused, not fluffy.
</span>
</div>
</div>
<div className="flex items-start gap-3">
<span className="text-green-500 font-bold"></span>
<div>
<strong className="text-foreground">Understands your context</strong>
<span className="text-muted-foreground ml-1">
reads your repo, not a random snippet.
</span>
</div>
</div>
<div className="flex items-start gap-3">
<span className="text-green-500 font-bold"></span>
<div>
<strong className="text-foreground">Catches what humans miss</strong>
<span className="text-muted-foreground ml-1">
subtle bugs, security drift, AI hallucinations.
</span>
</div>
</div>
</div>
<p className="font-semibold text-foreground pt-4 text-center italic">
Engineers call it &quot;the only AI review that doesn&apos;t make me dumber.&quot;
</p>
</div>
</div>
</div>
</section>
{/* Try It Section */}
<section className="relative overflow-hidden border-t border-border py-20">
<div className="container relative z-10 mx-auto px-4 sm:px-6 lg:px-8">
<div className="mx-auto max-w-4xl">
<div className="flex items-center gap-3 mb-6">
<Shield className="size-8 text-indigo-500" />
<h2 className="text-3xl font-bold tracking-tight sm:text-4xl">Try It on Your Next PR</h2>
</div>
<div className="space-y-4">
<ol className="space-y-4 text-lg">
<li className="flex items-start gap-3">
<span className="flex-shrink-0 bg-indigo-500 text-white rounded-full w-7 h-7 flex items-center justify-center font-bold text-sm">
1
</span>
<span className="text-muted-foreground">
Add Roo to your repo (takes 3 minutes).
</span>
</li>
<li className="flex items-start gap-3">
<span className="flex-shrink-0 bg-indigo-500 text-white rounded-full w-7 h-7 flex items-center justify-center font-bold text-sm">
2
</span>
<span className="text-muted-foreground">Push a PR Roo reviews instantly.</span>
</li>
<li className="flex items-start gap-3">
<span className="flex-shrink-0 bg-indigo-500 text-white rounded-full w-7 h-7 flex items-center justify-center font-bold text-sm">
3
</span>
<span className="text-muted-foreground">
Watch it flag the stuff your AI or teammate didn&apos;t notice.
</span>
</li>
</ol>
<div className="mt-8 flex justify-center">
<Button
size="lg"
className="bg-black text-white hover:bg-gray-800 hover:shadow-lg hover:shadow-black/20 dark:bg-white dark:text-black dark:hover:bg-gray-200 dark:hover:shadow-white/20 transition-all duration-300"
asChild>
<a
href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO}
target="_blank"
rel="noopener noreferrer"
onClick={trackGoogleAdsConversion}
className="flex items-center justify-center">
Try Roo Reviewer Free
<ArrowRight className="ml-2 h-4 w-4" />
</a>
</Button>
</div>
</div>
</div>
</div>
</section>
{/* Agent Team Section */}
<section className="relative overflow-hidden border-t border-border py-32">
<div className="container relative z-10 mx-auto px-4 sm:px-6 lg:px-8">
<div className="mx-auto mb-12 max-w-4xl text-center">
<h2 className="text-4xl font-bold tracking-tight sm:text-5xl mb-6">
The first member of a whole new team
</h2>
<p className="text-lg text-muted-foreground">
Architecture, coding, reviewing, testing, debugging, documenting, designing {" "}
<em>almost everything</em> we do today is mostly through our agents. Now we&apos;re bringing
them to you.
</p>
<p className="mt-4 text-lg text-muted-foreground">
Roo&apos;s PR Reviewer isn&apos;t yet another single-purpose tool to add to your already
complicated stack. It&apos;s the first member of your AI-powered development team. More
agents are shipping soon.
</p>
</div>
<div className="relative mx-auto md:max-w-[1200px]">
<AgentCarousel />
</div>
</div>
</section>
{/* Footer CTA */}
<section className="py-20">
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
<div className="mx-auto max-w-4xl rounded-3xl border border-border/50 bg-gradient-to-br from-red-500/5 via-amber-500/5 to-blue-500/5 p-8 text-center shadow-2xl backdrop-blur-xl dark:border-white/20 dark:bg-gradient-to-br dark:from-gray-800 dark:via-gray-900 dark:to-black sm:p-12">
<p className="text-2xl font-bold mb-8 italic text-foreground">
AI is writing your code. Roo makes sure it&apos;s still safe to ship.
</p>
<div className="flex flex-col justify-center space-y-4 sm:flex-row sm:space-x-4 sm:space-y-0">
<Button
size="lg"
className="bg-black text-white hover:bg-gray-800 hover:shadow-lg hover:shadow-black/20 dark:bg-white dark:text-black dark:hover:bg-gray-200 dark:hover:shadow-white/20 transition-all duration-300"
asChild>
<a
href={EXTERNAL_LINKS.CLOUD_APP_SIGNUP_PRO}
target="_blank"
rel="noopener noreferrer"
onClick={trackGoogleAdsConversion}
className="flex items-center justify-center">
Try Roo Reviewer Free
<ArrowRight className="ml-2 h-4 w-4" />
</a>
</Button>
</div>
</div>
</div>
</section>
</>
)
}

View file

@ -0,0 +1,65 @@
import type { Metadata } from "next"
import { SEO } from "@/lib/seo"
import { ogImageUrl } from "@/lib/og"
import { PRReviewerContent } from "./PRReviewerContent"
const TITLE = "PR Reviewer"
const DESCRIPTION =
"Your AI wrote the code. Roo made sure it's safe to ship. AI-generated commits are flooding PRs. Roo PR Reviewer catches what slipped through before it hits prod."
const OG_DESCRIPTION = "Your AI wrote the code. Roo made sure it's safe to ship."
const PATH = "/pr-reviewer"
export const metadata: Metadata = {
title: TITLE,
description: DESCRIPTION,
alternates: {
canonical: `${SEO.url}${PATH}`,
},
openGraph: {
title: TITLE,
description: DESCRIPTION,
url: `${SEO.url}${PATH}`,
siteName: SEO.name,
images: [
{
url: ogImageUrl(TITLE, OG_DESCRIPTION),
width: 1200,
height: 630,
alt: TITLE,
},
],
locale: SEO.locale,
type: "website",
},
twitter: {
card: SEO.twitterCard,
title: TITLE,
description: DESCRIPTION,
images: [ogImageUrl(TITLE, OG_DESCRIPTION)],
},
keywords: [
...SEO.keywords,
"PR reviewer",
"code review",
"pull request review",
"AI code review",
"GitHub PR review",
"automated code review",
"AI-generated code",
"security review",
"JWT verification",
"regex security",
"billing errors",
"logic bugs",
"AI hallucinations",
"senior developer",
"paranoid code review",
"bring your own key",
"BYOK AI",
],
}
export default function PRReviewerPage() {
return <PRReviewerContent />
}