Skip to content

chore(seo): SEO + AI-SEO audit — schema enrichment, stale data, AI Overview triggers#50

Merged
johnnichev merged 1 commit intomainfrom
chore/seo-audit-fixes
Apr 7, 2026
Merged

chore(seo): SEO + AI-SEO audit — schema enrichment, stale data, AI Overview triggers#50
johnnichev merged 1 commit intomainfrom
chore/seo-audit-fixes

Conversation

@johnnichev
Copy link
Copy Markdown
Owner

Summary

Two-track audit and fix pass: traditional SEO and AI-SEO (AEO/GEO/LLMO). The landing page already had a strong foundation; this PR ships the high-impact items: stale data, missing schema properties, and additions targeting AI Overview triggers.

Verified outcome

After this PR, the landing page has:

  • 4 valid JSON-LD schemas: SoftwareApplication (28 props), Organization, HowTo, FAQPage (13 questions)
  • Clean heading hierarchy: 1 H1, 13 H2s
  • Canonical: https://selectools.dev/
  • OG image: PNG, 1200x630, with type/dimensions/alt
  • Robots meta: `index, follow, max-snippet:-1, max-image-preview:large`

All verified via Playwright querying `document.querySelectorAll('script[type="application/ld+json"]')`.

Stale data fixed

  • `docs/llms.txt`: 3344 tests → 4612 tests at 95% coverage
  • `docs/llms.txt`: 76 examples → 88 examples
  • `docs/llms.txt`: em-dash on line 5 → period (consistent with PR chore: clarify landing copy + extract design system #48 clarify rule)
  • `docs/llms.txt`: em-dashes in code comments → `->` arrows
  • `SoftwareApplication.featureList`: 24 pre-built tools → 33 across 9 categories
  • All featureList entries now have specific numbers

SoftwareApplication schema enrichment

Added: applicationSubCategory, softwareRequirements, installUrl, datePublished, dateModified, inLanguage, isAccessibleForFree, publisher, maintainer (Person with email + GitHub URL), image, screenshot, offers.availability, offers.url, keywords.

New: Organization schema

NichevLabs Organization JSON-LD with logo, founder, sameAs links to GitHub and PyPI. Establishes entity identity in Google's knowledge graph.

New: HowTo schema (AI Overview trigger)

3-step HowTo: install Selectools and run your first AI agent. Each step has position, name, text, and url. AI Overviews and Google rich results frequently elevate HowTo schemas for "how to..." queries.

FAQPage schema: 9 questions to 13

Added 4 questions targeting AI Overview triggers:

  1. Is Selectools free?
  2. How does Selectools compare to CrewAI?
  3. How does Selectools compare to AutoGen?
  4. What is the difference between Selectools and LangGraph?

Docs SEO

  • `docs/index.md`: added frontmatter description (was missing)
  • `docs/CLAUDE.md`: added `search.exclude: true` frontmatter (excludes from MkDocs search; full sitemap exclusion deferred — needs mkdocs-exclude plugin)
  • `mkdocs.yml`: added CLAUDE.md and RELEASE_GUIDE.md to `not_in_nav`

Deferred (out of scope)

  • CLAUDE.md sitemap exclusion (needs `mkdocs-exclude` plugin or file relocation)
  • GitHub repo social preview upload (manual)
  • Bing/Google Search Console verification meta tags
  • Per-module-page schema (`TechArticle` / `APIReference`)
  • `aggregateRating` (needs real review/star data source)

Test plan

  • All 4 JSON-LD schemas parse without errors
  • H1 count = 1, H2 count = 13
  • Canonical URL correct
  • OG image PNG
  • No em-dashes in user-facing copy on landing or llms.txt
  • For reviewer: validate live URL with Google Rich Results Test after merge

… + AI Overview triggers

Comprehensive SEO and AI-SEO pass against the landing page and docs.
Verified with Playwright: 4 valid JSON-LD schemas (SoftwareApplication
with 28 props, Organization, HowTo, FAQPage with 13 questions),
1 H1, 13 H2s, canonical correct, OG image PNG referenced.

## Stale data fixes (high impact for AI search citations)

- llms.txt: "3344 tests" → "4612 tests at 95% coverage"
- llms.txt: "76 examples" → "88 examples"
- llms.txt: dropped em-dash on line 5 (consistent with the clarify
  rule from PR #48)
- llms.txt: replaced em-dashes inside the code-comment block with
  -> arrows (still legible, no AI-tell)
- SoftwareApplication.featureList: "24 pre-built tools" → "33 across
  9 categories"
- SoftwareApplication.featureList: every entry expanded with
  specific numbers (15 guardrails, 8 builder nodes, 7 templates,
  4612 tests, 95% coverage)

## SoftwareApplication schema enrichment

Added properties that AI crawlers and Google rich results reward:
- applicationSubCategory: "AI Agent Framework"
- softwareRequirements: explicit Python version list
- installUrl
- datePublished + dateModified (freshness signal)
- inLanguage
- isAccessibleForFree: true
- publisher (NichevLabs)
- maintainer (Person with email + GitHub URL)
- image + screenshot (both point to og-image.png)
- offers.availability + offers.url
- keywords (broader than the meta keywords)

## New: Organization schema

NichevLabs Organization JSON-LD with logo, founder, sameAs links to
GitHub and PyPI. Helps establish entity identity in Google's
knowledge graph and gives AI crawlers a clean entity to cite.

## New: HowTo schema (AI Overview trigger)

How-to JSON-LD for "install Selectools and run your first AI agent
in Python" with 3 explicit steps (install, create file, run). Each
step has position, name, text, and url linking to the Quickstart
section. AI Overviews and Google rich results frequently elevate
HowTo schemas for "how to..." queries.

## FAQPage schema additions (5 → 13 questions)

Added 4 new questions targeting common AI Overview triggers that the
existing 9 didn't cover:
- "Is Selectools free?" — direct yes/no AI Overview hit
- "How does Selectools compare to CrewAI?"
- "How does Selectools compare to AutoGen?"
- "What is the difference between Selectools and LangGraph?"

These match the literal phrasings users type into ChatGPT, Perplexity,
and Google AI Overview when researching agent frameworks.

## docs/index.md: meta description

Added a frontmatter `description:` field so MkDocs Material renders
a per-page meta description tag on the docs landing page (was missing).

## docs/CLAUDE.md: search exclusion (partial)

Added MkDocs frontmatter `search.exclude: true` to keep the internal
agent-instruction file out of the docs search index. NOTE: this does
NOT remove it from the sitemap.xml — full sitemap exclusion requires
either the `mkdocs-exclude` plugin (out of scope for this PR) or
moving docs/CLAUDE.md outside the docs/ directory entirely. The
search exclusion is the 80% fix.

## mkdocs.yml: not_in_nav

Added CLAUDE.md and RELEASE_GUIDE.md to the not_in_nav list so the
build no longer warns about them being in docs/ but not in the nav.
@johnnichev johnnichev merged commit ce08a5f into main Apr 7, 2026
6 checks passed
@johnnichev johnnichev deleted the chore/seo-audit-fixes branch April 7, 2026 15:01
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