Skip to content

seo: purge thin compare pages + benchmark-first title on products & compare (#908) - #909

Merged
Flotapponnier merged 1 commit into
mainfrom
cherry/seo-foundations-main
Jul 5, 2026
Merged

seo: purge thin compare pages + benchmark-first title on products & compare (#908)#909
Flotapponnier merged 1 commit into
mainfrom
cherry/seo-foundations-main

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Cherry-pick of #908 (already merged and validated on staging).

Summary

Bing WMT audit 2026-07-05 showed only 2 of 5093 sitemap URLs indexed. Root cause: 4938 ad-hoc /compare/* pages emitted at ≥1 shared bench threshold produced near-duplicate templates.

Changes

  • Sitemap hybrid threshold (sitemap.ts + new brand-whitelist.ts): brand pairs ≥1, others ≥3. Preserves helius-vs-mobula, alchemy-vs-moralis, chain-vs-chain, perp-vs-perp.
  • Curated pair fix: remove jupiter-vs-raydium (raydium has 0 bench appearances).
  • Product page SEO: title {Provider} Benchmark {year}, meta As of DATE, data-driven prose above the fold.
  • Compare page SEO: title {a} vs {b} Benchmark {year}, meta unique per pair, data-driven prose showing winner per bench.
  • ESLint config: exclude standalone sub-apps (infrastructure/**, worker/**) from main frontend lint pass.

Staging validation (dev.openchainbench.com)

  • Sitemap: 4865 → 177/compare/* URLs (target ≈250, better)
  • /products/moralis title: Moralis Benchmark 2026 — Live Performance Data · OpenChainBench
  • /products/moralis prose: "Moralis is measured across 2 live OpenChainBench benchmarks, with 1 drop journal framing #1 finish: Best NFT collection metadata (ranks drop journal framing #1, 97.1% p50)…" ✓
  • /compare/codex-vs-mobula title: Codex vs Mobula Benchmark 2026 · OpenChainBench
  • /compare/codex-vs-mobula prose: "Codex leads on 1 of 4 shared benchmarks, Mobula on 3. Codex wins on Crypto data API with most blockchains supported (121 vs 79). Mobula wins on Fastest crypto price API (0.6 s vs 1.0 s)…" ✓

…ompare (#908)
* seo: purge thin compare pages + benchmark-first title on products & compare
Bing WMT audit 2026-07-05: only 2 of 5093 sitemap URLs indexed. Root
cause: 4938 ad-hoc /compare/ pages emitted at ≥1 shared bench threshold,
producing near-duplicate templates that starved crawl budget and hurt
domain trust.
Changes:
- sitemap: hybrid threshold. Brand-whitelist pairs emit at ≥1 shared,
others at ≥3. Drops from 4938 → ~226 ad-hoc + 21 curated = ~247 URLs.
Preserves every commercial X vs Y pair users actually search for
(helius-vs-mobula, alchemy-vs-moralis, chain-vs-chain, perp-vs-perp).
- compare-pairs: remove jupiter-vs-raydium (raydium has 0 bench
appearances so /compare/jupiter-vs-raydium 404s at render).
- products/[slug]: title now leads with 'Benchmark {year}' + head-term
match on '<provider> benchmark' queries. Meta description ends with
'As of YYYY-MM-DD' for LLM citation extractability (LLM-mediated
discovery drives ~80% of Bing query traffic).
- compare/[slug]: title now leads with '{a} vs {b} Benchmark {year}'.
Meta description is unique per pair (shared bench count + date)
killing the identical duplicate signal that had Bing skipping pages.
* seo: prose summary above the fold on /compare + /products
Replaces the identical templated intro paragraph on both pages with
a data-driven prose summary derived from live measurements. Kills the
last piece of duplicate above-the-fold text so Bing sees genuinely
unique substantive content per URL.
/compare/[slug]:
Before: 'Side by side OpenChainBench measurements. Identical layout,
no editorial verdict...' (same on 247 pages)
After: 'Codex leads on 2 of 4 shared benchmarks, Mobula on 2. Codex
wins on aggregator-head-lag (128ms vs 195ms), wallet-labels-
coverage (42.8% vs 38.1%). Mobula wins on metadata-coverage
(96.9% vs 89.1%), network-coverage (80 vs 42 chains).'
/products/[slug]:
Before: 'Moralis performance benchmarks, live across 2 categories.
Reproducible measurements, open methodology.' (same on 104 pages)
After: 'Moralis is measured across 2 live OpenChainBench benchmarks,
with 1 #1 finish: NFT collection metadata (ranks #1, 96.9% p50),
Wallet labels coverage (ranks #2 of 5, 42.4% p50).'
Falls back to a neutral sentence when the provider's p50 data is
missing (cold ISR, harness restart) so cold pages don't render a lie.
* chore(lint): exclude standalone sub-apps from main frontend lint
infrastructure/monitoring-ui and infrastructure/prom-admin are
independently deployed Next.js apps (own package.json + Railway
config, own build/lint/typecheck pipeline). Scanning them from the
main frontend's lint pass caused every unrelated PR to fail on their
pre-existing warnings that the sub-app maintainers can fix in their
own dedicated PRs.
worker/ is the materialize worker (own package.json + Railway config),
same reasoning.
Unblocks PR #908 (SEO purge) and any subsequent PR touching only
src/*.
---------
Co-authored-by: Florent Tapponnier <contact@mobula.io>
@Flotapponnier
Flotapponnier merged commit ed3115f into mainJul 5, 2026
1 check passed
@Flotapponnier
Flotapponnier deleted the cherry/seo-foundations-main branch July 17, 2026 14:41
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@Flotapponnier