Skip to content

Conversation

@zacjones93
Copy link
Contributor

@zacjones93 zacjones93 commented Jan 18, 2026

Completely redesigned the homepage based on the PRD to position WODsmith Compete as the flagship product. The new landing page focuses on trust and ops relief rather than generic feature lists.

New sections:

  • Hero: "Run a comp athletes trust - without spreadsheet ops"
  • Pain strip: Real quotes from organizers/athletes about typos, appeals, heat discovery, and volunteer scheduling chaos
  • Two audiences: Separate value props for athletes and organizers
  • Disaster prevention: Score verification, audit trails, transparent scoring, and digital appeals (with availability labels)
  • Volunteer/judge scheduling: Availability intake, heat assignments, rotations, conflict detection (with coming soon features)
  • Series teaser: Multi-location configuration and global leaderboards
  • Reliability: Edge deployment, uptime targets, graceful degradation
  • Proof section: Testimonials from comp organizers
  • FAQ: Migration, pricing, support, offline, appeals, notifications
  • Final CTA: Book a demo with friction clarifiers

Key changes:

  • Replaced generic "Tools for Functional Fitness" messaging
  • Added truthful "available now" vs "coming soon" labels per PRD
  • Named specific villains (spreadsheets, typos, paper appeals)
  • Included proof nuggets and social proof early
  • Mobile-first responsive design with dark mode support
image

Summary by cubic

Redesigned the homepage to position WODsmith Compete as the flagship, focusing on trust and removing spreadsheet ops. Updated meta tags and built a new session-aware landing flow with clear CTAs.

  • New Features

    • Compete-focused landing sections: Hero, Pain Strip, Two Audiences, Disaster Prevention, Volunteer Scheduling, Series Teaser, Reliability, Proof, FAQ, Final CTA.
    • Clear “Available” vs “Coming soon” labels aligned with the PRD.
    • Session-aware CTAs for demo/onboarding and browsing competitions.
    • Mobile-first responsive layout with dark mode.
    • Copy and UI emphasize transparency (score verification, tie-breakers) and reliability.
  • Refactors

    • Replaced MissionHero, ProductCards, and InsightsFeatures with new components; reworked index route composition.
    • Updated page title and description to reflect Compete positioning.
    • Added anchor IDs for smooth in-page navigation (e.g., pain-points).

Written for commit 58450b8. Summary will update on new commits.

Summary by CodeRabbit

Release Notes

  • New Features
    • Redesigned landing page with new sections showcasing competition management capabilities
    • Added feature comparison for athletes and event organizers
    • Introduced testimonials and FAQ sections
    • Added sections highlighting scheduling features, multi-location support, and platform reliability
    • Updated homepage messaging to focus on competition organization and management

✏️ Tip: You can customize this high-level summary in your review settings.

Completely redesigned the homepage based on the PRD to position
WODsmith Compete as the flagship product. The new landing page
focuses on trust and ops relief rather than generic feature lists.

New sections:
- Hero: "Run a comp athletes trust - without spreadsheet ops"
- Pain strip: Real quotes from organizers/athletes about typos,
  appeals, heat discovery, and volunteer scheduling chaos
- Two audiences: Separate value props for athletes and organizers
- Disaster prevention: Score verification, audit trails, transparent
  scoring, and digital appeals (with availability labels)
- Volunteer/judge scheduling: Availability intake, heat assignments,
  rotations, conflict detection (with coming soon features)
- Series teaser: Multi-location configuration and global leaderboards
- Reliability: Edge deployment, uptime targets, graceful degradation
- Proof section: Testimonials from comp organizers
- FAQ: Migration, pricing, support, offline, appeals, notifications
- Final CTA: Book a demo with friction clarifiers

Key changes:
- Replaced generic "Tools for Functional Fitness" messaging
- Added truthful "available now" vs "coming soon" labels per PRD
- Named specific villains (spreadsheets, typos, paper appeals)
- Included proof nuggets and social proof early
- Mobile-first responsive design with dark mode support
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 18, 2026

Walkthrough

This PR introduces nine new landing page components (CompeteHero, PainStrip, TwoAudiences, DisasterPrevention, VolunteerScheduling, SeriesTeaser, ReliabilitySection, ProofSection, FAQSection, FinalCTA) and refactors the main route to compose them into a structured landing page layout. The route metadata is updated to reflect WODsmith Compete branding.

Changes

Cohort / File(s) Summary
Landing Page Components
apps/wodsmith-start/src/components/landing/compete-hero.tsx, pain-strip.tsx, two-audiences.tsx, disaster-prevention.tsx, volunteer-scheduling.tsx, series-teaser.tsx, reliability-section.tsx, proof-section.tsx, faq-section.tsx, final-cta.tsx
Nine new React components added, each rendering static/presentational UI sections with hardcoded data. Components include hero banners, feature grids, testimonials, FAQ accordions, and CTAs. Four components (compete-hero, two-audiences, final-cta, and faq-section) reference SessionValidationResult type and conditionally route to organizer signup based on login state. All use lucide-react icons and Tailwind-like utility classes.
Route Composition
apps/wodsmith-start/src/routes/index.tsx
Replaced previous landing sections with new component sequence. Updated page title to "WODsmith Compete - Run a comp athletes trust" and description to feature-focused messaging. Added component: HomePage property to route definition and imported all new landing components to compose them sequentially.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • PR #135: Modifies landing page composition with session-aware hero and product components using the same refactoring pattern.

Poem

🐰 A dozen new sections, fresh and bright,
Heroes and pain points dancing right,
Session-aware CTAs guide the way,
Hopping down the landing page today!
✨ Competition awaits! 🏋️

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title 'claude/rework-homepage-compete-tj9ni' is vague and uses a branch naming pattern rather than a descriptive commit message, making it unclear what the main change is. Use a clear, descriptive title that summarizes the main change, e.g., 'Rework homepage to position WODsmith Compete as flagship product' or 'Redesign landing page with new hero, pain points, and feature sections'.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 11 files

@github-actions
Copy link

🚀 Preview Deployed

URL: https://wodsmith-app-pr-188.zacjones93.workers.dev

Detail Value
Commit 8e42c9c
Stage pr-188
Deployed 2026-01-18T05:57:15.379Z

This comment is automatically updated on each push to this PR.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@apps/wodsmith-start/src/components/landing/faq-section.tsx`:
- Around line 40-112: The FAQ accordion lacks ARIA attributes: update the
FAQItem component (used by FAQSection with openIndex/setOpenIndex) so the toggle
button exposes aria-expanded={isOpen} and aria-controls referencing a unique ID
for the answer panel, and give the answer container an id and role="region" (and
aria-labelledby pointing back to the button id) so assistive tech can map the
relationship between the button and content; generate stable IDs per item (e.g.,
using the question or index) to wire aria-controls/aria-labelledby consistently.
🧹 Nitpick comments (1)
apps/wodsmith-start/src/components/landing/compete-hero.tsx (1)

56-67: Consider accessibility for the scroll button.

The "See How It Works" button scrolls smoothly to #pain-points, which exists in PainStrip. However, for better accessibility, consider adding type="button" to explicitly prevent form submission behavior if this component is ever used within a form context.

Optional improvement
 <Button
   variant="outline"
   size="lg"
+  type="button"
   onClick={() => {
     document
       .getElementById("pain-points")
       ?.scrollIntoView({ behavior: "smooth" })
   }}
 >

Comment on lines +40 to +112
interface FAQItemProps {
question: string
answer: string
isOpen: boolean
onToggle: () => void
}

function FAQItem({ question, answer, isOpen, onToggle }: FAQItemProps) {
return (
<div className="border-b border-border">
<button
type="button"
onClick={onToggle}
className="flex w-full items-center justify-between py-6 text-left"
>
<span className="font-medium">{question}</span>
<ChevronDown
className={cn(
"h-5 w-5 shrink-0 text-muted-foreground transition-transform",
isOpen && "rotate-180",
)}
/>
</button>
<div
className={cn(
"grid transition-all",
isOpen ? "grid-rows-[1fr] pb-6" : "grid-rows-[0fr]",
)}
>
<div className="overflow-hidden">
<p className="text-muted-foreground">{answer}</p>
</div>
</div>
</div>
)
}

export function FAQSection() {
const [openIndex, setOpenIndex] = useState<number | null>(null)

return (
<section id="faq" className="bg-background py-20">
<div className="container mx-auto px-4">
<div className="mx-auto max-w-3xl">
<div className="mb-12 text-center">
<div className="mb-4 inline-flex items-center gap-2 rounded-full bg-secondary px-4 py-2">
<HelpCircle className="h-4 w-4 text-muted-foreground" />
<span className="font-medium text-sm text-muted-foreground">
FAQ
</span>
</div>

<h2 className="mb-4 font-mono text-3xl font-bold tracking-tight sm:text-4xl">
Frequently asked questions
</h2>

<p className="text-lg text-muted-foreground">
Everything organizers ask before signing up.
</p>
</div>

<div className="rounded-xl border border-border bg-card">
<div className="px-6">
{faqs.map((faq, index) => (
<FAQItem
key={faq.question}
question={faq.question}
answer={faq.answer}
isOpen={openIndex === index}
onToggle={() =>
setOpenIndex(openIndex === index ? null : index)
}
/>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add ARIA attributes to the accordion for accessibility.

Buttons should expose expanded state and control IDs so assistive tech can interpret the accordion correctly.

♿ Proposed accessibility fix
 interface FAQItemProps {
+	id: string
 	question: string
 	answer: string
 	isOpen: boolean
 	onToggle: () => void
 }

-function FAQItem({ question, answer, isOpen, onToggle }: FAQItemProps) {
+function FAQItem({ id, question, answer, isOpen, onToggle }: FAQItemProps) {
 	return (
 		<div className="border-b border-border">
 			<button
 				type="button"
 				onClick={onToggle}
+				aria-expanded={isOpen}
+				aria-controls={id}
 				className="flex w-full items-center justify-between py-6 text-left"
 			>
 				<span className="font-medium">{question}</span>
 				<ChevronDown
 					className={cn(
 						"h-5 w-5 shrink-0 text-muted-foreground transition-transform",
 						isOpen && "rotate-180",
 					)}
 				/>
 			</button>
 			<div
+				id={id}
+				role="region"
+				aria-hidden={!isOpen}
 				className={cn(
 					"grid transition-all",
 					isOpen ? "grid-rows-[1fr] pb-6" : "grid-rows-[0fr]",
 				)}
 			>
 				<div className="overflow-hidden">
 					<p className="text-muted-foreground">{answer}</p>
 				</div>
 			</div>
 		</div>
 	)
 }

 {faqs.map((faq, index) => (
 	<FAQItem
+		id={`faq-${index}`}
 		key={faq.question}
 		question={faq.question}
 		answer={faq.answer}
 		isOpen={openIndex === index}
 		onToggle={() =>
 			setOpenIndex(openIndex === index ? null : index)
 		}
 	/>
 ))}
🤖 Prompt for AI Agents
In `@apps/wodsmith-start/src/components/landing/faq-section.tsx` around lines 40 -
112, The FAQ accordion lacks ARIA attributes: update the FAQItem component (used
by FAQSection with openIndex/setOpenIndex) so the toggle button exposes
aria-expanded={isOpen} and aria-controls referencing a unique ID for the answer
panel, and give the answer container an id and role="region" (and
aria-labelledby pointing back to the button id) so assistive tech can map the
relationship between the button and content; generate stable IDs per item (e.g.,
using the question or index) to wire aria-controls/aria-labelledby consistently.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants