diff --git a/benchmarks/aggregator-head-lag.yml b/benchmarks/aggregator-head-lag.yml
index 1bd834f6e..f9534e6af 100644
--- a/benchmarks/aggregator-head-lag.yml
+++ b/benchmarks/aggregator-head-lag.yml
@@ -1,4 +1,4 @@
-# OpenChainBench — Bench № 001
+# OpenChainBench. Bench № 001
slug: aggregator-head-lag
number: "001"
@@ -23,7 +23,7 @@ methodology:
- "Regions: us-east, eu-west, sgp. Cross-region median reported in the headline."
- "Reference: archive nodes per chain, validated against block hashes."
- "Metric: gauge `head_lag_seconds`, sampled every 15 seconds. Aggregated over the 24-hour window using `quantile_over_time`."
- - "Success rate: presence ratio — share of expected sampling slots where a value was actually emitted (5,760 expected per provider per day at the 15s cadence). 100% means the aggregator's feed was reachable for the full window."
+ - "Success rate: presence ratio. share of expected sampling slots where a value was actually emitted (5,760 expected per provider per day at the 15s cadence). 100% means the aggregator's feed was reachable for the full window."
- "Cardinality: 3 aggregators × 3 chains × 3 regions = 27 active series."
findings: []
@@ -35,8 +35,8 @@ prometheus:
window: 24h
# Real metric exposed by the head-lag harness:
-# head_lag_seconds{aggregator, chain, region} — gauge in seconds
-# head_lag_errors_total{aggregator, chain, region, error_type} — counter
+# head_lag_seconds{aggregator, chain, region} . gauge in seconds
+# head_lag_errors_total{aggregator, chain, region, error_type} . counter
#
# Label is `aggregator=`, not `provider=`. Values are in seconds; queries
# multiply by 1000 so the loader stores milliseconds (consistent across the
diff --git a/benchmarks/bridge-fee.yml b/benchmarks/bridge-fee.yml
index 7fc14c4e3..125677413 100644
--- a/benchmarks/bridge-fee.yml
+++ b/benchmarks/bridge-fee.yml
@@ -1,4 +1,4 @@
-# OpenChainBench — Bench № 003
+# OpenChainBench. Bench № 003
slug: bridge-fee
number: "003"
@@ -10,11 +10,11 @@ metric: Effective fee
unit: pct
abstract: |
- We measure the effective fee each bridge charges — the bottom-line cost a
- user pays, fees plus slippage plus destination gas — as a percentage of
+ We measure the effective fee each bridge charges. the bottom-line cost a
+ user pays, fees plus slippage plus destination gas. as a percentage of
trade size. The harness uses Prometheus gauge `bridge_cost_percent`
rather than the narrower `bridge_fees_percent` because providers
- structure pricing differently — some charge an explicit fee, others bake
+ structure pricing differently. some charge an explicit fee, others bake
it into the spread. Comparing only the explicit fee field would let
aggregators with implicit pricing show a misleading 0%. Sampled at $300
notional so small-amount fixed-fee blowups don't skew the percentile
@@ -25,7 +25,7 @@ methodology:
- "Reference notional: $300 USDC. Smaller sizes ($5, $50) are captured by the harness but excluded from this report."
- "Cost: `bridge_cost_percent{amount_usd=\"300\"}`, in percent of notional. Includes fees + slippage + destination gas."
- "Cadence: full sweep every 5 minutes for 24 hours."
- - "Region: eu-west (single point — multi-region requires running additional monitor instances)."
+ - "Region: eu-west (single point. multi-region requires running additional monitor instances)."
- "Failures (quote_failed, unsupported route) excluded from cost aggregates and counted toward success rate."
findings: []
@@ -43,7 +43,7 @@ prometheus:
# Why cost rather than fee:
# bridge_fees_percent only captures the explicit fee field in each quote.
# Some providers (e.g. Mobula) bake the cost into the spread instead of
-# reporting an explicit fee, so they would render as 0% — misleading
+# reporting an explicit fee, so they would render as 0%. misleading
# readers. bridge_cost_percent = fees + slippage + gas, which is the
# number that actually leaves the user's wallet.
diff --git a/benchmarks/bridge-quote-latency.yml b/benchmarks/bridge-quote-latency.yml
index 4e08e6a40..c136118ce 100644
--- a/benchmarks/bridge-quote-latency.yml
+++ b/benchmarks/bridge-quote-latency.yml
@@ -1,4 +1,4 @@
-# OpenChainBench — Bench № 002
+# OpenChainBench. Bench № 002
slug: bridge-quote-latency
number: "002"
@@ -21,7 +21,7 @@ methodology:
- "Routes: USDC pairs spanning Solana, Base and Arbitrum."
- "Notional sizes: $5, $50, $300 per quote."
- "Cadence: full sweep (4 routes × 3 amounts × N bridges) every 5 minutes for 24 hours."
- - "Region: eu-west (single point — multi-region requires running additional monitor instances)."
+ - "Region: eu-west (single point. multi-region requires running additional monitor instances)."
- "Histogram buckets: 50, 100, 200, 500, 1000, 2000, 5000, 10000 ms."
- "Failures (quote_failed, execution_failed, unsupported route) excluded from latency aggregates and counted toward success rate."
@@ -35,8 +35,8 @@ prometheus:
# Real metrics exposed by the bridge-monitor harness:
# bridge_quote_latency_ms_{bucket,sum,count}{bridge, from_chain, to_chain, from_token, to_token, amount_usd, region}
-# bridge_quote_success{...} — gauge 0/1
-# bridge_errors_total{..., error_type} — counter
+# bridge_quote_success{...} . gauge 0/1
+# bridge_errors_total{..., error_type} . counter
#
# Label is `bridge=`, not `provider=`. Keep that in mind when extending.
diff --git a/benchmarks/metadata-coverage.yml b/benchmarks/metadata-coverage.yml
index 034a8e441..a24665cdc 100644
--- a/benchmarks/metadata-coverage.yml
+++ b/benchmarks/metadata-coverage.yml
@@ -1,4 +1,4 @@
-# OpenChainBench — Bench № 004
+# OpenChainBench. Bench № 004
slug: metadata-coverage
number: "004"
@@ -14,14 +14,14 @@ abstract: |
freshly-launched tokens. The harness subscribes to Mobula Pulse V2 for new
tokens on Solana, BNB Chain and Base, then asks each aggregator (Mobula,
Codex, Jupiter where the chain is supported) for that token's metadata and
- records whether four canonical fields — `logo`, `description`, `twitter`
- and `website` — were returned. The aggregate is the share of (provider,
+ records whether four canonical fields. `logo`, `description`, `twitter`
+ and `website`. were returned. The aggregate is the share of (provider,
chain, field) combinations that returned a populated value across all
fresh-token checks in the window.
Higher is better. A value of 100% means every field was returned for every
fresh token; a value of 50% means half the fields were missing on average.
- Sort order on this page is ascending — the lowest coverage shows first,
+ Sort order on this page is ascending. the lowest coverage shows first,
which is the inverse of latency benchmarks. Readers should compare the
columns themselves; numerical p50 is the headline.
@@ -30,9 +30,9 @@ methodology:
- "Coverage check: for each fresh token, query each aggregator's metadata endpoint and record whether `logo`, `description`, `twitter` and `website` are populated."
- "Aggregators in scope: Mobula (`/api/2/token/details`), Codex (GraphQL `token` query, JWT-authenticated), Jupiter (`/v6/tokens/
- Open, reproducible benchmarks for crypto infrastructure — measured in
+ Open, reproducible benchmarks for crypto infrastructure. measured in
the open, published in the same format every time.
- The goal is to make performance an observable property of crypto infrastructure — like uptime in SaaS, or p99 in databases — so builders can choose providers on data and users can hold them to it. + The goal is to make performance an observable property of crypto infrastructure. like uptime in SaaS, or p99 in databases. so builders can choose providers on data and users can hold them to it.
- 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 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. + 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 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.
Anyone can submit a benchmark. The{" "} contribution guide{" "} - walks through the steps. New providers, new metrics, new chains — all welcome via pull request. + walks through the steps. New providers, new metrics, new chains. all welcome via pull request.
Source code{" "} @@ -273,7 +273,7 @@ function DraftNotice({ source }: { source: string }) { return (
- Draft — no live data yet + Draft. no live data yet
The spec is published. Numbers will appear here as soon as the harness diff --git a/src/app/benchmarks/page.tsx b/src/app/benchmarks/page.tsx index 64bd64d88..00947832b 100644 --- a/src/app/benchmarks/page.tsx +++ b/src/app/benchmarks/page.tsx @@ -120,7 +120,7 @@ export default async function BenchmarksIndex() {
- {all.length} {all.length === 1 ? "benchmark" : "benchmarks"} live — and counting. + {all.length} {all.length === 1 ? "benchmark" : "benchmarks"} live. and counting.
- Anyone can publish on OpenChainBench. You write the harness, you host it, you keep your secrets. The project shares one Prometheus that scrapes your public /metrics endpoint — that is the only piece of common infrastructure. + Anyone can publish on OpenChainBench. You write the harness, you host it, you keep your secrets. The project shares one Prometheus that scrapes your public /metrics endpoint. that is the only piece of common infrastructure.
/metrics over HTTPS, and the project's shared Prometheus scrapes that URL on a schedule. You keep your API keys, your wallet keys, your budget. Maintainers only see the metric values your harness chooses to publish.
- The only piece of infrastructure shared by the project is one Prometheus instance — that is the URL every YAML spec points at. Adding a new harness is one extra scrape_configs block in infrastructure/prometheus/prometheus.yml. No new credentials, no new services, no privileged access to share.
+ The only piece of infrastructure shared by the project is one Prometheus instance. that is the URL every YAML spec points at. Adding a new harness is one extra scrape_configs block in infrastructure/prometheus/prometheus.yml. No new credentials, no new services, no privileged access to share.
- For a concrete end-to-end example with a fictional contributor — the spec, the Go harness, deploying to Fly.io, opening the PR — see the{" "} + For a concrete end-to-end example with a fictional contributor. the spec, the Go harness, deploying to Fly.io, opening the PR. see the{" "} walkthrough doc.
/metrics publicly reachable./metrics publicly reachable.~3-4 hours of focused work, spread across a few days. @@ -64,11 +64,11 @@ export default function ContributePage() {
Use the{" "} - 📊 Propose a benchmark + Propose a benchmark {" "}template to describe what you want to measure, which providers, and where the harness will run. Maintainers respond with feedback before any code is written. Want to brainstorm first? Use{" "} @@ -77,9 +77,9 @@ export default function ContributePage() { .
-
- Drop a file at benchmarks/<your-slug>.yml. It is the source of truth for the report — title, abstract, methodology, providers and the PromQL that fills in the numbers.
+ Drop a file at benchmarks/<your-slug>.yml. It is the source of truth for the report. title, abstract, methodology, providers and the PromQL that fills in the numbers.
@@ -87,7 +87,7 @@ export default function ContributePage() {
slug: wallet-portfolio-latency
number: "005"
-title: Wallet Portfolio API — Read Latency
+title: Wallet Portfolio API. Read Latency
subtitle: How fast each wallet API returns a complete portfolio for a busy address.
category: Wallets
status: live
@@ -132,29 +132,29 @@ providers:
That is the entire wire format. The Zod schema in src/lib/spec-schema.ts is the single source of truth; pnpm validate lints every spec in CI.
-
+
- The harness is a long-running data producer. Whatever fits the providers — Bun, Node, Python, Go, Rust. The contract is small:
+ The harness is a long-running data producer. Whatever fits the providers. Bun, Node, Python, Go, Rust. The contract is small:
/metrics over HTTP on a documented port (e.g. :2112 or :9090).harnesses/<slug>/README.md..env.example.infrastructure/ and are shared across every harness./metrics over HTTP on a documented port (e.g. :2112 or :9090).harnesses/<slug>/README.md..env.example.infrastructure/ and are shared across every harness.
- OpenChainBench is a federation: each harness is hosted by whoever wrote it. Pick whatever fits — Railway, Fly, Cloud Run, a VPS, a home server with a static IP. The only requirement is that /metrics is reachable over HTTPS at a stable URL.
+ OpenChainBench is a federation: each harness is hosted by whoever wrote it. Pick whatever fits. Railway, Fly, Cloud Run, a VPS, a home server with a static IP. The only requirement is that /metrics is reachable over HTTPS at a stable URL.
Append a job to infrastructure/prometheus/prometheus.yml pointing at your public URL so the shared Prometheus picks up your harness:
Test the queries locally before opening the PR:
{`pnpm validate # schema lint
diff --git a/src/app/methodology/page.tsx b/src/app/methodology/page.tsx
index 66ec06af2..333474120 100644
--- a/src/app/methodology/page.tsx
+++ b/src/app/methodology/page.tsx
@@ -19,8 +19,8 @@ export default function MethodologyPage() {
-
-
+
+
@@ -29,7 +29,7 @@ export default function MethodologyPage() {
Reported as p50, p90, p99 and arithmetic mean over the run window. Failed requests (timeout, 5xx, malformed response) are excluded from latency aggregates and counted toward success rate.
- Min and max of p50 observed across the rolling 24-hour window — captures the volatility of each provider, not just its central tendency.
+ Min and max of p50 observed across the rolling 24-hour window. captures the volatility of each provider, not just its central tendency.
Each provider's p50 expressed as a percentage delta from the field mean. Negative is below the field, positive is above.
Share of requests returning a usable result within the published timeout. The only metric that includes failures.
Wherever a benchmark is multi-region, the headline figure is the cross-region median. Per-region figures appear in Fig. 3 of each report.
@@ -40,7 +40,7 @@ export default function MethodologyPage() {
- Clone the harness from the link at the bottom of any benchmark report.
- Set API keys for the providers you want to include. Public endpoints work for most aggregators; some bridges require allow-listing.
- - Run the harness — it exposes
/metrics over HTTP. Point a local Prometheus at it, or query the public OpenChainBench Prometheus directly.
+ - Run the harness. it exposes
/metrics over HTTP. Point a local Prometheus at it, or query the public OpenChainBench Prometheus directly.
- Run for at least 24 hours to get a comparable sample size (n typically ≥ 1,000 per provider per region).
- Compare your aggregates to the published numbers. If they diverge, file a provider correction with a reproducer.
diff --git a/src/app/opengraph-image.tsx b/src/app/opengraph-image.tsx
index cf337ef42..c28aad789 100644
--- a/src/app/opengraph-image.tsx
+++ b/src/app/opengraph-image.tsx
@@ -1,7 +1,7 @@
import { ImageResponse } from "next/og";
export const runtime = "nodejs";
-export const alt = "OpenChainBench — Open benchmarks for crypto infrastructure";
+export const alt = "OpenChainBench. Open benchmarks for crypto infrastructure";
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";
@@ -72,7 +72,7 @@ export default function OG() {
maxWidth: 1080,
}}
>
- Latency, accuracy, reliability and cost — measured in the open.
+ Latency, accuracy, reliability and cost. measured in the open.
diff --git a/src/app/page.tsx b/src/app/page.tsx
index 4f20921ae..546b4dfcb 100644
--- a/src/app/page.tsx
+++ b/src/app/page.tsx
@@ -39,7 +39,7 @@ export default async function HomePage() {
- {/* Stats strip — neutral facts */}
+ {/* Stats strip. neutral facts */}
@@ -169,7 +169,7 @@ export default async function HomePage() {
No benchmark specs yet.
- Drop a YAML in benchmarks/ to get started — see the{" "}
+ Drop a YAML in benchmarks/ to get started. see the{" "}
tutorial.
diff --git a/src/app/press/page.tsx b/src/app/press/page.tsx
index 28f7418c6..924c3827b 100644
--- a/src/app/press/page.tsx
+++ b/src/app/press/page.tsx
@@ -16,7 +16,7 @@ export default function PressPage() {
- OpenChainBench is an open, reproducible benchmark series for crypto infrastructure. Each report measures latency, accuracy or reliability of one category — aggregators, bridges, RPCs, price feeds — and ships alongside the script that produced it. Methodology, specs and raw metrics are public. The project is community-run and MIT-licensed.
+ OpenChainBench is an open, reproducible benchmark series for crypto infrastructure. Each report measures latency, accuracy or reliability of one category. aggregators, bridges, RPCs, price feeds. and ships alongside the script that produced it. Methodology, specs and raw metrics are public. The project is community-run and MIT-licensed.
@@ -34,7 +34,7 @@ export default function PressPage() {
- For interviews, custom benchmark requests or pre-publication embargoes — open an issue or a discussion on{" "}
+ For interviews, custom benchmark requests or pre-publication embargoes. open an issue or a discussion on{" "}
GitHub.
diff --git a/src/app/twitter-image.tsx b/src/app/twitter-image.tsx
index d11b95076..3eacd4d03 100644
--- a/src/app/twitter-image.tsx
+++ b/src/app/twitter-image.tsx
@@ -1,7 +1,7 @@
import { ImageResponse } from "next/og";
export const runtime = "nodejs";
-export const alt = "OpenChainBench — Open benchmarks for crypto infrastructure";
+export const alt = "OpenChainBench. Open benchmarks for crypto infrastructure";
export const size = { width: 1200, height: 630 };
export const contentType = "image/png";
@@ -56,7 +56,7 @@ export default function TwitterImage() {
maxWidth: 1080,
}}
>
- Latency, cost and reliability — measured in the open.
+ Latency, cost and reliability. measured in the open.
- ↔ Swap
+ Swap A and B
@@ -335,7 +335,7 @@ export function ShareSection({ slug, title, benchmark }: Props) {
diff --git a/src/components/site-header.tsx b/src/components/site-header.tsx
index 03665b534..d8d669627 100644
--- a/src/components/site-header.tsx
+++ b/src/components/site-header.tsx
@@ -44,7 +44,7 @@ export async function SiteHeader() {
- {/* Masthead — wordmark + nav + CTA */}
+ {/* Masthead. wordmark + nav + CTA */}