feat(partners): add dedicated CodeRabbit Gold partner landing page#1044
feat(partners): add dedicated CodeRabbit Gold partner landing page#1044jhislop-design wants to merge 3 commits into
Conversation
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.
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
tanstack-com | 7c2d70d | Commit Preview URL Branch Preview URL |
Jul 13 2026, 04:34 PM |
📝 WalkthroughWalkthroughAdds a CodeRabbit partner landing page at ChangesCodeRabbit partner route
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Visitor
participant CodeRabbitPartnerPage
participant Analytics
participant ExternalDestination
Visitor->>CodeRabbitPartnerPage: Open /partners/coderabbit
CodeRabbitPartnerPage->>Analytics: Emit partner_viewed
Visitor->>CodeRabbitPartnerPage: Select outbound CTA
CodeRabbitPartnerPage->>Analytics: Emit partner_clicked
CodeRabbitPartnerPage->>ExternalDestination: Navigate to outbound link
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/routes/partners.coderabbit.tsx`:
- Around line 446-449: Update the 15,000 statistic in the relevant stats section
to use the same label as the other 15,000 statistic on the page, choosing either
“Customers” or “teams” consistently. Locate the surrounding stats entries in the
page component and change only the inconsistent label.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: b4a233b4-962b-4065-962d-504028352632
📒 Files selected for processing (2)
src/routeTree.gen.tssrc/routes/partners.coderabbit.tsx
| ['6M+', 'Repositories reviewed'], | ||
| ['75M+', 'Defects caught'], | ||
| ['15,000+', 'Customers'], | ||
| ['$0', 'Reviews in your IDE'], |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect the relevant sections in src/routes/partners.coderabbit.tsx
sed -n '430,470p' src/routes/partners.coderabbit.tsx
printf '\n---\n'
sed -n '750,790p' src/routes/partners.coderabbit.tsx
printf '\n---\n'
# Search for the stat labels used in this file
rg -n "15,000\+|Customers|teams|Repositories reviewed|Defects caught|Reviews in your IDE" src/routes/partners.coderabbit.tsxRepository: TanStack/tanstack.com
Length of output: 4244
Use one label for the 15,000 stat. src/routes/partners.coderabbit.tsx mixes 15,000+ Customers and 15,000+ teams; pick one term and use it consistently across the page.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/routes/partners.coderabbit.tsx` around lines 446 - 449, Update the 15,000
statistic in the relevant stats section to use the same label as the other
15,000 statistic on the page, choosing either “Customers” or “teams”
consistently. Locate the surrounding stats entries in the page component and
change only the inconsistent label.
- 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.
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/routes/partners.coderabbit.tsx (1)
710-737: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winExtract a shared card component for
catchesandlibDetails.The
catchescard rendering (L724-736) is identical to thelibDetailscard rendering (L695-707) — sameCard,CheckBadge, label, and description structure. Extracting a smallCheckCardcomponent would eliminate the duplication and prevent future drift.♻️ Proposed refactor
+function CheckCard({ label, desc }: { label: string; desc: string }) { + return ( + <Card key={label} className="p-4 shadow-none"> + <div className="flex items-start gap-2"> + <CheckBadge /> + <span className="text-sm font-semibold">{label}</span> + </div> + <p className="mt-2 text-xs leading-relaxed text-gray-600 dark:text-gray-400"> + {desc} + </p> + </Card> + ) +}Then use
<CheckCard label={label} desc={desc} />in both thelibDetailsandcatchessections.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@src/routes/partners.coderabbit.tsx` around lines 710 - 737, Extract the duplicated card markup from the libDetails and catches renderings into a shared CheckCard component accepting label and desc props. Replace each inline Card/CheckBadge structure in both map callbacks with CheckCard, preserving the existing styling and content.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/routes/partners.coderabbit.tsx`:
- Around line 431-446: Update ComparisonCell so both boolean outcomes expose
explicit screen-reader text alternatives: label the true CheckBadge result as
yes and the false em-dash result as no, while preserving the existing visual
rendering and partial-value behavior.
---
Nitpick comments:
In `@src/routes/partners.coderabbit.tsx`:
- Around line 710-737: Extract the duplicated card markup from the libDetails
and catches renderings into a shared CheckCard component accepting label and
desc props. Replace each inline Card/CheckBadge structure in both map callbacks
with CheckCard, preserving the existing styling and content.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 4c3294cd-190f-4817-b1f9-b39ac5a4ced3
📒 Files selected for processing (1)
src/routes/partners.coderabbit.tsx
| function ComparisonCell({ value }: { value: ComparisonValue }) { | ||
| if (value === 'partial') { | ||
| return ( | ||
| <span className="text-xs font-medium text-gray-500 dark:text-gray-400"> | ||
| Partial | ||
| </span> | ||
| ) | ||
| } | ||
| return value ? ( | ||
| <span className="inline-flex justify-center"> | ||
| <CheckBadge /> | ||
| </span> | ||
| ) : ( | ||
| <span className="text-gray-300 dark:text-gray-600">—</span> | ||
| ) | ||
| } |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
Add screen-reader text alternatives to ComparisonCell.
In the comparison table, CheckBadge (true) and the em dash (false) convey yes/no semantics visually but have no text equivalent for assistive technology. Screen readers will encounter a decorative icon or punctuation with no label.
♿ Proposed fix: add aria-labels
function ComparisonCell({ value }: { value: ComparisonValue }) {
if (value === 'partial') {
return (
<span className="text-xs font-medium text-gray-500 dark:text-gray-400">
Partial
</span>
)
}
return value ? (
- <span className="inline-flex justify-center">
+ <span className="inline-flex justify-center" aria-label="Yes">
<CheckBadge />
+ <span className="sr-only">Yes</span>
</span>
) : (
- <span className="text-gray-300 dark:text-gray-600">—</span>
+ <span className="text-gray-300 dark:text-gray-600" aria-label="No">
+ <span aria-hidden="true">—</span>
+ <span className="sr-only">No</span>
+ </span>
)
}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| function ComparisonCell({ value }: { value: ComparisonValue }) { | |
| if (value === 'partial') { | |
| return ( | |
| <span className="text-xs font-medium text-gray-500 dark:text-gray-400"> | |
| Partial | |
| </span> | |
| ) | |
| } | |
| return value ? ( | |
| <span className="inline-flex justify-center"> | |
| <CheckBadge /> | |
| </span> | |
| ) : ( | |
| <span className="text-gray-300 dark:text-gray-600">—</span> | |
| ) | |
| } | |
| function ComparisonCell({ value }: { value: ComparisonValue }) { | |
| if (value === 'partial') { | |
| return ( | |
| <span className="text-xs font-medium text-gray-500 dark:text-gray-400"> | |
| Partial | |
| </span> | |
| ) | |
| } | |
| return value ? ( | |
| <span className="inline-flex justify-center" aria-label="Yes"> | |
| <CheckBadge /> | |
| <span className="sr-only">Yes</span> | |
| </span> | |
| ) : ( | |
| <span className="text-gray-300 dark:text-gray-600" aria-label="No"> | |
| <span aria-hidden="true">—</span> | |
| <span className="sr-only">No</span> | |
| </span> | |
| ) | |
| } |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/routes/partners.coderabbit.tsx` around lines 431 - 446, Update
ComparisonCell so both boolean outcomes expose explicit screen-reader text
alternatives: label the true CheckBadge result as yes and the false em-dash
result as no, while preserving the existing visual rendering and partial-value
behavior.
Summary
Adds a dedicated landing page for the CodeRabbit Gold sponsorship at
/partners/coderabbit, replacing the generic partner template for that URL. Structure mirrors the existing Railway partner page (hero → stats → features → how-it-works → library fit → pricing → testimonials → FAQ → CTA), reusing the sharedCard,Button,Collapsible,CodeBlock, andPartnerImagecomponents — so it inherits the design system, dark mode, and analytics wiring.Content
All facts sourced from coderabbit.ai:
.coderabbit.yaml— no runtime app code / SDK. Code blocks show a real.coderabbit.yamland@coderabbitaiPR commands.SEO / AI search
seo()meta (title, description, keywords, OG/Twitter via the shared helper)FAQPage(6 Q&A) +WebPage/Organization, both verified present in the SSR HTMLUTM
Sponsor links use the existing CodeRabbit affiliate base
coderabbit.link/tanstack?…&via=tanstackplusutm_medium=sponsor&utm_source=tanstack&utm_campaign=partner-page(matching the Railway pattern).Verification
tsc+ lint + unit tests pass (pre-commit hook)Reviewer notes
🤖 Generated with Claude Code
Summary by CodeRabbit
/partners/coderabbit.