From af718fec95c83528f3e133b42551ec014a2a6563 Mon Sep 17 00:00:00 2001 From: jhislop-design Date: Mon, 13 Jul 2026 10:52:19 -0500 Subject: [PATCH 1/3] feat(partners): add dedicated CodeRabbit Gold partner landing page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds /partners/coderabbit, a rich SEO- and AI-search-optimized landing page for the CodeRabbit Gold sponsorship, modeled on the Railway partner page structure (hero, stats, features, how-it-works, library fit, pricing, testimonials, FAQ, CTA). Content is sourced from coderabbit.ai: real pricing (Free/Pro/Pro Plus/ Enterprise), stats, features, and testimonials. Per the repo's partner guidance, CodeRabbit is presented as a GitHub App with an optional .coderabbit.yaml config — no runtime app code — rather than an SDK. Includes seo() meta plus FAQPage and WebPage JSON-LD for rich results. --- src/routeTree.gen.ts | 21 + src/routes/partners.coderabbit.tsx | 822 +++++++++++++++++++++++++++++ 2 files changed, 843 insertions(+) create mode 100644 src/routes/partners.coderabbit.tsx diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts index fc3a7200d..f8aa5b26d 100644 --- a/src/routeTree.gen.ts +++ b/src/routeTree.gen.ts @@ -57,6 +57,7 @@ import { Route as ShopSearchRouteImport } from './routes/shop.search' import { Route as ShopCartRouteImport } from './routes/shop.cart' import { Route as ShopHandleRouteImport } from './routes/shop.$handle' import { Route as PartnersRailwayRouteImport } from './routes/partners.railway' +import { Route as PartnersCoderabbitRouteImport } from './routes/partners.coderabbit' import { Route as PartnersPartnerRouteImport } from './routes/partners.$partner' import { Route as OauthTokenRouteImport } from './routes/oauth/token' import { Route as OauthRegisterRouteImport } from './routes/oauth/register' @@ -402,6 +403,11 @@ const PartnersRailwayRoute = PartnersRailwayRouteImport.update({ path: '/railway', getParentRoute: () => PartnersRoute, } as any) +const PartnersCoderabbitRoute = PartnersCoderabbitRouteImport.update({ + id: '/coderabbit', + path: '/coderabbit', + getParentRoute: () => PartnersRoute, +} as any) const PartnersPartnerRoute = PartnersPartnerRouteImport.update({ id: '/$partner', path: '/$partner', @@ -1029,6 +1035,7 @@ export interface FileRoutesByFullPath { '/oauth/register': typeof OauthRegisterRoute '/oauth/token': typeof OauthTokenRoute '/partners/$partner': typeof PartnersPartnerRoute + '/partners/coderabbit': typeof PartnersCoderabbitRoute '/partners/railway': typeof PartnersRailwayRoute '/shop/$handle': typeof ShopHandleRoute '/shop/cart': typeof ShopCartRoute @@ -1176,6 +1183,7 @@ export interface FileRoutesByTo { '/oauth/register': typeof OauthRegisterRoute '/oauth/token': typeof OauthTokenRoute '/partners/$partner': typeof PartnersPartnerRoute + '/partners/coderabbit': typeof PartnersCoderabbitRoute '/partners/railway': typeof PartnersRailwayRoute '/shop/$handle': typeof ShopHandleRoute '/shop/cart': typeof ShopCartRoute @@ -1329,6 +1337,7 @@ export interface FileRoutesById { '/oauth/register': typeof OauthRegisterRoute '/oauth/token': typeof OauthTokenRoute '/partners/$partner': typeof PartnersPartnerRoute + '/partners/coderabbit': typeof PartnersCoderabbitRoute '/partners/railway': typeof PartnersRailwayRoute '/shop/$handle': typeof ShopHandleRoute '/shop/cart': typeof ShopCartRoute @@ -1485,6 +1494,7 @@ export interface FileRouteTypes { | '/oauth/register' | '/oauth/token' | '/partners/$partner' + | '/partners/coderabbit' | '/partners/railway' | '/shop/$handle' | '/shop/cart' @@ -1632,6 +1642,7 @@ export interface FileRouteTypes { | '/oauth/register' | '/oauth/token' | '/partners/$partner' + | '/partners/coderabbit' | '/partners/railway' | '/shop/$handle' | '/shop/cart' @@ -1784,6 +1795,7 @@ export interface FileRouteTypes { | '/oauth/register' | '/oauth/token' | '/partners/$partner' + | '/partners/coderabbit' | '/partners/railway' | '/shop/$handle' | '/shop/cart' @@ -2301,6 +2313,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof PartnersRailwayRouteImport parentRoute: typeof PartnersRoute } + '/partners/coderabbit': { + id: '/partners/coderabbit' + path: '/coderabbit' + fullPath: '/partners/coderabbit' + preLoaderRoute: typeof PartnersCoderabbitRouteImport + parentRoute: typeof PartnersRoute + } '/partners/$partner': { id: '/partners/$partner' path: '/$partner' @@ -3267,12 +3286,14 @@ const BuilderRouteWithChildren = interface PartnersRouteChildren { PartnersPartnerRoute: typeof PartnersPartnerRoute + PartnersCoderabbitRoute: typeof PartnersCoderabbitRoute PartnersRailwayRoute: typeof PartnersRailwayRoute PartnersIndexRoute: typeof PartnersIndexRoute } const PartnersRouteChildren: PartnersRouteChildren = { PartnersPartnerRoute: PartnersPartnerRoute, + PartnersCoderabbitRoute: PartnersCoderabbitRoute, PartnersRailwayRoute: PartnersRailwayRoute, PartnersIndexRoute: PartnersIndexRoute, } diff --git a/src/routes/partners.coderabbit.tsx b/src/routes/partners.coderabbit.tsx new file mode 100644 index 000000000..969ce46f6 --- /dev/null +++ b/src/routes/partners.coderabbit.tsx @@ -0,0 +1,822 @@ +import * as React from 'react' +import { Link, createFileRoute } from '@tanstack/react-router' +import { + ArrowUpRight, + Brain, + Check, + Code2, + GitPullRequest, + ListChecks, + Plus, + ScrollText, + ShieldCheck, + Sparkles, + Terminal, + Wand2, +} from 'lucide-react' +import { twMerge } from 'tailwind-merge' +import { Footer } from '~/components/Footer' +import { Card } from '~/components/Card' +import { Button } from '~/ui' +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from '~/components/Collapsible' +import { CodeBlock } from '~/components/markdown/CodeBlock' +import { seo } from '~/utils/seo' +import { getPartnerById, PartnerImage } from '~/utils/partners' +import { getPartnerJsonLd } from '~/utils/partner-pages' +import { trackEvent } from '~/utils/analytics' + +const CODERABBIT_HREF = + 'https://coderabbit.link/tanstack?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page&via=tanstack' +const CODERABBIT_DOCS_HREF = + 'https://docs.coderabbit.ai/?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page' +const CODERABBIT_HOME_HREF = + 'https://www.coderabbit.ai/?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page' +const CODERABBIT_PRICING_HREF = + 'https://www.coderabbit.ai/pricing?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page' +const CODERABBIT_IDE_HREF = + 'https://www.coderabbit.ai/ide?utm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page' + +const CONFIG_SNIPPET = `# .coderabbit.yaml +language: en +reviews: + profile: chill + high_level_summary: true + auto_review: + enabled: true + drafts: false + path_instructions: + - path: "src/**/*.tsx" + instructions: "Flag unstable references passed to TanStack hooks." +` + +const COMMANDS_SNIPPET = `# Chat with CodeRabbit in any pull request comment +@coderabbitai review +@coderabbitai generate unit tests +@coderabbitai resolve +` + +type FeatureIcon = React.ComponentType<{ className?: string }> + +const features: Array<{ Icon: FeatureIcon; title: string; desc: string }> = [ + { + Icon: GitPullRequest, + title: 'Line-by-line PR reviews', + desc: 'Every pull request gets context-aware, file-by-file feedback within minutes — not just a linter dump, but real reasoning about your changes.', + }, + { + Icon: Code2, + title: 'Free reviews in your IDE', + desc: 'The VS Code, Cursor, and Windsurf extension reviews committed and uncommitted changes in your editor — no subscription required.', + }, + { + Icon: Wand2, + title: 'One-click fixes', + desc: 'Turn a review comment into a committed change with a "Fix with AI" button, or hand it to Copilot, Claude Code, or Cline.', + }, + { + Icon: Brain, + title: 'Learns from your team', + desc: 'Teach CodeRabbit in plain English. It remembers your conventions across repos so the same nit never comes back twice.', + }, + { + Icon: ShieldCheck, + title: '40+ linters & SAST built in', + desc: 'CodeRabbit runs ast-grep, Semgrep, and dozens of scanners for you, then explains findings in the context of the diff.', + }, + { + Icon: ScrollText, + title: 'Summaries & diagrams', + desc: 'A TL;DR walkthrough and sequence diagrams for every PR make big TanStack changes reviewable at a glance.', + }, + { + Icon: ListChecks, + title: 'Custom pre-merge checks', + desc: 'Describe the standards a PR must meet in natural language, and gate merges on them — no rules engine to maintain.', + }, + { + Icon: Terminal, + title: 'CLI for CI/CD', + desc: 'Run the same review from the command line with agent-optimized output, so automated checks run before anything merges.', + }, +] + +const steps: Array<{ num: string; title: string; code: string }> = [ + { + num: '01', + title: 'Install the GitHub App', + code: 'github.com/apps/coderabbitai', + }, + { + num: '02', + title: 'Choose which repos it reviews', + code: 'app.coderabbit.ai/settings', + }, + { num: '03', title: 'Open a pull request', code: '@coderabbitai review' }, + { num: '04', title: 'Tune the rules (optional)', code: '.coderabbit.yaml' }, +] + +const pricing: Array<{ + plan: string + price: string + note: string + features: Array + highlight?: boolean +}> = [ + { + plan: 'Free', + price: '$0', + note: 'per user · no credit card', + features: [ + 'Unlimited public & private repos', + 'PR summaries & IDE reviews', + '14-day Pro Plus trial', + 'Free forever in VS Code', + ], + }, + { + plan: 'Pro', + price: '$24', + note: 'per user / mo · billed annually', + features: [ + 'Full line-by-line PR reviews', + '40+ linters & SAST', + 'Jira & Linear integrations', + 'Agentic chat & analytics', + '5 PR reviews / dev / hour', + ], + highlight: true, + }, + { + plan: 'Pro Plus', + price: '$48', + note: 'per user / mo · billed annually', + features: [ + 'Everything in Pro', + 'Custom pre-merge checks', + 'Finishing touches & issue planner', + 'Higher rate & MCP limits', + ], + }, + { + plan: 'Enterprise', + price: 'Custom', + note: 'for teams at scale', + features: [ + 'SSO, RBAC & audit logs', + 'Self-hosting & API access', + 'EU SaaS deployment', + 'SLA + dedicated CSM', + ], + }, +] + +const extras: Array<[string, string]> = [ + ['Free in your IDE', 'VS Code · Cursor · Windsurf'], + ['Reviews on', 'GitHub · GitLab · Azure · Bitbucket'], + ['Time to first review', 'Under 2 minutes'], +] + +const testimonials: Array<{ quote: string; author: string; role: string }> = [ + { + quote: "We're using CodeRabbit all over NVIDIA.", + author: 'Jensen Huang', + role: 'Founder & CEO at NVIDIA', + }, + { + quote: + 'Since adopting CodeRabbit, our confidence is up and our bugs are down; it catches edge cases humans skim past.', + author: 'Brandon Romano', + role: 'Sr. Staff Software Engineer at Clerk', + }, + { + quote: + 'Before CodeRabbit, quality depended on who reviewed your PR. Now, the bar is the same for everyone.', + author: 'Abhi Aiyer', + role: 'CTO at Mastra', + }, + { + quote: + 'The bottleneck was always code review. CodeRabbit solves that one problem.', + author: 'Kiran Kanagasekar', + role: 'Sr. Engineering Manager at TaskRabbit', + }, +] + +const libraries = [ + 'Start', + 'Router', + 'Query', + 'Table', + 'Form', + 'DB', + 'AI', + 'Virtual', + 'Pacer', + 'Store', + 'Devtools', + 'CLI', +] + +const libDetails: Array<{ label: string; desc: string }> = [ + { + label: 'TanStack Start', + desc: 'Reviews server functions, route loaders, and SSR logic in the PR — the seams where full-stack bugs actually hide.', + }, + { + label: 'TanStack Router', + desc: 'Catches unstable route options, missing loader deps, and search-param mistakes before they ship to a preview.', + }, + { + label: 'TanStack Query', + desc: 'Flags fragile query keys, missing invalidations, and effect-vs-query anti-patterns that are easy to miss in review.', + }, + { + label: 'TanStack Table & Form', + desc: 'Reasons about the heavy generics these libraries lean on, so type regressions get caught at review time.', + }, +] + +const faqs: Array<{ q: string; a: string }> = [ + { + q: 'Do I need to add CodeRabbit code to my TanStack app?', + a: 'No. CodeRabbit is a GitHub App, not an SDK — you install it on your repositories and it reviews pull requests externally. There is no runtime code to add. An optional .coderabbit.yaml file at the root of your repo lets you tune review behavior and add path-specific instructions.', + }, + { + q: 'Which platforms and editors does CodeRabbit support?', + a: 'CodeRabbit reviews pull requests on GitHub, GitLab, Azure DevOps, and Bitbucket. It also ships a free extension for VS Code, Cursor, and Windsurf, plus a CLI you can run locally or in CI/CD pipelines.', + }, + { + q: 'Is there a free option?', + a: 'Yes. The Free plan covers unlimited public and private repositories with PR summaries and IDE reviews, and every account starts with a 14-day Pro Plus trial — no credit card required. AI code reviews in VS Code, Cursor, and Windsurf are free to use.', + }, + { + q: 'How much does CodeRabbit cost?', + a: 'Free is $0 per user. Pro is $24 per user per month billed annually and adds full PR reviews, 40+ linters and SAST tools, and integrations. Pro Plus is $48 per user per month and adds custom pre-merge checks and higher limits. Enterprise is custom and adds SSO, self-hosting, and API access.', + }, + { + q: 'Can CodeRabbit understand TanStack-specific patterns?', + a: 'Yes. Reviews are context-aware across your whole diff, and CodeRabbit learns from your feedback in plain English so it remembers your conventions. You can also add path_instructions in .coderabbit.yaml to give it TanStack-specific guidance, such as flagging unstable references passed to Router or Query hooks.', + }, + { + q: 'How is this different from GitHub Copilot or a plain linter?', + a: "CodeRabbit reviews the whole change with reasoning, not just the line under your cursor. It runs 40+ scanners for you, explains findings in context, offers one-click fixes, learns your standards, and gates merges on custom checks. As one CTO put it, the differentiator isn't generating code — it's governing it.", + }, +] + +const PAGE_TITLE = 'CodeRabbit for TanStack — AI Code Review, Gold Partner' +const PAGE_DESCRIPTION = + 'CodeRabbit gives TanStack teams AI code review on every pull request, in the IDE, and in the CLI. Line-by-line reviews, 40+ built-in linters and SAST tools, one-click fixes, and custom pre-merge checks — installed as a GitHub App with no runtime code to add. Free in VS Code, Cursor, and Windsurf.' + +function getFaqJsonLd() { + return { + '@context': 'https://schema.org', + '@type': 'FAQPage', + mainEntity: faqs.map((faq) => ({ + '@type': 'Question', + name: faq.q, + acceptedAnswer: { + '@type': 'Answer', + text: faq.a, + }, + })), + } +} + +export const Route = createFileRoute('/partners/coderabbit')({ + head: () => { + const partner = getPartnerById('coderabbit') + + return { + meta: seo({ + title: PAGE_TITLE, + description: PAGE_DESCRIPTION, + keywords: + 'coderabbit tanstack, ai code review, coderabbit pricing, tanstack pull request review, coderabbit github app, coderabbit gold sponsor', + image: 'https://tanstack.com/og.png', + }), + scripts: [ + ...(partner + ? [ + { + type: 'application/ld+json', + children: JSON.stringify(getPartnerJsonLd(partner)), + }, + ] + : []), + { + type: 'application/ld+json', + children: JSON.stringify(getFaqJsonLd()), + }, + ], + } + }, + component: CodeRabbitPartnerPage, +}) + +function CheckBadge() { + return ( + + + + ) +} + +function trackCodeRabbitClick() { + trackEvent('partner_clicked', { + partner_id: 'coderabbit', + placement: 'detail', + destination: 'external', + destination_host: 'coderabbit.ai', + }) +} + +function CodeRabbitCodeExample({ + code, + lang, + title, +}: { + code: string + lang: string + title: string +}) { + return ( + + {code} + + ) +} + +function CodeRabbitPartnerPage() { + const [openFaq, setOpenFaq] = React.useState(null) + + React.useEffect(() => { + trackEvent('partner_viewed', { + partner_id: 'coderabbit', + placement: 'detail', + }) + }, []) + + const partner = getPartnerById('coderabbit') + + return ( +
+
+ + + {/* Hero */} +
+
+ {partner ? ( +
+ +
+ ) : null} +
+ + Gold Sponsor · AI Code Review + +
+ + + Most installed AI app on GitHub + +
+
+
+ +

+ Cut TanStack code review +
+ time and bugs in half +

+ +

+ CodeRabbit gives TanStack teams AI code review on every pull request + — line-by-line feedback, 40+ built-in scanners, and one-click fixes. + It installs as a GitHub App, so there is no code to add to your app. +

+ +

+ "The bottleneck was always code review. CodeRabbit solves that one + problem." — Kiran Kanagasekar, Sr. Engineering Manager at TaskRabbit +

+ +
+ + +
+

+ No credit card required. 14-day Pro Plus trial on every account. +

+
+ + {/* Stats */} +
+ {[ + ['6M+', 'Repositories reviewed'], + ['75M+', 'Defects caught'], + ['15,000+', 'Customers'], + ['$0', 'Reviews in your IDE'], + ].map(([value, label]) => ( +
+
{value}
+
+ {label} +
+
+ ))} +
+ + {/* Features */} +
+

+ Why TanStack teams choose CodeRabbit +

+

+ CodeRabbit shortens review cycles without lowering the bar. Here's + what makes it the right fit for TanStack developers. +

+
+ {features.map(({ Icon, title, desc }) => ( + + +
{title}
+

+ {desc} +

+
+ ))} +
+
+ + {/* How it works */} +
+

+ From install to first review in 4 steps +

+

+ CodeRabbit runs as a GitHub App on top of your repos. Install it, + pick your repositories, and open a PR — no runtime code required. +

+ +
+ {steps.map(({ num, title, code }) => ( + +
+ {num} +
+
+
{title}
+ + {code} + +
+
+ ))} +
+ +
+ + +
+ +
+ + +
+
+ + {/* Library fit */} +
+

+ Reviews every TanStack library +

+

+ CodeRabbit reads your whole diff, so it understands the parts of + TanStack apps that are easiest to get wrong in review. +

+ +
+ {libraries.map((lib) => ( + + {lib} + + ))} +
+ +
+ {libDetails.map(({ label, desc }) => ( + +
+ + {label} +
+

+ {desc} +

+
+ ))} +
+
+ + {/* Pricing */} +
+

+ Pricing that scales with your team +

+

+ Start free, and only pay per seat when your team is ready for full + pull-request reviews. IDE reviews stay free. +

+ +
+ {pricing.map(({ plan, price, note, features: pf, highlight }) => ( + + {highlight ? ( + + Most popular + + ) : null} +
{plan}
+
+ {price} +
+
+ {note} +
+
    + {pf.map((feat) => ( +
  • + + {feat} +
  • + ))} +
+
+ ))} +
+ +
+ {extras.map(([key, value]) => ( +
+
+ {key} +
+
{value}
+
+ ))} +
+ +
+ + +
+
+ + {/* Testimonials */} +
+

+ What engineering teams say +

+

+ Real quotes from engineers who put CodeRabbit in front of their pull + requests. +

+
+ {testimonials.map(({ quote, author, role }) => ( + +
+ "{quote}" +
+
+
{author}
+
+ {role} +
+
+
+ ))} +
+ +
+ + + + Free in VS Code, Cursor & Windsurf + +
+
+ + {/* FAQ */} +
+

+ Frequently asked questions +

+

+ Common questions from TanStack developers evaluating CodeRabbit. +

+ +
+ {faqs.map(({ q, a }, i) => { + const isOpen = openFaq === i + return ( + setOpenFaq(next ? i : null)} + className="border-b border-gray-200 dark:border-gray-800" + > + + + {q} + + + + +

+ {a} +

+
+
+ ) + })} +
+
+ + {/* CTA */} +
+
+ Free AI reviews in your IDE and your PRs +
+

+ Ship TanStack code with confidence +

+

+ No credit card required. No runtime code to add. Just install the + GitHub App and open a pull request. +

+

+ Trusted by 15,000+ teams to catch the bugs humans skim past. +

+ +
+ + +
+
+ +

+ CodeRabbit is a Gold-tier TanStack sponsor.{' '} + + Browse all TanStack partners + + .{' '} + + coderabbit.ai + +

+
+ +
+
+ ) +} From a8530019a2faabdfa0791d3389315945d87bdd35 Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 15:54:58 +0000 Subject: [PATCH 2/3] ci: apply automated fixes --- src/routes/partners.coderabbit.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/partners.coderabbit.tsx b/src/routes/partners.coderabbit.tsx index 969ce46f6..400093d19 100644 --- a/src/routes/partners.coderabbit.tsx +++ b/src/routes/partners.coderabbit.tsx @@ -366,7 +366,10 @@ function CodeRabbitPartnerPage() {