SEOΒ·AEO for builders

The toolkit Β· 9 scripts

Tools

Stdlib-only Python, no pip install. Each has an offline --demo self-check and a docstring with usage. The lesson teaches the why; the tool is the how.

All live in tools/ in the repo. Each splits a network/UI edge from an offline, testable core β€” so the logic is verifiable without hitting the wire.

crawl_audit.py from Lesson 0002 β†’

Is a URL crawlable AND indexable? Checks robots.txt, status, noindex, title, canonical β€” the two gates before ranking.

$ python3 tools/crawl_audit.py https://example.com/page
schema_tool.py from Lesson 0003 β†’

JSON-LD structured-data linter. Validates required vs recommended schema.org properties, and lints the JSON-LD on a live page.

$ python3 tools/schema_tool.py --demo
geo_lint.py from Lesson 0004 β†’

GEO / writing-for-retrieval linter. Flags buried answers and non-self-contained chunks; rewards answer-first prose.

$ python3 tools/geo_lint.py --demo
citation_share.py from Lesson 0005 β†’

Measures AI-citation coverage and share of voice from a set of answer-engine responses β€” the proxy every AEO tracker builds.

$ python3 tools/citation_share.py --demo
build_prompts.py from Lesson 0005 β†’

Assembles a buyer-question prompt library (from an LLM fan-out or Search Console rows) in the shape citation_share.py consumes.

$ python3 tools/build_prompts.py --demo
render_gap.py from Lesson 0006 β†’

Diffs raw HTML vs the rendered DOM and flags content/links/JSON-LD that exist only after JavaScript β€” what no-JS bots miss.

$ python3 tools/render_gap.py --demo
sitemap_ping.py from Lesson 0007 β†’

Generates + validates a spec-compliant sitemap.xml, and builds a verified IndexNow push payload. The publish-and-notify step.

$ python3 tools/sitemap_ping.py --demo
eeat_audit.py from Lesson 0008 β†’

Audits a page for the machine-detectable E-E-A-T proxy signals (author, sameAs, dates, publisher, sourcing). Not a score β€” a gap-finder.

$ python3 tools/eeat_audit.py --demo
site_audit.py from Lesson 0009 β†’

The capstone: crawls a whole site BFS from a seed and runs every gate from 0002–0008 on each page, then rolls findings into one prioritized report (a check failing site-wide = a template bug).

$ python3 tools/site_audit.py --demo