Skip to content

feat(seo): comprehensive SEO, social sharing, and LLM discoverability#1060

Merged
bruAristimunha merged 16 commits intodevelopfrom
seo/comprehensive-optimization
Apr 16, 2026
Merged

feat(seo): comprehensive SEO, social sharing, and LLM discoverability#1060
bruAristimunha merged 16 commits intodevelopfrom
seo/comprehensive-optimization

Conversation

@bruAristimunha
Copy link
Copy Markdown
Collaborator

Summary

Comprehensive SEO optimization for the MOABB documentation site and PyPI package listing:

  • Open Graph + Twitter Cards: Enable sphinxext-opengraph for automatic social preview metadata on all 580+ pages, with per-page auto-generated social cards and a custom 1200x630 OG fallback image
  • JSON-LD structured data: SoftwareApplication (homepage), DataCatalog (dataset summary), Dataset (all 67+ dataset pages), and BreadcrumbList (all non-homepage pages) for rich search snippets
  • robots.txt: Crawl rules with sitemap reference, explicit AI crawler permissions (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, ChatGPT-User), and disallow for duplicate/thin content pages
  • llms.txt + llms-full.txt: LLM-friendly documentation following the llms.txt standard — teaches AI agents how to use MOABB with mental model, decision tables, API signatures, complete working examples, and common mistakes
  • Meta descriptions: Added .. meta:: directives with SEO descriptions and keywords to 7 key landing pages (homepage, dataset catalog, API, install, cite, benchmark results, changelog)
  • PyPI metadata: Expanded keywords (5 → 18), classifiers (7 → 16), project URLs (3 → 8 including Bug Tracker, Changelog, Dataset Catalog, Benchmark Results, Cite)
  • Sitemap cleanup: Exclude auto-generated index pages (genindex, py-modindex, search, sg_execution_times) via sitemap_excludes
  • Title tags: Set html_title for shorter, cleaner page titles in search results

Files changed

File Change
docs/source/conf.py +sphinxext.opengraph, +OGP config, +ogp_social_cards, +html_title, +sitemap_excludes, +html_extra_path
docs/source/_templates/layout.html +JSON-LD structured data (4 schema types)
docs/source/robots.txt New — crawl rules + AI crawler permissions
docs/source/llms.txt New — compact LLM-friendly guide (~7KB)
docs/source/llms-full.txt New — comprehensive LLM guide with full API (~18KB)
docs/source/_static/moabb_og_card.png New — 1200x630 social sharing image
docs/source/index.rst +meta description + keywords
docs/source/dataset_summary.rst +meta description + keywords
docs/source/api.rst +meta description + keywords
docs/source/cite.rst +meta description + keywords
docs/source/paper_results.rst +meta description + keywords
docs/source/install/install.rst +meta description + keywords
docs/source/whats_new.rst +meta description + keywords
pyproject.toml +13 keywords, +9 classifiers, +5 URLs, +sphinxext-opengraph dep

Post-merge actions (manual)

After deploying, maintainers should:

  1. Enable HTTPS enforcement on NeuroTechX/moabb.github.io repo (Settings > Pages > Enforce HTTPS) — currently http:// does not redirect to https://
  2. Register in Google Search Console at https://search.google.com/search-console — submit sitemap.xml and request indexing for key pages
  3. Import to Bing Webmaster Tools at https://www.bing.com/webmasters — one-click import from Google Search Console (covers DuckDuckGo, Yahoo, Ecosia)

Test plan

  • docs CI builds successfully with new sphinxext.opengraph extension
  • Built HTML contains og:title, og:description, og:image meta tags (inspect page source)
  • Built HTML contains JSON-LD <script type="application/ld+json"> blocks on homepage, dataset_summary, and dataset pages
  • robots.txt is accessible at build output root (not under _static/)
  • llms.txt and llms-full.txt are accessible at build output root
  • Sitemap no longer includes genindex.html, py-modindex.html, search.html
  • Page <title> tags show "Page — MOABB Documentation" instead of "Page — moabb 1.5.0dev0-dev documentation"
  • Social card image renders correctly when sharing a docs link on Slack/Twitter/LinkedIn

… 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.
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.
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 11103d448b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread docs/source/robots.txt Outdated
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
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
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.
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.
Add google07a8f2e31a591297.html to html_extra_path so it deploys at
the docs root for domain ownership verification in Google Search
Console.
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.
…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
- 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
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.
- Logo icon: 160px → 220px
- Wordmark: 58px → 72px to match logo proportions
- Code snippet simplified to 3-line working example:
  paradigm, evaluation, results = process(pipelines)
- 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
@bruAristimunha bruAristimunha merged commit fed921a into develop Apr 16, 2026
5 checks passed
@bruAristimunha bruAristimunha deleted the seo/comprehensive-optimization branch April 16, 2026 11:20
Sign up for free to 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