Skip to content

Commit 7c2d70d

Browse files
feat(partners): deepen CodeRabbit page SEO content + reframe partnership
- Reframe the value section from "why teams choose CodeRabbit" to "CodeRabbit is all-in on the TanStack community" to position TanStack as the sought-after partner. - Add "What CodeRabbit catches in a TanStack PR" section (6 concrete, framework-specific examples) for AI-search and long-tail coverage. - Add "How CodeRabbit compares" table (vs manual review vs linters). - Expand FAQ 6 -> 12 (data privacy/training, language support, monorepo path scoping, test/docstring generation, bot chat, Jira/Linear/MCP); FAQPage JSON-LD scales automatically. All new claims verified against coderabbit.ai and its docs.
1 parent a853001 commit 7c2d70d

1 file changed

Lines changed: 208 additions & 3 deletions

File tree

src/routes/partners.coderabbit.tsx

Lines changed: 208 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,85 @@ const libDetails: Array<{ label: string; desc: string }> = [
240240
},
241241
]
242242

243+
const catches: Array<{ label: string; desc: string }> = [
244+
{
245+
label: 'Unstable hook inputs',
246+
desc: 'Flags new object, array, or function references passed into Router and Query hooks that quietly trigger extra re-renders or refetches.',
247+
},
248+
{
249+
label: 'Query key & cache mistakes',
250+
desc: 'Catches query keys that drift out of sync with their invalidations, and effect-driven fetching that should really be a query.',
251+
},
252+
{
253+
label: 'Server function safety',
254+
desc: 'Points out missing awaits, unhandled errors, and unvalidated input in TanStack Start server functions before they reach production.',
255+
},
256+
{
257+
label: 'Routing & loaders',
258+
desc: 'Surfaces missing loader dependencies, unparsed search params, and route options that break on navigation or SSR.',
259+
},
260+
{
261+
label: 'Type regressions',
262+
desc: 'Reasons about the heavy generics in Table and Form so a subtle type break gets called out at review time, not in CI.',
263+
},
264+
{
265+
label: 'Security & leaked secrets',
266+
desc: 'Runs SAST scanners and secret detection over the diff, then explains each finding in context instead of dumping raw linter output.',
267+
},
268+
]
269+
270+
type ComparisonValue = boolean | 'partial'
271+
272+
const comparison: Array<{
273+
capability: string
274+
manual: ComparisonValue
275+
linters: ComparisonValue
276+
coderabbit: ComparisonValue
277+
}> = [
278+
{
279+
capability: 'Catches context & logic bugs',
280+
manual: true,
281+
linters: false,
282+
coderabbit: true,
283+
},
284+
{
285+
capability: 'Runs 40+ security scanners',
286+
manual: false,
287+
linters: 'partial',
288+
coderabbit: true,
289+
},
290+
{
291+
capability: 'Explains findings in plain English',
292+
manual: true,
293+
linters: false,
294+
coderabbit: true,
295+
},
296+
{
297+
capability: 'One-click / "Fix with AI"',
298+
manual: false,
299+
linters: false,
300+
coderabbit: true,
301+
},
302+
{
303+
capability: "Learns your team's conventions",
304+
manual: true,
305+
linters: false,
306+
coderabbit: true,
307+
},
308+
{
309+
capability: 'Generates tests & docstrings',
310+
manual: false,
311+
linters: false,
312+
coderabbit: true,
313+
},
314+
{
315+
capability: 'Instant, on every pull request',
316+
manual: false,
317+
linters: true,
318+
coderabbit: true,
319+
},
320+
]
321+
243322
const faqs: Array<{ q: string; a: string }> = [
244323
{
245324
q: 'Do I need to add CodeRabbit code to my TanStack app?',
@@ -265,6 +344,30 @@ const faqs: Array<{ q: string; a: string }> = [
265344
q: 'How is this different from GitHub Copilot or a plain linter?',
266345
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.",
267346
},
347+
{
348+
q: 'Does CodeRabbit train on my code?',
349+
a: 'No. CodeRabbit never uses customer code to train models, whether data retention is enabled or not. Your code is shared with its LLM providers only to generate a review, with data isolation for proprietary code, and Enterprise self-hosting lets you opt out of all retention entirely.',
350+
},
351+
{
352+
q: 'What languages does CodeRabbit support?',
353+
a: 'CodeRabbit is language-agnostic and reviews all major programming languages, with depth varying by how common the language is. For TanStack teams that means full TypeScript, JavaScript, and TSX/JSX coverage alongside whatever backend language shares the repo.',
354+
},
355+
{
356+
q: 'Can I scope CodeRabbit to specific folders or a monorepo package?',
357+
a: 'Yes. A .coderabbit.yaml file supports path filters and path-specific instructions, so you can focus reviews on the packages that matter and give per-directory guidance — handy in the monorepos many TanStack projects live in.',
358+
},
359+
{
360+
q: 'Does CodeRabbit generate tests and docstrings?',
361+
a: 'Yes. It can check test coverage and generate the missing unit tests, and it can create docstrings for changed files — automatically or on request in a pull request comment.',
362+
},
363+
{
364+
q: 'Can I chat with CodeRabbit or ask it to make changes?',
365+
a: 'Yes. You can chat with the CodeRabbit bot in any pull request, ask follow-up questions, and apply fixes with one-click commits or the "Fix with AI" button for the harder ones.',
366+
},
367+
{
368+
q: 'Does CodeRabbit connect to Jira, Linear, or other tools?',
369+
a: 'Yes. Pro and above integrate Jira and Linear, pull in linked issues and web context, and connect to MCP servers so reviews can reason about work that lives outside the diff.',
370+
},
268371
]
269372

270373
const PAGE_TITLE = 'CodeRabbit for TanStack — AI Code Review, Gold Partner'
@@ -325,6 +428,23 @@ function CheckBadge() {
325428
)
326429
}
327430

431+
function ComparisonCell({ value }: { value: ComparisonValue }) {
432+
if (value === 'partial') {
433+
return (
434+
<span className="text-xs font-medium text-gray-500 dark:text-gray-400">
435+
Partial
436+
</span>
437+
)
438+
}
439+
return value ? (
440+
<span className="inline-flex justify-center">
441+
<CheckBadge />
442+
</span>
443+
) : (
444+
<span className="text-gray-300 dark:text-gray-600"></span>
445+
)
446+
}
447+
328448
function trackCodeRabbitClick() {
329449
trackEvent('partner_clicked', {
330450
partner_id: 'coderabbit',
@@ -460,11 +580,13 @@ function CodeRabbitPartnerPage() {
460580
{/* Features */}
461581
<section className="py-10">
462582
<h2 className="text-2xl font-black tracking-tight md:text-3xl">
463-
Why TanStack teams choose CodeRabbit
583+
CodeRabbit is all-in on the TanStack community
464584
</h2>
465585
<p className="mt-2 max-w-xl text-sm leading-relaxed text-gray-600 dark:text-gray-300 md:text-base">
466-
CodeRabbit shortens review cycles without lowering the bar. Here's
467-
what makes it the right fit for TanStack developers.
586+
CodeRabbit went all-in as a Gold sponsor to reach the developers its
587+
AI reviews were built for — fast-moving teams shipping type-heavy,
588+
full-stack code. Here's what that commitment brings to your
589+
workflow.
468590
</p>
469591
<div className="mt-6 grid gap-3 sm:grid-cols-2">
470592
{features.map(({ Icon, title, desc }) => (
@@ -585,6 +707,89 @@ function CodeRabbitPartnerPage() {
585707
</div>
586708
</section>
587709

710+
{/* What it catches */}
711+
<section className="border-t border-gray-200 py-10 dark:border-gray-800">
712+
<h2 className="text-2xl font-black tracking-tight md:text-3xl">
713+
What CodeRabbit catches in a TanStack PR
714+
</h2>
715+
<p className="mt-2 max-w-xl text-sm leading-relaxed text-gray-600 dark:text-gray-300 md:text-base">
716+
Reviews are context-aware across the whole diff, so in a TanStack
717+
codebase CodeRabbit routinely flags issues like these — and you can
718+
steer it further with path instructions in{' '}
719+
<code className="rounded bg-gray-100 px-1 py-0.5 font-mono text-[13px] dark:bg-gray-800">
720+
.coderabbit.yaml
721+
</code>
722+
.
723+
</p>
724+
<div className="mt-6 grid gap-3 sm:grid-cols-2">
725+
{catches.map(({ label, desc }) => (
726+
<Card key={label} className="p-4 shadow-none">
727+
<div className="flex items-start gap-2">
728+
<CheckBadge />
729+
<span className="text-sm font-semibold">{label}</span>
730+
</div>
731+
<p className="mt-2 text-xs leading-relaxed text-gray-600 dark:text-gray-400">
732+
{desc}
733+
</p>
734+
</Card>
735+
))}
736+
</div>
737+
</section>
738+
739+
{/* Comparison */}
740+
<section className="border-t border-gray-200 py-10 dark:border-gray-800">
741+
<h2 className="text-2xl font-black tracking-tight md:text-3xl">
742+
How CodeRabbit compares
743+
</h2>
744+
<p className="mt-2 max-w-xl text-sm leading-relaxed text-gray-600 dark:text-gray-300 md:text-base">
745+
Manual review understands context but is slow and uneven. Linters
746+
are instant but shallow. CodeRabbit is the only one that does both —
747+
reasoning about your changes and running the scanners, on every pull
748+
request.
749+
</p>
750+
<div className="mt-6 overflow-x-auto">
751+
<table className="w-full min-w-[520px] border-collapse text-sm">
752+
<thead>
753+
<tr className="border-b border-gray-200 dark:border-gray-800">
754+
<th className="py-3 pr-4 text-left font-semibold">
755+
Capability
756+
</th>
757+
<th className="px-3 py-3 text-center font-medium text-gray-500 dark:text-gray-400">
758+
Manual review
759+
</th>
760+
<th className="px-3 py-3 text-center font-medium text-gray-500 dark:text-gray-400">
761+
Linters alone
762+
</th>
763+
<th className="px-3 py-3 text-center font-semibold">
764+
CodeRabbit
765+
</th>
766+
</tr>
767+
</thead>
768+
<tbody>
769+
{comparison.map((row) => (
770+
<tr
771+
key={row.capability}
772+
className="border-b border-gray-100 dark:border-gray-800/60"
773+
>
774+
<td className="py-3 pr-4 text-gray-700 dark:text-gray-300">
775+
{row.capability}
776+
</td>
777+
<td className="px-3 py-3 text-center">
778+
<ComparisonCell value={row.manual} />
779+
</td>
780+
<td className="px-3 py-3 text-center">
781+
<ComparisonCell value={row.linters} />
782+
</td>
783+
<td className="px-3 py-3 text-center">
784+
<ComparisonCell value={row.coderabbit} />
785+
</td>
786+
</tr>
787+
))}
788+
</tbody>
789+
</table>
790+
</div>
791+
</section>
792+
588793
{/* Pricing */}
589794
<section className="border-t border-gray-200 py-10 dark:border-gray-800">
590795
<h2 className="text-2xl font-black tracking-tight md:text-3xl">

0 commit comments

Comments
 (0)