Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions src/app/answers/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,25 @@ export async function generateMetadata({
type: "article",
url,
siteName: SITE.name,
images: [{ url: `${SITE.url}/opengraph-image`, width: 1200, height: 630 }],
// Use the referenced bench's OG card instead of the site-wide
// default. Perplexity / ChatGPT / Claude Deep Research scrape the
// og:image alongside the answer text; showing the bench-specific
// leader card gives the AI a real datapoint next to the answer
// rather than the generic homepage tile.
images: [
{
url: `${SITE.url}/api/og/${ans.bench.slug}`,
width: 1200,
height: 630,
},
],
},
twitter: {
card: "summary_large_image",
site: SITE.twitter,
title,
description,
images: [`${SITE.url}/twitter-image`],
images: [`${SITE.url}/api/og/${ans.bench.slug}`],
},
};
}
Expand Down
21 changes: 18 additions & 3 deletions src/app/benchmarks/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -507,9 +507,24 @@ export default async function BenchmarkPage({
<h1 className="mt-5 display text-3xl sm:text-4xl md:text-5xl tracking-tight text-ink break-words">
{benchmark.title}
</h1>
<p className="mt-4 max-w-3xl text-lg sm:text-xl text-ink-muted leading-snug break-words">
{benchmark.subtitle}
</p>
{/* Grounding-line first-under-H1: Perplexity / ChatGPT search /
Claude Deep Research scrape the first prose sentence after the
H1 as the "citable claim." Previously the methodology-flavoured
subtitle sat here; the current-leader sentence carries a
concrete provider + number + unit that AI answer engines quote
verbatim ("Codex leads head lag at 0.8 s (p50, 24h)..."). Fall
back to the subtitle when no defensible leader exists (draft,
insufficient, cold start). */}
{sentence ? (
<p className="mt-4 max-w-3xl text-lg sm:text-xl text-ink leading-snug break-words">
<span className="font-medium">{sentence}</span>{" "}
<span className="text-ink-muted">{benchmark.subtitle}</span>
</p>
) : (
<p className="mt-4 max-w-3xl text-lg sm:text-xl text-ink-muted leading-snug break-words">
{benchmark.subtitle}
</p>
)}

{/* Compact "At a glance" card. Rendered as a native <details>
element so it collapses to a one line summary on click while
Expand Down
26 changes: 26 additions & 0 deletions src/app/compare/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -912,6 +912,32 @@ export default async function ComparePage({
</div>
</section>

{/* Visible FAQ parity with the FAQPage JSON-LD above. Google
requires visible Q&A text matching the schema entries or it
silently drops the rich result — the compare pages had FAQ
jsonld without any visible questions, so the FAQPage never
rendered in the SERP snippet. */}
<section className="mt-12 max-w-3xl">
<h2 className="text-[11px] font-medium uppercase tracking-[0.18em] text-ink-muted">
Frequently asked questions
</h2>
<div className="mt-4 space-y-4">
{faqEntries.map((e) => (
<details
key={e.q}
className="border border-rule rounded-lg px-4 py-3"
>
<summary className="cursor-pointer text-sm font-medium text-ink leading-tight">
{e.q}
</summary>
<p className="mt-3 text-sm leading-relaxed text-ink-soft">
{e.a}
</p>
</details>
))}
</div>
</section>

<section className="mt-12 max-w-3xl">
<h2 className="text-[11px] font-medium uppercase tracking-[0.18em] text-ink-muted">
How this pair was selected
Expand Down
Loading