From 61c90f42495659bc5ab281d115e1c36d4d4bae8d Mon Sep 17 00:00:00 2001 From: Florent Tapponnier <160007691+Flotapponnier@users.noreply.github.com> Date: Sun, 2 Aug 2026 22:44:38 +0200 Subject: [PATCH] feat: add perp bench cards to /alternatives/[slug] for perp venues --- src/app/alternatives/[slug]/page.tsx | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/app/alternatives/[slug]/page.tsx b/src/app/alternatives/[slug]/page.tsx index 03726fe1..734ddb2b 100644 --- a/src/app/alternatives/[slug]/page.tsx +++ b/src/app/alternatives/[slug]/page.tsx @@ -20,6 +20,10 @@ import { citableAsOf } from "@/lib/citation"; import { ProviderLogo } from "@/components/provider-logo"; import { ProviderTypeBadge } from "@/components/provider-type-badge"; import { isRegion } from "@/lib/brand"; +import { PERP_VENUE_META, benchRowsForVenue } from "@/lib/perp-venue-context"; +import { fetchPerpCohort } from "@/lib/perp-stats"; +import { loadBenchFromBlob } from "@/lib/bench-blob"; +import { PerpVenueBenchCards } from "@/components/perp-venue-bench-cards"; export const revalidate = 60; @@ -63,9 +67,21 @@ export default async function AlternativePage({ params: Promise; }) { const { slug } = await params; - const alt = await loadAlternative(slug); + const isPerpVenue = slug in PERP_VENUE_META; + + const [alt, cohort, feesAtSizeBench] = await Promise.all([ + loadAlternative(slug), + isPerpVenue ? fetchPerpCohort() : Promise.resolve(null), + isPerpVenue ? loadBenchFromBlob("perp-fees-at-size") : Promise.resolve(null), + ]); if (!alt) notFound(); + const venueRow = cohort?.venues.find((v) => v.slug === slug) ?? null; + const perpBenchRows = + cohort && venueRow + ? benchRowsForVenue(cohort, venueRow, feesAtSizeBench) + : []; + const { bench } = alt; const isDraft = bench.status === "draft"; const { fieldMin, fieldMedian, fieldMax, tailMin, tailMax, tailSpread } = @@ -244,6 +260,15 @@ export default async function AlternativePage({

)} + {perpBenchRows.length > 0 && ( +
+ {alt.target_product} across benchmarks +
+ +
+
+ )} + {/* Top alternatives cards - explicit list with internal links to product pages. The bench leaderboard below carries the full data; this section frames the answer for skim-readers and search. */}