Skip to content

Instantly share code, notes, and snippets.

@cs50victor
Created July 18, 2026 20:41
Show Gist options
  • Select an option

  • Save cs50victor/7a8d3981e9936315eab3ee2f20db8009 to your computer and use it in GitHub Desktop.

Select an option

Save cs50victor/7a8d3981e9936315eab3ee2f20db8009 to your computer and use it in GitHub Desktop.
bw-dataviz: agent skill for black & white single-file interactive HTML data reports (KPI tiles, SVG charts, sortable tables, tooltips, citations - zero dependencies)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fastest LLM Inference — Models Released Nov 2025 – Jul 2026</title>
<style>
:root {
--surface: #ffffff;
--ink: #111111;
--ink-2: #555555; /* secondary text, 7.4:1 on white */
--ink-3: #757575; /* muted text, 4.6:1 on white */
--hairline: #e4e4e4;
--wash: #f5f5f5;
--card: #ffffff;
--card-border: #d9d9d9;
}
@media (prefers-color-scheme: dark) {
:root {
--surface: #141414;
--ink: #f0f0f0;
--ink-2: #b5b5b5;
--ink-3: #8f8f8f;
--hairline: #2c2c2c;
--wash: #1d1d1d;
--card: #171717;
--card-border: #333333;
}
}
* { box-sizing: border-box; }
body {
margin: 0;
background: var(--surface);
color: var(--ink);
font: 15px/1.55 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
}
main { max-width: 1000px; margin: 0 auto; padding: 40px 24px 80px; }
h1 { font-size: 27px; line-height: 1.25; margin: 0 0 6px; letter-spacing: -0.01em; }
h2 { font-size: 19px; margin: 48px 0 4px; letter-spacing: -0.01em; }
h3 { font-size: 15px; margin: 20px 0 6px; }
.sub { color: var(--ink-2); margin: 0 0 8px; }
.note { color: var(--ink-3); font-size: 13px; }
a { color: var(--ink); text-underline-offset: 2px; }
a:hover { text-decoration-thickness: 2px; }
sup a { text-decoration: none; color: var(--ink-3); font-size: 11px; }
sup a:hover { color: var(--ink); }
/* KPI row */
.kpis { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 12px; margin: 26px 0 8px; }
.tile { border: 1px solid var(--card-border); background: var(--card); padding: 14px 16px 12px; }
.tile .label { font-size: 12.5px; color: var(--ink-2); }
.tile .value { font-size: 30px; font-weight: 650; line-height: 1.15; margin: 2px 0 1px; }
.tile .unit { font-size: 14px; font-weight: 500; color: var(--ink-2); }
.tile .detail { font-size: 12.5px; color: var(--ink-3); }
/* Filter row */
.filters {
display: flex; flex-wrap: wrap; gap: 18px; align-items: center;
padding: 12px 0; margin: 26px 0 4px; border-top: 1px solid var(--hairline); border-bottom: 1px solid var(--hairline);
font-size: 13.5px;
}
.filters label { color: var(--ink-2); margin-right: 6px; }
.filters select {
font: inherit; color: var(--ink); background: var(--surface);
border: 1px solid var(--card-border); padding: 4px 8px;
}
.filters .count { margin-left: auto; color: var(--ink-3); font-size: 12.5px; }
figure { margin: 18px 0 0; }
figcaption { font-size: 13px; color: var(--ink-2); margin: 2px 0 12px; }
svg text { font-family: inherit; }
.axis-tick { font-size: 11.5px; fill: var(--ink-3); font-variant-numeric: tabular-nums; }
.axis-title { font-size: 11.5px; fill: var(--ink-3); }
.gridline { stroke: var(--hairline); stroke-width: 1; }
.baseline { stroke: var(--ink-3); stroke-width: 1; }
.mark { fill: var(--ink); }
.mark-vendor { fill: url(#hatch); }
.bar-name { font-size: 13px; fill: var(--ink); font-weight: 550; }
.bar-provider { font-size: 11.5px; fill: var(--ink-2); }
.bar-value { font-size: 12.5px; fill: var(--ink); font-weight: 600; font-variant-numeric: tabular-nums; }
.dot { fill: var(--ink); stroke: var(--surface); stroke-width: 2; }
.dot-vendor { fill: var(--surface); stroke: var(--ink); stroke-width: 2; }
.dot-label { font-size: 11.5px; fill: var(--ink); }
.dot-sublabel { font-size: 10.5px; fill: var(--ink-3); }
.frontier { stroke: var(--ink-3); stroke-width: 1; stroke-dasharray: 2 4; fill: none; }
.frontier-label { font-size: 10.5px; fill: var(--ink-3); }
.hit { fill: transparent; cursor: pointer; }
.hit:focus { outline: none; }
.hit:focus + .focus-ring, g[tabindex]:focus-visible .focus-ring { display: block; }
g[tabindex]:focus-visible { outline: 1px dotted var(--ink-3); outline-offset: 2px; }
/* Legend */
.legend { display: flex; gap: 20px; align-items: center; font-size: 12.5px; color: var(--ink-2); margin: 10px 0 0; }
.legend .key { display: inline-flex; align-items: center; gap: 7px; }
.legend svg { display: block; }
/* Tooltip */
#tooltip {
position: fixed; z-index: 10; display: none; pointer-events: none;
max-width: 300px; padding: 9px 12px;
background: var(--ink); color: var(--surface);
font-size: 12.5px; line-height: 1.45;
box-shadow: 0 2px 10px rgba(0,0,0,.25);
}
#tooltip .tt-value { font-size: 15px; font-weight: 650; }
#tooltip .tt-muted { opacity: .72; }
/* Table */
.tablewrap { overflow-x: auto; margin-top: 14px; border: 1px solid var(--card-border); }
table { border-collapse: collapse; width: 100%; font-size: 13px; min-width: 900px; }
th, td { text-align: left; padding: 8px 11px; border-bottom: 1px solid var(--hairline); vertical-align: top; }
th {
font-size: 12px; color: var(--ink-2); font-weight: 600; background: var(--wash);
white-space: nowrap; cursor: pointer; user-select: none; position: sticky; top: 0;
}
th .arrow { color: var(--ink-3); font-size: 10px; }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; }
td .prov { color: var(--ink-2); font-size: 12px; display: block; }
td .meas-vendor { border: 1px solid var(--card-border); padding: 0 5px; font-size: 11px; color: var(--ink-2); }
tr:last-child td { border-bottom: none; }
tbody tr:hover { background: var(--wash); }
/* Recommendation cards */
.recs { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 12px; margin-top: 14px; }
.rec { border: 1px solid var(--card-border); background: var(--card); padding: 14px 16px; }
.rec h3 { margin: 0 0 4px; }
.rec p { margin: 4px 0; font-size: 13.5px; color: var(--ink-2); }
.rec .pick { font-size: 16px; font-weight: 650; color: var(--ink); }
/* Citations */
ol.cites { padding-left: 24px; font-size: 13px; color: var(--ink-2); }
ol.cites li { margin-bottom: 6px; }
ol.cites .src { color: var(--ink); }
details { margin-top: 10px; }
summary { cursor: pointer; font-weight: 600; font-size: 14px; }
details p, details li { font-size: 13.5px; color: var(--ink-2); }
@media print {
.filters { display: none; }
body { background: #fff; color: #000; }
}
</style>
</head>
<body>
<main>
<header>
<h1>The absolute fastest LLM inference, mid-2026</h1>
<p class="sub">Best recorded single-request output speed (tokens/second) per model, restricted to models released
<strong>November 2025 – July 2026</strong> (the past ~6–8 months), with the provider that achieves it.</p>
<p class="note">Data gathered 18 July 2026 from Artificial Analysis, vendor announcements, and press coverage.
Numbered references <sup><a href="#cites">[n]</a></sup> link to sources at the bottom. Speeds are output-generation
throughput for a single request, not batch throughput.</p>
</header>
<div class="kpis">
<div class="tile">
<div class="label">Absolute fastest (any recent model)</div>
<div class="value">1,851 <span class="unit">tok/s</span></div>
<div class="detail">Gemma 4 31B on Cerebras — measured by Artificial Analysis <sup><a href="#c1">[1]</a></sup></div>
</div>
<div class="tile">
<div class="label">Fastest frontier-class model</div>
<div class="value">750 <span class="unit">tok/s</span></div>
<div class="detail">GPT-5.6 Sol on Cerebras WSE-3 (Intelligence 59) — limited access <sup><a href="#c4">[4]</a><a href="#c5">[5]</a></sup></div>
</div>
<div class="tile">
<div class="label">Smartest model overall</div>
<div class="value">60 <span class="unit">Intelligence Index</span></div>
<div class="detail">Claude Fable 5, Anthropic API — but only 60.7 tok/s <sup><a href="#c8">[8]</a></sup></div>
</div>
<div class="tile">
<div class="label">Fastest trillion-parameter model</div>
<div class="value">981 <span class="unit">tok/s</span></div>
<div class="detail">Kimi K2.6 (1T MoE) on Cerebras — AA-verified, 6.7&times; next-fastest cloud <sup><a href="#c2">[2]</a><a href="#c3">[3]</a></sup></div>
</div>
</div>
<div class="filters" role="group" aria-label="Filters for all charts and the table">
<span>
<label for="f-records">Records</label>
<select id="f-records">
<option value="all">All records</option>
<option value="aa">Independently measured only</option>
</select>
</span>
<span>
<label for="f-intel">Min intelligence</label>
<select id="f-intel">
<option value="0">Any</option>
<option value="40">40+</option>
<option value="50">50+</option>
<option value="55">55+</option>
</select>
</span>
<span class="count" id="f-count"></span>
</div>
<h2>Fastest recorded speed per model</h2>
<p class="sub">Each bar is the model's best-known endpoint. Hover or focus a bar for details.</p>
<figure>
<div id="barchart"></div>
<div class="legend" id="bar-legend"></div>
<figcaption>Cerebras wafer-scale hardware holds every record above 750 tok/s. The same models run 6–50&times; slower
on their first-party GPU APIs (e.g. Gemma 4 31B: 1,851 tok/s on Cerebras vs 35.8 tok/s on Google's API
<sup><a href="#c1">[1]</a><a href="#c21">[21]</a></sup>).</figcaption>
</figure>
<h2>Smartest model with the fastest inference</h2>
<p class="sub">Intelligence (Artificial Analysis Intelligence Index) vs best-endpoint output speed. Up and to the
right is better; the dotted line is the speed–intelligence frontier.</p>
<figure>
<div id="scatter"></div>
<div class="legend" id="scatter-legend"></div>
<figcaption>Output speed on a log scale. Four models define the frontier: Claude Fable 5 (smartest), GPT-5.6 Sol on
Cerebras (frontier intelligence at 750 tok/s), Kimi K2.6 on Cerebras, and Gemma 4 31B on Cerebras (fastest).</figcaption>
</figure>
<h2>Where to get it</h2>
<div class="recs">
<div class="rec">
<h3>Maximum intelligence, speed secondary</h3>
<p class="pick">Claude Fable 5 — Anthropic API</p>
<p>Intelligence Index 60, ranked #1 of 187 models. 60.7 tok/s with a ~116 s time-to-first-token at max
reasoning effort, so it is the smartest option but nowhere near the fastest.<sup><a href="#c8">[8]</a></sup></p>
</div>
<div class="rec">
<h3>Frontier intelligence at record speed</h3>
<p class="pick">GPT-5.6 Sol — Cerebras Inference API</p>
<p>Intelligence 59 (#2) at up to 750 tok/s on Cerebras WSE-3 — ~14&times; faster than the 53.9 tok/s OpenAI's own
API delivers. Initial access limited to ~20 organizations, broader rollout expected from mid-July
2026.<sup><a href="#c4">[4]</a><a href="#c5">[5]</a><a href="#c9">[9]</a></sup></p>
</div>
<div class="rec">
<h3>Widely available today, best balance</h3>
<p class="pick">Gemini 3.5 Flash — Google API</p>
<p>Intelligence 55 at 280+ tok/s; Artificial Analysis calls it "the clear leader on the Intelligence vs Speed
Pareto frontier" among generally available APIs.<sup><a href="#c19">[19]</a></sup> Open-weight alternative:
GLM-5.2 (Intelligence 51) at 391–431 tok/s on Together, Fireworks or Blackbox.<sup><a href="#c14">[14]</a><a href="#c16">[16]</a></sup></p>
</div>
</div>
<h2>Full dataset</h2>
<p class="sub">Click a column header to sort. This table is the accessible twin of both charts and always shows every
value the tooltips do.</p>
<div class="tablewrap">
<table id="datatable" aria-label="Fastest inference speeds by model and provider">
<thead><tr id="table-head"></tr></thead>
<tbody id="table-body"></tbody>
</table>
</div>
<p class="note">TTFT = time to first token; for reasoning models it includes thinking time at the benchmarked effort
level, which is why frontier reasoning models show 30–130 s. "AA" = measured/verified by Artificial Analysis.
Vendor-claimed figures are stated production rates not yet independently benchmarked on a public endpoint.</p>
<details>
<summary>Context: records excluded because the model is older than ~8 months</summary>
<p>The all-time single-request record on any model remains <strong>Cerebras running gpt-oss-120B at ~3,000
tok/s</strong> — but that model shipped in August 2025, ~11 months ago, so it falls outside this page's
window.<sup><a href="#c31">[31]</a></sup> Likewise excluded: Groq's LPU at ~1,200 tok/s sustained on Llama 3.1 70B
(a 2024 model; Groq's catalog still centers on Llama 3.x / Llama 4 Scout / GPT-OSS)
<sup><a href="#c27">[27]</a><a href="#c28">[28]</a></sup>, and SambaNova's 700+ tok/s on 70B-class custom models
(June 2026, older base models). SambaNova's SN50 chip (announced Feb 24, 2026, claiming 5&times; competitive
speeds) had published no qualifying model record as of this snapshot.<sup><a href="#c29">[29]</a><a href="#c30">[30]</a></sup></p>
</details>
<h2 id="cites">Sources</h2>
<p class="note">All accessed 18 July 2026. Artificial Analysis figures are live snapshots and drift over time.</p>
<ol class="cites">
<li id="c1"><span class="src">Cerebras</span> — "Gemma 4 on Cerebras — The Fastest Inference is Now Multimodal" (1,851 tok/s record, measured by Artificial Analysis). <a href="https://www.cerebras.ai/blog/gemma-4-on-cerebras-the-fastest-inference-is-now-multimodal">cerebras.ai/blog/gemma-4-on-cerebras…</a></li>
<li id="c2"><span class="src">Cerebras</span> — "Cerebras Brings Trillion Parameter Inference to Enterprises with Kimi K2.6," May 19, 2026 (981 tok/s, AA-measured May 6, 2026). <a href="https://www.cerebras.ai/blog/cerebras-kimi-k2-Enterprise">cerebras.ai/blog/cerebras-kimi-k2-Enterprise</a></li>
<li id="c3"><span class="src">VentureBeat</span> — "Cerebras says its chips run a trillion-parameter AI model nearly 7 times faster than GPU clouds," May 20, 2026. <a href="https://venturebeat.com/technology/cerebras-says-its-chips-run-a-trillion-parameter-ai-model-nearly-7-times-faster-than-gpu-clouds">venturebeat.com/technology/cerebras-says-its-chips…</a></li>
<li id="c4"><span class="src">Value Add Pulse</span> — "Cerebras Runs OpenAI GPT-5.6 Sol at 750 Tokens per Second, Setting a New Frontier-Model Speed Record," Jun 26, 2026. <a href="https://valueaddvc.com/pulse/cerebras-openai-gpt-5-6-sol-750-tokens-2026">valueaddvc.com/pulse/cerebras-openai-gpt-5-6-sol…</a></li>
<li id="c5"><span class="src">Awesome Agents</span> — "Cerebras Pushes GPT-5.6 Sol to 750 Tokens Per Second," Jul 11, 2026 (production availability, ~20 orgs initially). <a href="https://awesomeagents.ai/news/gpt56-sol-cerebras-wafer-scale-750-tokens/">awesomeagents.ai/news/gpt56-sol-cerebras…</a></li>
<li id="c6"><span class="src">OpenAI</span> — "Previewing GPT-5.6 Sol," Jun 26, 2026. <a href="https://openai.com/index/previewing-gpt-5-6-sol/">openai.com/index/previewing-gpt-5-6-sol</a></li>
<li id="c7"><span class="src">Artificial Analysis</span> — Models leaderboard (intelligence &amp; speed overview). <a href="https://artificialanalysis.ai/models">artificialanalysis.ai/models</a></li>
<li id="c8"><span class="src">Artificial Analysis</span> — Claude Fable 5 (Intelligence 60 #1/187; 60.7 tok/s; TTFT 116.24 s; released Jun 9, 2026). <a href="https://artificialanalysis.ai/models/claude-fable-5">artificialanalysis.ai/models/claude-fable-5</a></li>
<li id="c9"><span class="src">Artificial Analysis</span> — GPT-5.6 Sol (Intelligence 59 #2/187; 53.9 tok/s on OpenAI API; TTFT 129.28 s; released Jul 9, 2026). <a href="https://artificialanalysis.ai/models/gpt-5-6-sol">artificialanalysis.ai/models/gpt-5-6-sol</a></li>
<li id="c10"><span class="src">Artificial Analysis</span> — Kimi K3 (Intelligence 57; 62 tok/s; TTFT 1.99 s). <a href="https://artificialanalysis.ai/models/kimi-k3">artificialanalysis.ai/models/kimi-k3</a></li>
<li id="c11"><span class="src">Artificial Analysis</span> — Mercury 2 (Intelligence 25; 752.2 tok/s on Inception API; TTFT 3.06 s; released Feb 20, 2026). <a href="https://artificialanalysis.ai/models/mercury-2">artificialanalysis.ai/models/mercury-2</a></li>
<li id="c12"><span class="src">Inception</span> — "Introducing Mercury 2" (first reasoning diffusion LLM; 1,009 tok/s on NVIDIA Blackwell claimed). <a href="https://www.inceptionlabs.ai/blog/introducing-mercury-2">inceptionlabs.ai/blog/introducing-mercury-2</a></li>
<li id="c13"><span class="src">Business Wire</span> — "Inception Launches Mercury 2, the Fastest Reasoning LLM — 5x Faster Than Leading Speed-Optimized LLMs," Feb 24, 2026. <a href="https://www.businesswire.com/news/home/20260224034496/en/Inception-Launches-Mercury-2-the-Fastest-Reasoning-LLM-5x-Faster-Than-Leading-Speed-Optimized-LLMs-with-Dramatically-Lower-Inference-Cost">businesswire.com/news/home/20260224034496</a></li>
<li id="c14"><span class="src">Artificial Analysis</span> — GLM-5.2 (Intelligence 51; 177.8 tok/s median across 16 providers; released Jun 16, 2026). <a href="https://artificialanalysis.ai/models/glm-5-2">artificialanalysis.ai/models/glm-5-2</a></li>
<li id="c15"><span class="src">Z.ai</span> — "GLM-5.2: Built for Long-Horizon Tasks" (launch post). <a href="https://z.ai/blog/glm-5.2">z.ai/blog/glm-5.2</a></li>
<li id="c16"><span class="src">Artificial Analysis</span> — API Provider Performance Leaderboard (GLM-5.2: Blackbox 431, Fireworks 412, Together 391 tok/s; DeepSeek V4 Pro: Together 317 tok/s, TTFT 1.02 s). <a href="https://artificialanalysis.ai/leaderboards/providers">artificialanalysis.ai/leaderboards/providers</a></li>
<li id="c17"><span class="src">Artificial Analysis</span> — Gemini 3.1 Pro Preview (Intelligence 46; 117.3 tok/s; TTFT 39.54 s; released Feb 19, 2026). <a href="https://artificialanalysis.ai/models/gemini-3-1-pro-preview">artificialanalysis.ai/models/gemini-3-1-pro-preview</a></li>
<li id="c18"><span class="src">Artificial Analysis</span> — Gemini 3.1 Flash-Lite (Intelligence 25; 289.9 tok/s; TTFT 6.22 s; released Mar 3, 2026). <a href="https://artificialanalysis.ai/models/gemini-3-1-flash-lite-preview">artificialanalysis.ai/models/gemini-3-1-flash-lite-preview</a></li>
<li id="c19"><span class="src">Artificial Analysis</span> — "Gemini 3.5 Flash: The new leader in intelligence versus speed" (Intelligence 55; 280+ tok/s; released May 19, 2026). <a href="https://artificialanalysis.ai/articles/gemini-3-5-flash-everything-you-need-to-know">artificialanalysis.ai/articles/gemini-3-5-flash…</a></li>
<li id="c20"><span class="src">Google</span> — "Gemini 3.5: frontier intelligence with action." <a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-3-5/">blog.google/…/gemini-3-5</a></li>
<li id="c21"><span class="src">Artificial Analysis</span> — Gemma 4 31B (Intelligence 29; 35.8 tok/s on Google's API; TTFT 1.17 s; released Apr 2, 2026). <a href="https://artificialanalysis.ai/models/gemma-4-31b">artificialanalysis.ai/models/gemma-4-31b</a></li>
<li id="c22"><span class="src">Google DeepMind</span> — Gemma 4 model page (Apache 2.0, four sizes). <a href="https://deepmind.google/models/gemma/gemma-4/">deepmind.google/models/gemma/gemma-4</a></li>
<li id="c23"><span class="src">DeepSeek</span> — "DeepSeek V4 Preview Release," Apr 24, 2026 (V4-Pro 1.6T/49B active; V4-Flash 284B/13B active; MIT weights). <a href="https://api-docs.deepseek.com/news/news260424/">api-docs.deepseek.com/news/news260424</a></li>
<li id="c24"><span class="src">Artificial Analysis</span> — DeepSeek V4 Pro (Intelligence 44; 61.1 tok/s first-party; released Apr 24, 2026). <a href="https://artificialanalysis.ai/models/deepseek-v4-pro">artificialanalysis.ai/models/deepseek-v4-pro</a></li>
<li id="c25"><span class="src">Artificial Analysis</span> — Kimi K2.6 (Intelligence 44; 48.2 tok/s median across 15 public providers; released Apr 20, 2026). <a href="https://artificialanalysis.ai/models/kimi-k2-6">artificialanalysis.ai/models/kimi-k2-6</a></li>
<li id="c26"><span class="src">Yicai Global</span> — "China's Moonshot AI Releases Kimi K2.6," Apr 2026. <a href="https://www.yicaiglobal.com/news/chinas-moonshot-ai-releases-kimi-k26-pushing-boundaries-in-coding-multi-agent-capabilities">yicaiglobal.com/news/chinas-moonshot-ai-releases-kimi-k26…</a></li>
<li id="c27"><span class="src">Markaicode</span> — "Groq Latency Benchmark: 1,200 Tokens/s vs Cold Start in 0.4 s," May 2026 (Llama 3.1 70B — model outside the window). <a href="https://markaicode.com/benchmarks/groq-production-benchmark-latency/">markaicode.com/benchmarks/groq-production-benchmark-latency</a></li>
<li id="c28"><span class="src">TokenMix</span> — "Groq API Pricing 2026" (catalog: Llama 3.1 8B 840 TPS, GPT-OSS 120B 500 TPS, Llama 3.3 70B 394 TPS). <a href="https://tokenmix.ai/blog/groq-api-pricing">tokenmix.ai/blog/groq-api-pricing</a></li>
<li id="c29"><span class="src">Intel Capital</span> — "SambaNova Unveils Fastest Chip for Agentic AI (SN50), Collaborates with Intel and Raises $350M," Feb 24, 2026. <a href="https://www.intelcapital.com/sambanova-unveils-fastest-chip-for-agentic-ai-collaborates-with-intel-and-raises-350m/">intelcapital.com/sambanova-unveils-fastest-chip…</a></li>
<li id="c30"><span class="src">SambaNova</span> — "Lightning Digest, June 2026" (700+ tok/s on 70B-class custom models). <a href="https://www.linkedin.com/pulse/sambanova-lightning-digest-june-2026-sambanova-e7ytc">linkedin.com/pulse/sambanova-lightning-digest-june-2026</a></li>
<li id="c31"><span class="src">Cerebras / Artificial Analysis</span> — gpt-oss-120B at ~3,000 tok/s on Cerebras (all-time record; model released Aug 2025, outside this page's window). <a href="https://www.cerebras.ai/press-release/cerebras-launches-the-worlds-fastest-ai-inference">cerebras.ai/press-release/cerebras-launches-the-worlds-fastest-ai-inference</a></li>
</ol>
</main>
<div id="tooltip" role="status" aria-hidden="true"></div>
<script>
"use strict";
/* ---------- data ---------- */
/* kind: "aa" = independently measured/verified by Artificial Analysis; "vendor" = vendor-claimed production rate */
const MODELS = [
{ id:"gemma4", model:"Gemma 4 31B", dev:"Google DeepMind", released:"2026-04-02", provider:"Cerebras",
speed:1851, kind:"aa", intel:29, ttft:"1.5 s (Cerebras)", ttftS:1.5,
fp:"35.8 (Google API)", fpS:35.8,
note:"Public preview on Cerebras Inference Cloud; 35x a typical GPU endpoint.", refs:[1,21,22] },
{ id:"k26", model:"Kimi K2.6 (1T MoE)", dev:"Moonshot AI", released:"2026-04-20", provider:"Cerebras (enterprise trials)",
speed:981, kind:"aa", intel:44, ttft:"—", ttftS:null,
fp:"48.2 (median, 15 public providers)", fpS:48.2,
note:"AA-verified May 6, 2026; 6.7x the next-fastest GPU cloud, 23x the median provider.", refs:[2,3,25,26] },
{ id:"mercury2",model:"Mercury 2", dev:"Inception Labs", released:"2026-02-24", provider:"Inception API (NVIDIA Blackwell)",
speed:752, kind:"aa", intel:25, ttft:"3.06 s", ttftS:3.06,
fp:"752.2 (Inception API)", fpS:752.2,
note:"Diffusion LLM. Inception claims 1,009 tok/s on Blackwell; AA measures 752.2.", refs:[11,12,13] },
{ id:"sol", model:"GPT-5.6 Sol", dev:"OpenAI", released:"2026-07-09", provider:"Cerebras WSE-3 (limited access)",
speed:750, kind:"vendor", intel:59, ttft:"129.3 s (OpenAI API, max effort)", ttftS:129.28,
fp:"53.9 (OpenAI API)", fpS:53.9,
note:"Up to 750 tok/s in production for ~20 orgs initially; previewed Jun 26, GA Jul 9, 2026.", refs:[4,5,6,9] },
{ id:"glm52", model:"GLM-5.2", dev:"Z.ai (Zhipu)", released:"2026-06-16", provider:"Blackbox AI",
speed:431, kind:"aa", intel:51, ttft:"1.82 s (Blackbox)", ttftS:1.82,
fp:"177.8 (median, 16 providers)", fpS:177.8,
note:"Also Fireworks 412, Together 391, Baseten 344, Databricks 310 tok/s.", refs:[14,15,16] },
{ id:"dsv4", model:"DeepSeek V4 Pro", dev:"DeepSeek", released:"2026-04-24", provider:"Together AI",
speed:317, kind:"aa", intel:44, ttft:"1.02 s (Together)", ttftS:1.02,
fp:"61.1 (DeepSeek API)", fpS:61.1,
note:"1.6T total / 49B active parameters, MIT open weights.", refs:[16,23,24] },
{ id:"g31fl", model:"Gemini 3.1 Flash-Lite", dev:"Google", released:"2026-03-03", provider:"Google API",
speed:290, kind:"aa", intel:25, ttft:"6.22 s", ttftS:6.22,
fp:"289.9 (Google API)", fpS:289.9,
note:"Fastest closed-weight model from a major lab at its snapshot.", refs:[18] },
{ id:"g35f", model:"Gemini 3.5 Flash", dev:"Google", released:"2026-05-19", provider:"Google API",
speed:280, kind:"aa", intel:55, ttft:"—", ttftS:null,
fp:"280+ (Google API)", fpS:280,
note:"AA: 'the clear leader on the Intelligence vs Speed Pareto frontier.'", refs:[19,20] },
{ id:"g31pro", model:"Gemini 3.1 Pro Preview",dev:"Google", released:"2026-02-19", provider:"Google API",
speed:117, kind:"aa", intel:46, ttft:"39.5 s", ttftS:39.54,
fp:"117.3 (Google API)", fpS:117.3,
note:"", refs:[17] },
{ id:"k3", model:"Kimi K3", dev:"Moonshot AI", released:"2026-07-16", provider:"Moonshot API",
speed:62, kind:"aa", intel:57, ttft:"1.99 s", ttftS:1.99,
fp:"62 (Moonshot API)", fpS:62,
note:"2.8T MoE, 1M context; #4 on Intelligence Index at launch.", refs:[10] },
{ id:"fable5", model:"Claude Fable 5", dev:"Anthropic", released:"2026-06-09", provider:"Anthropic API",
speed:60.7, kind:"aa", intel:60, ttft:"116.2 s (max effort)", ttftS:116.24,
fp:"60.7 (Anthropic API)", fpS:60.7,
note:"#1 on Intelligence Index (60/187 models ranked).", refs:[8] },
];
/* scatter label side per point (precomputed to avoid collisions) */
const LABEL_SIDE = { gemma4:"r", k26:"r", mercury2:"r", sol:"l", glm52:"r", dsv4:"r",
g31fl:"r", g35f:"r", g31pro:"r", k3:"l", fable5:"r" };
const state = { records:"all", minIntel:0, sortKey:"speed", sortDir:-1 };
const fmt = new Intl.NumberFormat("en-US");
const svgNS = "http://www.w3.org/2000/svg";
function visibleModels() {
return MODELS.filter(m =>
(state.records === "all" || m.kind === "aa") && m.intel >= state.minIntel);
}
function el(name, attrs, parent) {
const node = document.createElementNS(svgNS, name);
for (const k in attrs) node.setAttribute(k, attrs[k]);
if (parent) parent.appendChild(node);
return node;
}
/* ---------- tooltip ---------- */
const tooltip = document.getElementById("tooltip");
function showTooltip(m, x, y) {
tooltip.replaceChildren();
const add = (text, cls) => {
const d = document.createElement("div");
if (cls) d.className = cls;
d.textContent = text;
tooltip.appendChild(d);
};
add(fmt.format(m.speed) + " tok/s", "tt-value");
add(m.model + " — " + m.provider);
add(m.kind === "aa" ? "Measured by Artificial Analysis" : "Vendor-claimed production rate", "tt-muted");
add("Intelligence " + m.intel + " · released " + m.released, "tt-muted");
if (m.note) add(m.note, "tt-muted");
tooltip.style.display = "block";
tooltip.setAttribute("aria-hidden", "false");
const rect = tooltip.getBoundingClientRect();
let left = x + 14, top = y + 14;
if (left + rect.width > window.innerWidth - 8) left = x - rect.width - 14;
if (top + rect.height > window.innerHeight - 8) top = y - rect.height - 14;
tooltip.style.left = Math.max(8, left) + "px";
tooltip.style.top = Math.max(8, top) + "px";
}
function hideTooltip() {
tooltip.style.display = "none";
tooltip.setAttribute("aria-hidden", "true");
}
function attachTooltip(target, m) {
target.addEventListener("pointermove", e => showTooltip(m, e.clientX, e.clientY));
target.addEventListener("pointerleave", hideTooltip);
target.addEventListener("focus", () => {
const r = target.getBoundingClientRect();
showTooltip(m, r.left + r.width / 2, r.top);
});
target.addEventListener("blur", hideTooltip);
}
/* ---------- shared defs (hatch pattern for vendor-claimed) ---------- */
function addHatchDefs(svg, idSuffix) {
const defs = el("defs", {}, svg);
const pat = el("pattern", { id:"hatch" + idSuffix, width:6, height:6,
patternUnits:"userSpaceOnUse", patternTransform:"rotate(45)" }, defs);
el("rect", { width:6, height:6, fill:"var(--surface)" }, pat);
el("line", { x1:0, y1:0, x2:0, y2:6, stroke:"var(--ink)", "stroke-width":2.5 }, pat);
/* also register the generic id used by CSS on first chart */
return "url(#hatch" + idSuffix + ")";
}
/* ---------- legend ---------- */
function buildLegend(container) {
container.replaceChildren();
const mk = (label, vendor) => {
const span = document.createElement("span");
span.className = "key";
const svg = document.createElementNS(svgNS, "svg");
svg.setAttribute("width", 18); svg.setAttribute("height", 12);
if (vendor) {
const d = el("defs", {}, svg);
const p = el("pattern", { id:"lg" + Math.random().toString(36).slice(2,7), width:5, height:5,
patternUnits:"userSpaceOnUse", patternTransform:"rotate(45)" }, d);
el("rect", { width:5, height:5, fill:"var(--surface)" }, p);
el("line", { x1:0, y1:0, x2:0, y2:5, stroke:"var(--ink)", "stroke-width":2 }, p);
el("rect", { x:0.5, y:0.5, width:17, height:11, fill:"url(#" + p.id + ")",
stroke:"var(--ink)", "stroke-width":1 }, svg);
} else {
el("rect", { width:18, height:12, fill:"var(--ink)" }, svg);
}
span.appendChild(svg);
span.appendChild(document.createTextNode(label));
return span;
};
container.appendChild(mk("Independently measured (Artificial Analysis)", false));
container.appendChild(mk("Vendor-claimed / limited availability", true));
}
/* ---------- bar chart ---------- */
function renderBars() {
const host = document.getElementById("barchart");
host.replaceChildren();
const data = visibleModels().slice().sort((a, b) => b.speed - a.speed);
if (!data.length) { host.textContent = "No models match the current filters."; return; }
const W = 960, labelW = 208, rightPad = 64, rowH = 46, barH = 20, topPad = 8, axisH = 34;
const H = topPad + data.length * rowH + axisH;
const plotW = W - labelW - rightPad;
const maxV = 1900;
const x = v => labelW + (v / maxV) * plotW;
const svg = el("svg", { viewBox:`0 0 ${W} ${H}`, width:"100%", role:"img",
"aria-label":"Bar chart of fastest recorded output speed per model" });
const fill = addHatchDefs(svg, "-bars");
/* gridlines + ticks */
for (const t of [0, 500, 1000, 1500]) {
el("line", { x1:x(t), y1:topPad, x2:x(t), y2:H - axisH, class: t === 0 ? "baseline" : "gridline" }, svg);
const tick = el("text", { x:x(t), y:H - axisH + 16, "text-anchor":"middle", class:"axis-tick" }, svg);
tick.textContent = fmt.format(t);
}
const at = el("text", { x:x(maxV / 2), y:H - 4, "text-anchor":"middle", class:"axis-title" }, svg);
at.textContent = "Output tokens per second (single request, best-known endpoint)";
data.forEach((m, i) => {
const y0 = topPad + i * rowH + (rowH - barH) / 2;
const g = el("g", { tabindex:0, role:"img",
"aria-label":`${m.model} on ${m.provider}: ${fmt.format(m.speed)} tokens per second` }, svg);
const name = el("text", { x:labelW - 12, y:y0 + 8, "text-anchor":"end", class:"bar-name" }, g);
name.textContent = m.model;
const prov = el("text", { x:labelW - 12, y:y0 + 21, "text-anchor":"end", class:"bar-provider" }, g);
prov.textContent = m.provider;
const w = Math.max(2, x(m.speed) - x(0));
/* 4px rounded data-end, square baseline: rounded rect + square patch at baseline */
el("rect", { x:x(0), y:y0, width:w, height:barH, rx:4, ry:4,
fill: m.kind === "vendor" ? fill : "var(--ink)",
stroke: m.kind === "vendor" ? "var(--ink)" : "none", "stroke-width": m.kind === "vendor" ? 1 : 0 }, g);
el("rect", { x:x(0), y:y0, width:Math.min(4, w), height:barH,
fill: m.kind === "vendor" ? fill : "var(--ink)" }, g);
const val = el("text", { x:x(m.speed) + 7, y:y0 + barH / 2 + 4.5, class:"bar-value" }, g);
val.textContent = fmt.format(m.speed);
/* enlarged hit target */
const hit = el("rect", { x:0, y:topPad + i * rowH, width:W, height:rowH, class:"hit" }, g);
attachTooltip(g, m);
attachTooltip(hit, m);
});
host.appendChild(svg);
}
/* ---------- scatter ---------- */
function renderScatter() {
const host = document.getElementById("scatter");
host.replaceChildren();
const data = visibleModels();
if (!data.length) { host.textContent = "No models match the current filters."; return; }
const W = 960, H = 430, mL = 64, mR = 178, mT = 16, mB = 52;
const plotW = W - mL - mR, plotH = H - mT - mB;
const xMin = 20, xMax = 64;
const yMin = 30, yMax = 2400; /* log scale */
const x = v => mL + ((v - xMin) / (xMax - xMin)) * plotW;
const y = v => mT + plotH - ((Math.log10(v) - Math.log10(yMin)) / (Math.log10(yMax) - Math.log10(yMin))) * plotH;
const svg = el("svg", { viewBox:`0 0 ${W} ${H}`, width:"100%", role:"img",
"aria-label":"Scatter plot of intelligence index versus output speed" });
addHatchDefs(svg, "-scatter");
for (const t of [50, 100, 200, 400, 800, 1600]) {
el("line", { x1:mL, y1:y(t), x2:W - mR, y2:y(t), class:"gridline" }, svg);
const tick = el("text", { x:mL - 8, y:y(t) + 3.5, "text-anchor":"end", class:"axis-tick" }, svg);
tick.textContent = fmt.format(t);
}
for (const t of [20, 30, 40, 50, 60]) {
el("line", { x1:x(t), y1:H - mB, x2:x(t), y2:H - mB + 5, class:"baseline" }, svg);
const tick = el("text", { x:x(t), y:H - mB + 19, "text-anchor":"middle", class:"axis-tick" }, svg);
tick.textContent = t;
}
el("line", { x1:mL, y1:H - mB, x2:W - mR, y2:H - mB, class:"baseline" }, svg);
const xt = el("text", { x:mL + plotW / 2, y:H - 8, "text-anchor":"middle", class:"axis-title" }, svg);
xt.textContent = "Artificial Analysis Intelligence Index (higher = smarter)";
const yt = el("text", { x:14, y:mT + plotH / 2, class:"axis-title",
transform:`rotate(-90 14 ${mT + plotH / 2})` , "text-anchor":"middle"}, svg);
yt.textContent = "Output tok/s (log scale)";
/* frontier: models with no other model both smarter and faster */
const frontier = data.filter(m =>
!data.some(o => o !== m && o.intel >= m.intel && o.speed > m.speed && (o.intel > m.intel || o.speed > m.speed)))
.sort((a, b) => a.intel - b.intel);
if (frontier.length > 1) {
const d = frontier.map((m, i) => (i === 0 ? "M" : "L") + x(m.intel) + " " + y(m.speed)).join(" ");
el("path", { d, class:"frontier" }, svg);
const f0 = frontier[0];
const fl = el("text", { x:x(f0.intel) - 14, y:y(f0.speed) - 8, "text-anchor":"end", class:"frontier-label" }, svg);
fl.textContent = "speed–intelligence frontier";
}
data.forEach(m => {
const cx = x(m.intel), cy = y(m.speed);
const g = el("g", { tabindex:0, role:"img",
"aria-label":`${m.model}: intelligence ${m.intel}, ${fmt.format(m.speed)} tokens per second on ${m.provider}` }, svg);
el("circle", { cx, cy, r:24, class:"hit" }, g);
el("circle", { cx, cy, r:5.5, class: m.kind === "vendor" ? "dot-vendor" : "dot" }, g);
const side = LABEL_SIDE[m.id] || "r";
const lx = side === "l" ? cx - 10 : cx + 10;
const anchor = side === "l" ? "end" : "start";
const lab = el("text", { x:lx, y:cy - 1, "text-anchor":anchor, class:"dot-label" }, g);
lab.textContent = m.model;
const sub = el("text", { x:lx, y:cy + 11, "text-anchor":anchor, class:"dot-sublabel" }, g);
sub.textContent = m.provider.split(" (")[0];
attachTooltip(g, m);
});
host.appendChild(svg);
}
/* ---------- table ---------- */
const COLS = [
{ key:"model", label:"Model", num:false },
{ key:"dev", label:"Developer", num:false },
{ key:"released", label:"Released", num:false },
{ key:"speed", label:"Best tok/s", num:true },
{ key:"kind", label:"Measurement", num:false },
{ key:"fpS", label:"First-party tok/s", num:true },
{ key:"intel", label:"Intelligence", num:true },
{ key:"ttftS", label:"TTFT", num:true },
{ key:"refs", label:"Sources", num:false },
];
function renderTable() {
const head = document.getElementById("table-head");
const body = document.getElementById("table-body");
head.replaceChildren();
body.replaceChildren();
COLS.forEach(c => {
const th = document.createElement("th");
if (c.num) th.className = "num";
th.textContent = c.label + " ";
const arrow = document.createElement("span");
arrow.className = "arrow";
arrow.textContent = state.sortKey === c.key ? (state.sortDir === 1 ? "▲" : "▼") : "";
th.appendChild(arrow);
th.setAttribute("aria-sort", state.sortKey === c.key ? (state.sortDir === 1 ? "ascending" : "descending") : "none");
if (c.key !== "refs") {
th.addEventListener("click", () => {
if (state.sortKey === c.key) state.sortDir *= -1;
else { state.sortKey = c.key; state.sortDir = c.num ? -1 : 1; }
renderTable();
});
} else { th.style.cursor = "default"; }
head.appendChild(th);
});
const data = visibleModels().slice().sort((a, b) => {
const k = state.sortKey;
let va = a[k], vb = b[k];
if (va == null) return 1;
if (vb == null) return -1;
if (typeof va === "string") { va = va.toLowerCase(); vb = String(vb).toLowerCase(); }
return (va < vb ? -1 : va > vb ? 1 : 0) * state.sortDir;
});
data.forEach(m => {
const tr = document.createElement("tr");
const cell = (content, cls) => {
const td = document.createElement("td");
if (cls) td.className = cls;
if (typeof content === "string") td.textContent = content;
else if (content) td.appendChild(content);
tr.appendChild(td);
return td;
};
const modelTd = cell(m.model);
const prov = document.createElement("span");
prov.className = "prov";
prov.textContent = "via " + m.provider;
modelTd.appendChild(prov);
cell(m.dev);
cell(m.released);
cell(fmt.format(m.speed), "num");
if (m.kind === "aa") cell("AA");
else {
const b = document.createElement("span");
b.className = "meas-vendor";
b.textContent = "vendor-claimed";
cell(b);
}
cell(m.fp, "num");
cell(String(m.intel), "num");
cell(m.ttft, "num");
const srcTd = document.createElement("td");
m.refs.forEach((r, i) => {
const a = document.createElement("a");
a.href = "#c" + r;
a.textContent = "[" + r + "]";
srcTd.appendChild(a);
if (i < m.refs.length - 1) srcTd.appendChild(document.createTextNode(" "));
});
tr.appendChild(srcTd);
body.appendChild(tr);
});
}
/* ---------- filters ---------- */
function renderAll() {
const n = visibleModels().length;
document.getElementById("f-count").textContent =
n + " of " + MODELS.length + " model records shown";
renderBars();
renderScatter();
renderTable();
}
document.getElementById("f-records").addEventListener("change", e => {
state.records = e.target.value; renderAll();
});
document.getElementById("f-intel").addEventListener("change", e => {
state.minIntel = Number(e.target.value); renderAll();
});
buildLegend(document.getElementById("bar-legend"));
buildLegend(document.getElementById("scatter-legend"));
renderAll();
</script>
</body>
</html>
name bw-dataviz
description Build stunning black-and-white single-file interactive HTML data reports — KPI tiles, bar charts, scatter plots, sortable tables, tooltips, filters, and numbered citations. Use when asked for a data report, benchmark comparison, leaderboard, research writeup, or any interactive visualization with a monochrome/minimal/editorial aesthetic. Zero dependencies; vanilla JS + hand-built SVG.

bw-dataviz — monochrome interactive data reports

Produces a single self-contained .html file that reads like a well-typeset research brief: black ink on white paper (auto dark mode), thin marks, hairline grids, dense sourcing. example.html in this directory is the reference implementation — a real benchmark report with every pattern below in working code. Copy it as your skeleton; keep its CSS and JS helpers verbatim; replace the data array, prose, and citations.

Deliverable contract

  • ONE .html file. No CDNs, no frameworks, no webfonts, no build step. Works from file://.
  • Grayscale only. Light + dark via CSS variables under prefers-color-scheme.
  • Every numeric claim carries an inline numbered citation linking to a sources list.
  • A sortable table always accompanies the charts (the accessible, tooltip-free twin).
  • A "data gathered " line in the header; caveats stated, not hidden.

Procedure (in order)

  1. Research first, chart last. Collect exact numbers, dates, and source URLs before writing any HTML. Separate independently-measured figures from vendor claims — the design encodes that distinction.
  2. Pick forms by job. Magnitude ranking → horizontal bar. Trade-off between two measures → scatter (never a dual-axis chart). Headline numbers → KPI tile row. Recommendations → short card grid. Everything → the table.
  3. Copy example.html. Keep helpers (el, tooltip module, hatch defs, legend builder, table sort) untouched. Swap: the data array, LABEL_SIDE map, header prose, KPI tiles, figcaptions, recommendation cards, context <details>, sources <ol>.
  4. Verify by rendering. Headless browsers often block file:// — serve with python3 -m http.server and screenshot the full page. Check: zero console errors, no label collisions, tooltips appear on hover AND focus, filters re-render chart(s) and table together. Fix and re-render before delivering.

Design tokens

:root {
  --surface:#ffffff; --ink:#111111;
  --ink-2:#555555;   /* secondary text, 7.4:1 */
  --ink-3:#757575;   /* muted text, 4.6:1 */
  --hairline:#e4e4e4; --wash:#f5f5f5;
  --card:#ffffff; --card-border:#d9d9d9;
}
@media (prefers-color-scheme: dark) {
  :root { --surface:#141414; --ink:#f0f0f0; --ink-2:#b5b5b5; --ink-3:#8f8f8f;
          --hairline:#2c2c2c; --wash:#1d1d1d; --card:#171717; --card-border:#333333; }
}

Typography: system-ui stack everywhere, 15px/1.55 body, 27px h1 with -0.01em tracking. tabular-nums ONLY where digits align vertically (table columns, axis ticks); KPI/hero values use proportional figures. No emojis, no decorative fonts.

Chart rules

  • Bars: ≤24px thick, 4px rounded data-end with a square baseline (rounded rect + small square patch at x0), grow from one baseline. Value label at the tip, always.
  • Grids/axes: solid 1px --hairline, never dashed. Clean round ticks. One axis — never two y-scales. Log scales are fine for wide ranges but must be labeled "(log scale)".
  • The second "series" is a texture, not a second gray. Solid ink fill = measured / verified data; 45° hatch (<pattern> of 2.5px ink lines on surface, plus a 1px ink outline) = vendor-claimed / estimated / preview. Ship a legend whenever both appear.
  • Scatter: dots r≈5.5 filled ink with a 2px surface-color ring (hatched category = surface fill, 2px ink stroke). Every point gets a name label + muted sublabel beside it; precompute label side per point (a LABEL_SIDE map) so labels never collide. Optional dotted Pareto-frontier path (dotted is reserved for thresholds/frontiers — the one dashed exception).
  • Never: a border to separate marks (use surface gaps/rings), a value on every point of a line, clipped labels, fixed container heights that crop the x-axis band.

Interaction contract

  • One reusable tooltip div, position:fixed, inverted colors (--ink bg, --surface text). Content order: big value first, then "Entity — context", then muted metadata lines. Flips sides at viewport edges. Same content on keyboard focus (tabindex="0" + aria-label on every mark group) as on hover. Build all dynamic DOM with textContent — labels are untrusted data.
  • Hit targets ≥24px, always larger than the mark (invisible rect/circle overlay).
  • One filter row above everything it scopes (never inside a chart card); every chart and the table re-render from the same filtered slice; show "N of M shown".
  • Sortable table: click headers to sort, aria-sort + ▲/▼ arrow on the active column, numeric columns right-aligned with tabular-nums, default sort = the headline metric descending.
  • Tooltips enhance, never gate: every tooltip value is also in the table.

Page anatomy (top → bottom)

  1. h1 + one-sentence subtitle (scope + constraint) + muted method note with dates.
  2. KPI tile row: label / big value + unit / muted detail with citation sup.
  3. Filter row (bordered top+bottom, role="group").
  4. Figures: chart div + legend + figcaption that states the takeaway, not the obvious.
  5. Optional recommendation cards ("Where to get it" pattern): h3 scenario / bold pick / cited rationale.
  6. Full table in a scrollable bordered wrap + footnote paragraph defining terms.
  7. <details> for honest context (excluded data and why).
  8. <h2 id="cites">Sources</h2> + <ol class="cites"> with id="c1"…; inline refs are <sup><a href="#c1">[1]</a></sup> throughout the page.

Integrity rules

  • Distinguish measured vs claimed in every view: hatch in charts, a bordered "vendor-claimed" badge in the table, a plain-language line in the tooltip.
  • Absolute dates only ("May 6, 2026", never "recently"). State the access date and that live sources drift.
  • Data that doesn't qualify for the main ranking goes into the context section with the reason — never silently dropped, never mixed in.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment