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. */}