From 46836beec9e03ae87a8e04e53dc9fb4948a0f31d Mon Sep 17 00:00:00 2001 From: Adam <2363879+adamdotdevin@users.noreply.github.com> Date: Fri, 29 May 2026 08:02:00 -0500 Subject: [PATCH] fix(stats): add social unfurl metadata (#29892) --- packages/stats/app/src/app.tsx | 4 +- .../stats/app/src/asset/unfurl-rankings.png | Bin 0 -> 12791 bytes packages/stats/app/src/routes/index.tsx | 36 +++++++++++++++--- 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 packages/stats/app/src/asset/unfurl-rankings.png diff --git a/packages/stats/app/src/app.tsx b/packages/stats/app/src/app.tsx index 976633f295..1d46cb782f 100644 --- a/packages/stats/app/src/app.tsx +++ b/packages/stats/app/src/app.tsx @@ -7,8 +7,8 @@ import "./app.css" function AppMeta() { return ( <> - opencode stats - + OpenCode Stats + ) } diff --git a/packages/stats/app/src/asset/unfurl-rankings.png b/packages/stats/app/src/asset/unfurl-rankings.png new file mode 100644 index 0000000000000000000000000000000000000000..872cb6073dc6155763f39e9f281286c218752558 GIT binary patch literal 12791 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 literal 0 HcmV?d00001 diff --git a/packages/stats/app/src/routes/index.tsx b/packages/stats/app/src/routes/index.tsx index a3573278ae..3590472106 100644 --- a/packages/stats/app/src/routes/index.tsx +++ b/packages/stats/app/src/routes/index.tsx @@ -6,6 +6,7 @@ import ibmPlexMonoMediumLatin1 from "@ibm/plex/IBM-Plex-Mono/fonts/split/woff2/I import ibmPlexMonoSemiBoldLatin1 from "@ibm/plex/IBM-Plex-Mono/fonts/split/woff2/IBMPlexMono-SemiBold-Latin1.woff2?url" import ibmPlexMonoBoldLatin1 from "@ibm/plex/IBM-Plex-Mono/fonts/split/woff2/IBMPlexMono-Bold-Latin1.woff2?url" import opencodeWordmarkDark from "../asset/logo-ornate-dark.svg" +import statsUnfurlRankings from "../asset/unfurl-rankings.png?url" import { getStatsHomeData, type LeaderboardEntry, @@ -30,6 +31,10 @@ const rangeLabels: Record = { "1M": "1 Month", "2M": "2 Months", } +const statsHomeTitle = "OpenCode Stats" +const statsHomeDescription = "OpenCode usage, market share, token cost, and session cost stats." +const statsHomeFallbackUrl = "https://stats.opencode.ai" +const statsUnfurlAlt = "OpenCode Stats wordmark on a dark patterned background" const headerLinks = [ { href: "#top-models", label: "Top Models" }, { href: "#leaderboard", label: "Leaderboard" }, @@ -90,17 +95,36 @@ const getGitHubStars = query(async () => { }, "getGitHubStars") export default function StatsHome() { - getRequestEvent()?.response.headers.set( - "Cache-Control", - "public, max-age=60, s-maxage=300, stale-while-revalidate=86400", - ) + const event = getRequestEvent() + event?.response.headers.set("Cache-Control", "public, max-age=60, s-maxage=300, stale-while-revalidate=86400") + const statsHomeUrl = new URL( + import.meta.env.BASE_URL, + event?.request.url ?? (typeof window === "undefined" ? statsHomeFallbackUrl : window.location.href), + ).toString() + const statsUnfurlUrl = new URL(statsUnfurlRankings, statsHomeUrl).toString() const data = createAsync(() => getData()) const githubStars = createAsync(() => getGitHubStars()) return (
- OpenCode Stats - + {statsHomeTitle} + + + + + + + + + + + + + + + + +