From c79c34baa4da4b28bb0e1c4d4d2b0d6963c8ee30 Mon Sep 17 00:00:00 2001 From: adibarra <93070681+adibarra@users.noreply.github.com> Date: Tue, 24 Mar 2026 22:48:25 -0500 Subject: [PATCH 01/91] feat: add curated landing page with 1-click preset views (#604) --- packages/app/src/app/[[...tab]]/page.tsx | 33 +++++- .../favorites/FavoritePresetsDropdown.tsx | 29 +++++ .../components/landing/curated-view-card.tsx | 39 +++++++ .../src/components/landing/landing-page.tsx | 107 ++++++++++++++++++ packages/app/src/components/page-content.tsx | 12 +- packages/app/src/lib/tab-meta.ts | 6 + 6 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 packages/app/src/components/landing/curated-view-card.tsx create mode 100644 packages/app/src/components/landing/landing-page.tsx diff --git a/packages/app/src/app/[[...tab]]/page.tsx b/packages/app/src/app/[[...tab]]/page.tsx index acd78bf..725fbde 100644 --- a/packages/app/src/app/[[...tab]]/page.tsx +++ b/packages/app/src/app/[[...tab]]/page.tsx @@ -1,8 +1,9 @@ import type { Metadata } from 'next'; import { notFound } from 'next/navigation'; +import { LandingPage } from '@/components/landing/landing-page'; import { PageContent } from '@/components/page-content'; -import { TAB_META, VALID_TABS } from '@/lib/tab-meta'; +import { LANDING_META, TAB_META, VALID_TABS } from '@/lib/tab-meta'; import { SITE_URL } from '@semianalysisai/inferencex-constants'; export const dynamicParams = true; @@ -17,7 +18,26 @@ export async function generateMetadata({ params: Promise<{ tab?: string[] }>; }): Promise { const { tab } = await params; - const activeTab = tab?.[0] ?? 'inference'; + const activeTab = tab?.[0]; + + // Landing page (root /) + if (!activeTab) { + return { + title: LANDING_META.title, + description: LANDING_META.description, + alternates: { canonical: SITE_URL }, + openGraph: { + title: `${LANDING_META.title} | InferenceX`, + description: LANDING_META.description, + url: SITE_URL, + }, + twitter: { + title: `${LANDING_META.title} | InferenceX`, + description: LANDING_META.description, + }, + }; + } + const meta = TAB_META[activeTab as keyof typeof TAB_META]; if (!meta) return {}; @@ -41,9 +61,14 @@ export async function generateMetadata({ export default async function Page({ params }: { params: Promise<{ tab?: string[] }> }) { const { tab } = await params; - const activeTab = tab?.[0] ?? 'inference'; + const activeTab = tab?.[0]; + + // Landing page (root /) + if (!activeTab) { + return ; + } - if (!VALID_TABS.includes(activeTab as (typeof VALID_TABS)[number]) || (tab && tab.length > 1)) { + if (!VALID_TABS.includes(activeTab as (typeof VALID_TABS)[number]) || tab.length > 1) { notFound(); } diff --git a/packages/app/src/components/favorites/FavoritePresetsDropdown.tsx b/packages/app/src/components/favorites/FavoritePresetsDropdown.tsx index f7e33f3..f7a5b9f 100644 --- a/packages/app/src/components/favorites/FavoritePresetsDropdown.tsx +++ b/packages/app/src/components/favorites/FavoritePresetsDropdown.tsx @@ -37,6 +37,9 @@ export default function FavoritePresetsDropdown() { const [isOpen, setIsOpen] = useState(false); + // Track whether a URL-based preset has already been consumed + const urlPresetAppliedRef = useRef(false); + // Version counter — increments on every preset apply/clear. // Async effects capture the version at start and bail if it's stale. const versionRef = useRef(0); @@ -179,6 +182,32 @@ export default function FavoritePresetsDropdown() { selectAllHwTypes, ]); + // Auto-apply preset from URL param (e.g. /inference?preset=gb200-vs-b200) + useEffect(() => { + if (urlPresetAppliedRef.current) return; + if (typeof window === 'undefined') return; + + const sp = new URLSearchParams(window.location.search); + const presetId = sp.get('preset'); + if (!presetId) return; + + const preset = FAVORITE_PRESETS.find((p) => p.id === presetId); + if (!preset) return; + + urlPresetAppliedRef.current = true; + + // Remove preset param from URL + sp.delete('preset'); + const search = sp.toString(); + window.history.replaceState( + null, + '', + `${window.location.pathname}${search ? `?${search}` : ''}`, + ); + + applyPreset(preset); + }, [applyPreset]); + const handlePresetClick = useCallback( (preset: FavoritePreset) => { if (activePresetId === preset.id) { diff --git a/packages/app/src/components/landing/curated-view-card.tsx b/packages/app/src/components/landing/curated-view-card.tsx new file mode 100644 index 0000000..ac65e47 --- /dev/null +++ b/packages/app/src/components/landing/curated-view-card.tsx @@ -0,0 +1,39 @@ +'use client'; + +import Link from 'next/link'; +import { ArrowRight } from 'lucide-react'; + +import { Badge } from '@/components/ui/badge'; +import { track } from '@/lib/analytics'; +import type { FavoritePreset } from '@/components/favorites/favorite-presets'; + +export function CuratedViewCard({ preset }: { preset: FavoritePreset }) { + return ( + + track('landing_curated_view_clicked', { + preset_id: preset.id, + preset_title: preset.title, + }) + } + className="group block rounded-xl border border-border bg-card/90 p-5 transition-all duration-200 hover:border-primary/40 hover:bg-accent/50 hover:shadow-md" + data-testid={`curated-view-${preset.id}`} + > +
+

{preset.title}

+ +
+

+ {preset.description} +

+
+ {preset.tags.map((tag) => ( + + {tag} + + ))} +
+ + ); +} diff --git a/packages/app/src/components/landing/landing-page.tsx b/packages/app/src/components/landing/landing-page.tsx new file mode 100644 index 0000000..ac76ccc --- /dev/null +++ b/packages/app/src/components/landing/landing-page.tsx @@ -0,0 +1,107 @@ +'use client'; + +import Link from 'next/link'; +import { ArrowRight } from 'lucide-react'; +import { useEffect } from 'react'; + +import { Button } from '@/components/ui/button'; +import { Card } from '@/components/ui/card'; +import { QuoteCarousel } from '@/components/quote-carousel'; +import { QUOTES } from '@/components/quotes/quotes-data'; +import { CuratedViewCard } from '@/components/landing/curated-view-card'; +import { FAVORITE_PRESETS } from '@/components/favorites/favorite-presets'; +import { track } from '@/lib/analytics'; + +const CAROUSEL_QUOTES = QUOTES.filter((q) => + [ + 'OpenAI', + 'Microsoft', + 'Together AI', + 'vLLM', + 'GPU Mode', + 'PyTorch Foundation', + 'Oracle', + 'CoreWeave', + 'Nebius', + 'Crusoe', + 'TensorWave', + 'SGLang', + 'WEKA', + 'Stanford', + 'Core42', + 'Meta Superintelligence Labs', + 'Hugging Face', + ].includes(q.org), +); + +const CAROUSEL_OVERRIDES = { + order: ['OpenAI'], + labels: { + 'Together AI': 'Tri Dao', + 'PyTorch Foundation': 'PyTorch', + }, +}; + +export function LandingPage() { + useEffect(() => { + track('landing_page_viewed'); + }, []); + + return ( +
+
+ {/* Hero */} +
+

+ Open Source Continuous Inference Benchmark +

+

+ InferenceX™ independently benchmarks AI inference across GPUs and + frameworks in real time. Trusted by operators of trillion-dollar token factories, AI + labs, and neoclouds.{' '} + + Learn more + + . +

+
+ + {/* Quotes */} +
+ + + +
+ + {/* CTA */} +
+ track('landing_full_dashboard_clicked')}> + + +
+ + {/* Curated Views */} +
+

Popular Comparisons

+
+ {FAVORITE_PRESETS.map((preset) => ( + + ))} +
+
+
+
+ ); +} diff --git a/packages/app/src/components/page-content.tsx b/packages/app/src/components/page-content.tsx index a11992a..4422869 100644 --- a/packages/app/src/components/page-content.tsx +++ b/packages/app/src/components/page-content.tsx @@ -1,9 +1,11 @@ 'use client'; +import Link from 'next/link'; +import { ChevronLeft } from 'lucide-react'; + import { ChartTabs } from '@/components/chart-tabs'; import { ExportNudge } from '@/components/export-nudge'; import { GitHubStarModal } from '@/components/github-star-modal'; -import { IntroSection } from '@/components/intro-section'; import { StarNudge } from '@/components/star-nudge'; import { UnofficialRunProvider } from '@/components/unofficial-run-provider'; @@ -16,7 +18,13 @@ export function PageContent({ initialTab = 'inference' }: { initialTab?: string
- + + + InferenceX Home +
diff --git a/packages/app/src/lib/tab-meta.ts b/packages/app/src/lib/tab-meta.ts index 5120898..6a7be62 100644 --- a/packages/app/src/lib/tab-meta.ts +++ b/packages/app/src/lib/tab-meta.ts @@ -1,5 +1,11 @@ import { AUTHOR_NAME, SITE_NAME } from '@semianalysisai/inferencex-constants'; +export const LANDING_META = { + title: 'Open Source AI Inference Benchmark', + description: + 'Compare AI inference performance across GPUs and frameworks. Real benchmarks on NVIDIA GB200, B200, AMD MI355X, and more. Free, open-source, continuously updated.', +}; + export const VALID_TABS = [ 'inference', 'evaluation', From cbb65e65ef9417f645f7ee317ff1a0239584a525 Mon Sep 17 00:00:00 2001 From: adibarra <93070681+adibarra@users.noreply.github.com> Date: Tue, 24 Mar 2026 22:49:13 -0500 Subject: [PATCH 02/91] restore original IntroSection on landing page --- .../src/components/landing/landing-page.tsx | 72 ++----------------- 1 file changed, 5 insertions(+), 67 deletions(-) diff --git a/packages/app/src/components/landing/landing-page.tsx b/packages/app/src/components/landing/landing-page.tsx index ac76ccc..f81af6d 100644 --- a/packages/app/src/components/landing/landing-page.tsx +++ b/packages/app/src/components/landing/landing-page.tsx @@ -5,43 +5,11 @@ import { ArrowRight } from 'lucide-react'; import { useEffect } from 'react'; import { Button } from '@/components/ui/button'; -import { Card } from '@/components/ui/card'; -import { QuoteCarousel } from '@/components/quote-carousel'; -import { QUOTES } from '@/components/quotes/quotes-data'; +import { IntroSection } from '@/components/intro-section'; import { CuratedViewCard } from '@/components/landing/curated-view-card'; import { FAVORITE_PRESETS } from '@/components/favorites/favorite-presets'; import { track } from '@/lib/analytics'; -const CAROUSEL_QUOTES = QUOTES.filter((q) => - [ - 'OpenAI', - 'Microsoft', - 'Together AI', - 'vLLM', - 'GPU Mode', - 'PyTorch Foundation', - 'Oracle', - 'CoreWeave', - 'Nebius', - 'Crusoe', - 'TensorWave', - 'SGLang', - 'WEKA', - 'Stanford', - 'Core42', - 'Meta Superintelligence Labs', - 'Hugging Face', - ].includes(q.org), -); - -const CAROUSEL_OVERRIDES = { - order: ['OpenAI'], - labels: { - 'Together AI': 'Tri Dao', - 'PyTorch Foundation': 'PyTorch', - }, -}; - export function LandingPage() { useEffect(() => { track('landing_page_viewed'); @@ -49,41 +17,11 @@ export function LandingPage() { return (
-
- {/* Hero */} -
-

- Open Source Continuous Inference Benchmark -

-

- InferenceX™ independently benchmarks AI inference across GPUs and - frameworks in real time. Trusted by operators of trillion-dollar token factories, AI - labs, and neoclouds.{' '} - - Learn more - - . -

-
- - {/* Quotes */} -
- - - -
+
+ {/* CTA */} -
+
track('landing_full_dashboard_clicked')}>
{/* Curated Views */} -
+

Popular Comparisons

{FAVORITE_PRESETS.map((preset) => ( From af3edb6f369ad5897521205a0f4aec694edb1040 Mon Sep 17 00:00:00 2001 From: adibarra <93070681+adibarra@users.noreply.github.com> Date: Tue, 24 Mar 2026 22:50:17 -0500 Subject: [PATCH 03/91] fix: Dashboard nav link points to /inference, not highlighted on landing page --- packages/app/src/components/header/header.tsx | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/app/src/components/header/header.tsx b/packages/app/src/components/header/header.tsx index 97644b1..edbe85b 100644 --- a/packages/app/src/components/header/header.tsx +++ b/packages/app/src/components/header/header.tsx @@ -10,9 +10,20 @@ import { cn } from '@/lib/utils'; import { GitHubStars } from './GithubStars'; +/** Dashboard tab paths that should highlight the "Dashboard" nav link. */ +const DASHBOARD_TABS = [ + '/inference', + '/evaluation', + '/historical', + '/calculator', + '/reliability', + '/gpu-specs', + '/gpu-metrics', +]; + const NAV_LINKS = [ { - href: '/', + href: '/inference', label: 'Dashboard', testId: 'nav-link-dashboard', event: 'header_dashboard_clicked', @@ -28,13 +39,7 @@ const NAV_LINKS = [ ] as const; function isActive(pathname: string, href: string): boolean { - if (href === '/') - return ( - pathname === '/' || - (!pathname.startsWith('/media') && - !pathname.startsWith('/quotes') && - !pathname.startsWith('/blog')) - ); + if (href === '/inference') return DASHBOARD_TABS.some((tab) => pathname.startsWith(tab)); return pathname.startsWith(href); } From be04ace70c1198c7b2dc27fd6e5c5e61297891ad Mon Sep 17 00:00:00 2001 From: adibarra <93070681+adibarra@users.noreply.github.com> Date: Wed, 25 Mar 2026 11:46:59 -0500 Subject: [PATCH 04/91] perf: gzip compress API route responses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Route Handler responses bypass Next.js built-in compression. Add explicit gzipSync to cachedJson() — availability drops from 826 KB to 21 KB, benchmarks from 2 MB to 457 KB. --- packages/app/src/lib/api-cache.ts | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/app/src/lib/api-cache.ts b/packages/app/src/lib/api-cache.ts index 631f3aa..45f869b 100644 --- a/packages/app/src/lib/api-cache.ts +++ b/packages/app/src/lib/api-cache.ts @@ -1,3 +1,5 @@ +import { gzipSync } from 'node:zlib'; + import { revalidateTag } from 'next/cache'; import { unstable_cache } from 'next/cache'; @@ -47,19 +49,14 @@ const CDN_HEADERS = { 'Vercel-Cache-Tag': 'db', }; -/** CDN-cached streamed JSON response — supports up to 20 MB on Vercel CDN. */ +/** CDN-cached gzip-compressed JSON response — supports up to 20 MB on Vercel CDN. */ export function cachedJson(data: T): Response { - const bytes = new TextEncoder().encode(JSON.stringify(data)); - const CHUNK = 64 * 1024; - const stream = new ReadableStream({ - start(controller) { - for (let i = 0; i < bytes.length; i += CHUNK) { - controller.enqueue(bytes.subarray(i, i + CHUNK)); - } - controller.close(); + const compressed = gzipSync(JSON.stringify(data)); + return new Response(compressed, { + headers: { + 'Content-Type': 'application/json', + 'Content-Encoding': 'gzip', + ...CDN_HEADERS, }, }); - return new Response(stream, { - headers: { 'Content-Type': 'application/json', ...CDN_HEADERS }, - }); } From 0457f7862d18eee7f084dc7c0632a0260576c60e Mon Sep 17 00:00:00 2001 From: adibarra <93070681+adibarra@users.noreply.github.com> Date: Wed, 25 Mar 2026 11:47:18 -0500 Subject: [PATCH 05/91] fix(a11y): improve color contrast for WCAG AA compliance Quote carousel: replace opacity-based inactive style with #9ca0a4 (5.7:1 on dark bg, was 4.09:1). Multi-select badges: use darker blue bg in dark mode (4.8:1, was 3.29:1). --- packages/app/src/components/quote-carousel.tsx | 6 ++---- packages/app/src/components/ui/multi-select.tsx | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/app/src/components/quote-carousel.tsx b/packages/app/src/components/quote-carousel.tsx index 120d2d6..0bed629 100644 --- a/packages/app/src/components/quote-carousel.tsx +++ b/packages/app/src/components/quote-carousel.tsx @@ -155,10 +155,8 @@ export function QuoteCarousel({ key={e.org} type="button" onClick={() => goTo(i)} - className={`text-xs font-semibold tracking-wide uppercase transition-opacity duration-200 ${ - i === activeIndex - ? 'opacity-100 text-foreground' - : 'opacity-40 text-muted-foreground hover:opacity-70' + className={`text-xs font-semibold tracking-wide uppercase transition-colors duration-200 ${ + i === activeIndex ? 'text-foreground' : 'text-[#9ca0a4] hover:text-muted-foreground' }`} > {labels[e.org] ?? e.org} diff --git a/packages/app/src/components/ui/multi-select.tsx b/packages/app/src/components/ui/multi-select.tsx index d0d1bab..d9a63ff 100644 --- a/packages/app/src/components/ui/multi-select.tsx +++ b/packages/app/src/components/ui/multi-select.tsx @@ -149,7 +149,7 @@ function MultiSelect({ selectedLabels.map((label, index) => ( {label} Date: Wed, 25 Mar 2026 11:47:38 -0500 Subject: [PATCH 06/91] fix: gate analytics to appropriate environments Vercel Analytics/SpeedInsights: only render when VERCEL env is set (scripts 404 outside Vercel). PostHog: use NODE_ENV check instead of hostname, so it works on any non-production host. --- packages/app/src/app/layout.tsx | 4 ++-- packages/app/src/providers/posthog-provider.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/app/src/app/layout.tsx b/packages/app/src/app/layout.tsx index 770cd0e..e31f4f3 100644 --- a/packages/app/src/app/layout.tsx +++ b/packages/app/src/app/layout.tsx @@ -178,8 +178,8 @@ export default function RootLayout({