From a4544975568b1807755fd8f65c90b18714f29e34 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier Date: Tue, 9 Jun 2026 22:36:10 +0200 Subject: [PATCH 1/2] feat(about): add Independence and disclosure section Addresses the Mobula conflict-of-interest gap flagged in external SEO audits and required for the 'neutral methodology arbiter' positioning. New section iii on the About page declares: - Mobula funds the project + why - Mobula competes in 5 benchmarks and leads 2 (made explicit above the fold) - Three safeguards: open Prometheus data, open harness source, public methodology review (with the Coinpaprika story as the live example) - No paid tier, no sponsored slots, no token policy - Hosting funding source E-E-A-T signal: makes the conflict legible, links the recent methodology review PRs (#349, #352, #353), and gives Search Console / AI citation engines a concrete reason to treat the bench as authoritative. --- src/app/about/page.tsx | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 07bda322..202c7bd5 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -52,7 +52,29 @@ export default function AboutPage() { 13 live benchmarks. ~150 (provider × chain) probe pairs. Every metric is queryable on the public Prometheus and reproducible from the harness source.

- + +

+ OpenChainBench is funded by Mobula because we needed honest infrastructure benchmark data internally and saw no neutral source existed. The site is open-sourced because the industry needs it. +

+

+ Mobula competes in five live benchmarks: aggregator head lag, bridge fee, bridge quote latency, network coverage and metadata coverage. Mobula currently leads aggregator head lag and bridge quote latency. This is a real conflict of interest and we want it visible above the fold, not buried. +

+

+ Three safeguards stand against the conflict: +

+
    +
  • ·Open Prometheus data. Every number on the site is a literal quantile_over_time query. Anyone can hit our /api/citable or /api/stat/<slug> endpoint and re-derive the leaderboard with their own aggregation. If Mobula were inflating its rank, the raw data would show it.
  • +
  • ·Open harness source. Every harness is on GitHub under harnesses/. Clone, run docker compose up, your /metrics endpoint emits the same numbers ours does within 30 seconds.
  • +
  • ·Public methodology review. We invite external review and ship the fixes publicly. In June 2026 the Coinpaprika data team flagged four issues on the stablecoin peg and oracle deviation benches. We shipped three of them in pull requests #349, #352 and #353 within twenty-four hours and pushed back on the fourth with citations to CME, Chainlink and CoinGecko convention.
  • +
+

+ We do not run a paid tier. We do not sell ranking slots. We do not take provider sponsorship in exchange for inclusion. There is no token. If you spot any deviation from this policy, file a private security advisory and we will treat it as the integrity incident it would be. +

+

+ Hosting and infrastructure costs are paid by Mobula. The site runs on Vercel; harnesses run on Railway. We are open to grant funding that preserves editorial independence, but we will not accept funding from any party we benchmark. +

+ +

Every benchmark is a YAML spec plus a harness. The spec describes what to measure, which providers, which Prometheus queries hold the numbers; the harness runs continuously on Railway and exposes those metrics. A single shared Prometheus scrapes every harness; the site queries Prometheus directly and re-renders every minute. Every provider is rendered with equal visual weight. readers do their own ranking.

@@ -62,7 +84,7 @@ export default function AboutPage() { walks through the steps. New providers, new metrics, new chains. all welcome via pull request.

- +
  • ·Read the{" "}live benchmarks{" "}.
  • ·Reproduce any number. the{" "}methodology{" "}page tells you how.
  • @@ -70,7 +92,7 @@ export default function AboutPage() {
  • ·Discuss ideas in{" "}GitHub Discussions{" "}or follow{" "}@OpenChainBench.
- +

See a number you can't reproduce? File a{" "} From b4f3a83eeabd999d560be8ce4fad2df588da8ae6 Mon Sep 17 00:00:00 2001 From: Florent Tapponnier Date: Tue, 9 Jun 2026 22:43:45 +0200 Subject: [PATCH 2/2] feat(badge): add Share on X intent + Markdown copy on product badge cards Providers who clear the rank-1 threshold see embed-ready badge cards on their /products/[slug] page. Today it surfaces an SVG preview plus an HTML copy block. This adds two more ship-helpers: - 'Share on X' link with a pre-baked tweet intent. Opens X with the ranking claim, the bench URL and the @OpenChainBench tag pre-filled. Removes the friction of having to write the post; anchors every share back to us as a tagged tweet that the provider's followers will see. - 'Copy Markdown' details block for GitHub READMEs and docs. The markdown form ![alt](badgeUrl) is what 80% of crypto provider docs use, second only to HTML in landing pages. Both reuse the existing /api/badge// dynamic SVG so the displayed rank always reflects the live leaderboard. --- src/app/products/[slug]/page.tsx | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/app/products/[slug]/page.tsx b/src/app/products/[slug]/page.tsx index bdbbe46f..f84554ed 100644 --- a/src/app/products/[slug]/page.tsx +++ b/src/app/products/[slug]/page.tsx @@ -415,6 +415,14 @@ export default async function ProviderPage({ const badgeUrl = `${SITE.url}${badgePath}`; const targetUrl = `${SITE.url}/benchmarks/${a.benchmark.slug}`; const html = `Ranked #1 on OpenChainBench: ${a.benchmark.title}`; + const markdown = `[![Ranked #1 on OpenChainBench: ${a.benchmark.title}](${badgeUrl})](${targetUrl})`; + // Pre-baked X intent. Providers click → tweet draft opens + // with the ranking claim, the bench URL and the OCB handle + // already filled in. Removes the friction of writing the + // post themselves and gives us the canonical anchor text + // back as a tagged tweet on every share. + const tweetText = `Independently benchmarked #1 on ${a.benchmark.title} by @OpenChainBench.\n\nReproducible methodology, live data:`; + const tweetIntent = `https://x.com/intent/tweet?text=${encodeURIComponent(tweetText)}&url=${encodeURIComponent(targetUrl)}`; return (

  • @@ -430,6 +438,17 @@ export default async function ProviderPage({ decoding="async" /> +

    Copy HTML @@ -438,6 +457,14 @@ export default async function ProviderPage({ {html}
    +
    + + Copy Markdown + +
    +{markdown}
    +                    
    +
  • ); })}