Skip to content

Commit fed921a

Browse files
feat(seo): comprehensive SEO, social sharing, and LLM discoverability (#1060)
* feat(seo): comprehensive SEO, social sharing, and LLM discoverability optimization Add OpenGraph + Twitter Cards via sphinxext-opengraph with per-page auto-generated social preview cards. Add JSON-LD structured data (SoftwareApplication, DataCatalog, Dataset, BreadcrumbList) to layout.html. Create robots.txt with AI crawler rules (GPTBot, ClaudeBot, PerplexityBot, Google-Extended). Add meta descriptions to 7 key pages. Create llms.txt and llms-full.txt for AI agent discoverability. Expand PyPI metadata with 18 keywords, 16 classifiers, and 8 project URLs. Generate OG social card image (1200x630). Configure sitemap_excludes and html_title for cleaner search results. Add sphinxext-opengraph to docs dependencies. * fix(seo): redesign OG social card with proper MOABB brand identity Replace generic card with brand-aligned design using the actual MOABB palette (navy, teal, sky blue), signature three-mountain curves as visual motif, brain logo, paradigm tag chips, stat highlights, and a clean footer with URL, pip install command, and DOI. * fix(seo): redesign OG card with data visualization and updated stats Replace card with editorial-scientific design featuring: - Paradigm distribution horizontal bar chart (P300:69, MI:62, SSVEP:16, c-VEP:8, RS:3) with colorblind-safe palette - Updated stats: 158 datasets, 3.5K subjects, 9.1K sessions - Evaluation strategies section - Decorative EEG waveform traces - MOABB brand logo and palette - Clean footer with URL, pip, Python version, license, DOI * fix(seo): redesign OG card with MOABB bubble plot and updated stats Replace card with data-driven design featuring: - Packed-circle visualization of all 158 datasets colored by paradigm (blue=MI, coral=P300, green=SSVEP, mauve=c-VEP), circle area proportional to subject count — the signature MOABB visual - Updated stats: 158 datasets, 3,513 subjects - Light background for contrast on social feeds - Clean left panel: logo, title, subtitle, stats, color legend - Readable at thumbnail size (600x315): title + stats + data clusters all clearly visible * fix(seo): redesign OG card with MOABB bubble plot and updated stats Replace PIL-generated card with HTML-rendered design using headless Chrome at 2x retina resolution for crisp typography. Split-panel layout with navy gradient left panel (clip-path diagonal, mountain motif overlay), teal accent stripe, and light right panel featuring: - Headline: "158 open EEG datasets for reproducible BCI benchmarking" - Syntax-highlighted code snippet showing the real MOABB API - Stats row: 158 datasets, 3,513 subjects, 9.1k sessions - Paradigm pills (Motor Imagery, P300/ERP, SSVEP, c-VEP) with per-paradigm colors, plus tool pills (MNE-Python, scikit-learn) - DOI and URL footer Typography: JetBrains Mono (code/stats) + Source Serif 4 (headlines) matching the documentation font system. Generator HTML kept at docs/source/_static/social_card_gen.html for re-rendering when stats change. * fix(seo): allow crawlers to access _static/ for OG image and CSS Remove Disallow for /docs/_static/ in robots.txt. Blocking it prevented Googlebot and social preview crawlers from fetching the OG card image and stylesheets, suppressing rich link previews — directly undermining the social sharing features added in this PR. Addresses review comment on robots.txt:17. * feat(seo): add Google Search Console verification file Add google07a8f2e31a591297.html to html_extra_path so it deploys at the docs root for domain ownership verification in Google Search Console. * fix(docs): update dataset and subject counts across all pages Update outdated "67+ datasets, 1735+ subjects" to the current "158 datasets, 3500+ subjects" in homepage hero, conf.py OG/carousel, index.rst meta description, dataset_summary.rst meta description, llms.txt, and llms-full.txt. * fix(seo): update OG card with full logo, Speech Imagery, and Resting State - Use full MOABB logo (mountains + brain + wordmark) instead of icon-only - Add Speech Imagery and Resting State paradigm pills - Verified example code snippet imports work correctly * fix(seo): fix OG card logo rendering and missing footer bar - Use moabb_notext.svg (no background rect) + HTML wordmark instead of moabb_logo.svg which had a white rect that broke the invert filter - Fix footer bar not rendering: switch from position:absolute to position:fixed for reliable anchoring in headless Chrome - Footer now shows: moabb.neurotechx.com, pip install moabb, DOI - BSD-3-Clause label visible on left panel above footer * fix(seo): fix logo rendering - show full brain+mountain detail Remove CSS filter (brightness(0) invert(1)) that was flattening the logo into a featureless white silhouette. The original SVG colors (light blue, teal, dark slate mountains + white brain circuits) render correctly on the dark navy panel without any filter. Also increase logo size from 120px to 160px for better visibility. * fix(seo): bigger logo, matching wordmark, simpler code snippet - Logo icon: 160px → 220px - Wordmark: 58px → 72px to match logo proportions - Code snippet simplified to 3-line working example: paradigm, evaluation, results = process(pipelines) * fix(seo): enlarge logo, remove flat base rectangle - Logo enlarged to 340px (fills left panel), wordmark 86px - Cropped flat colored base from mountain SVG (the rectangular block at the bottom) — now shows only the mountain peaks + brain icon - Logo embedded as data URI PNG to avoid SVG rendering issues * fix(seo): remove hidden BSD-3 license label from OG card * fix(seo): add CITE IF YOU USE label next to DOI in footer * fix(ci): exclude social_card_gen.html from codespell (base64 false positive)
1 parent 0d88362 commit fed921a

18 files changed

Lines changed: 1181 additions & 7 deletions

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ repos:
5050
- --skip="./.*,*.csv,*.json,*.ambr"
5151
- --quiet-level=2
5252
exclude_types: [ csv, json, svg, pdf ]
53-
exclude: ^tests/|generated/
53+
exclude: ^tests/|generated/|social_card_gen\.html$
5454

5555
- repo: https://github.com/adrienverge/yamllint.git
5656
rev: v1.38.0
247 KB
Loading

docs/source/_static/social_card_gen.html

Lines changed: 316 additions & 0 deletions
Large diffs are not rendered by default.

docs/source/_templates/homepage.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
</p>
1818

1919
<ul class="moabb-hero-highlights mb-4">
20-
<li><strong>67+ open EEG datasets, with 1735+ subjects</strong> (Motor Imagery, P300, SSVEP, and more)</li>
20+
<li><strong>158 open EEG datasets, with 3500+ subjects</strong> (Motor Imagery, P300, SSVEP, c-VEP, and more)</li>
2121
<li><strong>Fair evaluations</strong> (within-session, cross-session, cross-subject)</li>
2222
<li><strong>Built on MNE + scikit-learn</strong> for flexible pipelines</li>
2323
</ul>

docs/source/_templates/layout.html

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,104 @@
22

33
{% block extrahead %}
44
<link rel="canonical" href="https://moabb.neurotechx.com/docs/{{ pagename }}.html" />
5+
6+
{# --- JSON-LD Structured Data --- #}
7+
{% if pagename == 'index' %}
8+
<script type="application/ld+json">
9+
{
10+
"@context": "https://schema.org",
11+
"@type": "SoftwareApplication",
12+
"name": "MOABB",
13+
"alternateName": "Mother of all BCI Benchmarks",
14+
"description": "Open-source Python package for reproducible EEG-based BCI benchmarking. Compare pipelines across 67+ datasets, multiple paradigms, and standardized evaluation strategies.",
15+
"url": "https://moabb.neurotechx.com/docs/",
16+
"applicationCategory": "Scientific Software",
17+
"operatingSystem": "Cross-platform",
18+
"programmingLanguage": "Python",
19+
"license": "https://opensource.org/licenses/BSD-3-Clause",
20+
"offers": {
21+
"@type": "Offer",
22+
"price": "0",
23+
"priceCurrency": "USD"
24+
},
25+
"author": {
26+
"@type": "Organization",
27+
"name": "NeuroTechX",
28+
"url": "https://neurotechx.com"
29+
},
30+
"codeRepository": "https://github.com/NeuroTechX/moabb",
31+
"citation": {
32+
"@type": "ScholarlyArticle",
33+
"name": "The largest EEG-based BCI reproducibility study for open science: the MOABB benchmark",
34+
"identifier": "10.5281/zenodo.10034223"
35+
},
36+
"softwareVersion": "{{ version }}",
37+
"keywords": ["EEG", "BCI", "brain-computer interface", "benchmark", "motor imagery", "P300", "SSVEP", "neuroscience", "reproducibility", "open science"]
38+
}
39+
</script>
40+
{% elif pagename == 'dataset_summary' %}
41+
<script type="application/ld+json">
42+
{
43+
"@context": "https://schema.org",
44+
"@type": "DataCatalog",
45+
"name": "MOABB Dataset Catalog",
46+
"description": "Catalog of 67+ open EEG datasets for BCI research, covering Motor Imagery, P300, SSVEP, c-VEP, and Resting State paradigms.",
47+
"url": "https://moabb.neurotechx.com/docs/dataset_summary.html",
48+
"provider": {
49+
"@type": "Organization",
50+
"name": "NeuroTechX",
51+
"url": "https://neurotechx.com"
52+
},
53+
"keywords": ["EEG datasets", "BCI datasets", "open data", "motor imagery", "P300", "SSVEP"]
54+
}
55+
</script>
56+
{% elif pagename.startswith('generated/moabb.datasets.') %}
57+
<script type="application/ld+json">
58+
{
59+
"@context": "https://schema.org",
60+
"@type": "Dataset",
61+
"name": "{{ title | replace('moabb.datasets.', '') }}",
62+
"description": "EEG dataset for brain-computer interface research, part of the MOABB benchmark suite.",
63+
"url": "https://moabb.neurotechx.com/docs/{{ pagename }}.html",
64+
"license": "https://opensource.org/licenses/BSD-3-Clause",
65+
"isPartOf": {
66+
"@type": "DataCatalog",
67+
"name": "MOABB Dataset Catalog",
68+
"url": "https://moabb.neurotechx.com/docs/dataset_summary.html"
69+
},
70+
"creator": {
71+
"@type": "Organization",
72+
"name": "NeuroTechX",
73+
"url": "https://neurotechx.com"
74+
}
75+
}
76+
</script>
77+
{% endif %}
78+
79+
{# BreadcrumbList for all non-homepage pages #}
80+
{% if pagename != 'index' %}
81+
<script type="application/ld+json">
82+
{
83+
"@context": "https://schema.org",
84+
"@type": "BreadcrumbList",
85+
"itemListElement": [
86+
{
87+
"@type": "ListItem",
88+
"position": 1,
89+
"name": "MOABB",
90+
"item": "https://moabb.neurotechx.com/docs/"
91+
},
92+
{
93+
"@type": "ListItem",
94+
"position": 2,
95+
"name": "{{ title }}",
96+
"item": "https://moabb.neurotechx.com/docs/{{ pagename }}.html"
97+
}
98+
]
99+
}
100+
</script>
101+
{% endif %}
102+
5103
{{ super() }}
6104
{% endblock %}
7105

docs/source/api.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
.. meta::
2+
:description: MOABB API reference - Datasets, Paradigms, Evaluations, Pipelines, and analysis tools for EEG-based BCI benchmarking in Python.
3+
:keywords: MOABB API, BCI Python API, EEG analysis, motor imagery paradigm, P300 paradigm, cross-session evaluation
4+
15
=====================
26
API and Main Concepts
37
=====================

docs/source/cite.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
.. meta::
2+
:description: How to cite MOABB in academic publications. BibTeX entries for the MOABB software (Zenodo DOI 10.5281/zenodo.10034223) and the MOABB benchmark paper.
3+
:keywords: cite MOABB, MOABB BibTeX, MOABB DOI, BCI benchmark citation, MOABB paper
4+
15
Citing MOABB and related publications
26
============================================
37

docs/source/conf.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
# The full version, including alpha/beta/rc tags
5151
release = f"{moabb.__version__}-dev"
5252

53+
# Control the page title suffix in <title> tags for SEO
54+
html_title = "MOABB Documentation"
55+
html_short_title = "MOABB"
56+
5357

5458
# -- General configuration ---------------------------------------------------
5559

@@ -85,6 +89,7 @@
8589
"sphinx_favicon",
8690
"sphinxcontrib.jquery",
8791
"sphinx_sitemap",
92+
"sphinxext.opengraph",
8893
]
8994

9095
_build_sitemap = os.environ.get("MOABB_BUILD_SITEMAP", "1").strip().lower()
@@ -315,6 +320,39 @@ def linkcode_resolve(domain, info): # noqa: C901
315320

316321
# Sitemap configuration
317322
sitemap_url_scheme = "{link}"
323+
sitemap_excludes = [
324+
"genindex",
325+
"py-modindex",
326+
"search",
327+
"auto_examples/*/sg_execution_times",
328+
"auto_examples/sg_execution_times",
329+
]
330+
331+
# -- OpenGraph / social sharing meta tags (sphinxext-opengraph) -----------
332+
ogp_site_url = "https://moabb.neurotechx.com/docs/"
333+
ogp_site_name = "MOABB - Mother of all BCI Benchmarks"
334+
ogp_image = "https://moabb.neurotechx.com/docs/_static/moabb_og_card.png"
335+
ogp_image_alt = (
336+
"MOABB - Mother of all BCI Benchmarks: "
337+
"158 open EEG datasets for reproducible BCI research"
338+
)
339+
ogp_description_length = 200
340+
ogp_type = "website"
341+
ogp_custom_meta_tags = [
342+
'<meta name="twitter:card" content="summary_large_image" />',
343+
'<meta name="twitter:site" content="@NeuroTechX" />',
344+
]
345+
346+
# Auto-generate unique social preview cards per page (uses matplotlib).
347+
# Each page gets its own card with the page title, site name, and description.
348+
# The static moabb_og_card.png is the fallback for pages without auto-generated cards.
349+
ogp_social_cards = {
350+
"image": "_static/moabb_logo.png",
351+
"line_color": "#4a90d9",
352+
}
353+
354+
# Extra files to copy to build output root (robots.txt, llms.txt, etc.)
355+
html_extra_path = ["robots.txt", "llms.txt", "llms-full.txt", "google07a8f2e31a591297.html"]
318356

319357
html_css_files = [
320358
"css/custom.css",
@@ -385,7 +423,7 @@ def linkcode_resolve(domain, info): # noqa: C901
385423
"carousel": [
386424
dict(
387425
title="Datasets",
388-
text="Access 67+ open EEG datasets for motor imagery, P300, and SSVEP paradigms.",
426+
text="Access 158 open EEG datasets for motor imagery, P300, SSVEP, and c-VEP paradigms.",
389427
url="dataset_summary.html",
390428
img="datasets_overview.png",
391429
alt="Datasets overview",

docs/source/dataset_summary.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
.. meta::
2+
:description: Browse 158 open EEG datasets for BCI research in MOABB. Filter by paradigm (Motor Imagery, P300, SSVEP, c-VEP), subject count, channels, and license. Interactive table with CSV export.
3+
:keywords: EEG datasets, BCI datasets, motor imagery dataset, P300 dataset, SSVEP dataset, open EEG data, brain-computer interface data
4+
15
.. _data_summary:
26

37
.. automodule:: moabb.datasets
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
google-site-verification: google07a8f2e31a591297.html

0 commit comments

Comments
 (0)