SEO·AEO for builders

SEO · AEO · Marketing automation

Make software that does SEO & AEO.

For developers who'd rather encode the mechanism than memorize the best practice.

Two pipelines decide whether anyone finds your content. This course teaches both deep enough to build tooling against them — and every lesson hands you a runnable script that does exactly that.

Classic search — SEO
crawl → index → rank → serve. A bot fetches, an index stores, a ranker orders the ten blue links. Measured by a first-party API.
AI answer engines — AEO / GEO
retrieve → generate → cite. An engine pulls passages, writes one answer, and links its sources. The win is being cited.

The lessons

Lesson 0001 The Two Pipelines Classic search (crawl → index → rank) vs AI answer engines (retrieve → generate → cite). The mental model the whole course hangs on. Lesson 0002 Crawlable ≠ Indexable The two gates a page passes before it can ever rank — and why one is robots.txt and the other is noindex/title/canonical. ▸ crawl_audit.py Lesson 0003 Structured Data JSON-LD that earns rich results and feeds machines your facts. Required vs recommended properties, validated. ▸ schema_tool.py Lesson 0004 Writing for Retrieval Answer-first, self-contained chunks an engine can lift verbatim — the inverted pyramid as an AEO tactic. ▸ geo_lint.py Lesson 0005 Measuring It Two scoreboards: Search Console gives ground truth via API; AI citations have none, so you build the proxy everyone builds. ▸ citation_share.py · build_prompts.py Lesson 0006 The JS-Rendering Gap Google's deferred two-wave render, and why your urllib crawler — and most AI crawlers — only ever see the raw, pre-JS HTML. ▸ render_gap.py Lesson 0007 Sitemaps + IndexNow Passive discovery (a sitemap every engine pulls) vs active push (IndexNow — instant, shared, and ignored by Google). ▸ sitemap_ping.py Lesson 0008 E-E-A-T Experience, Expertise, Authoritativeness, Trust. Not a score, not a ranking factor — so audit the machine-detectable mix instead. ▸ eeat_audit.py Lesson 0009 The Site Audit Walk a whole site BFS-style from a seed, run the crawl/index/retrieve gates from 0002–0008 on every page, and roll the findings into one prioritized report. ▸ site_audit.py

How it's built

This site practices what it teaches. It's a server-rendered Astro site (content in the first byte — Lesson 0006), it emits a sitemap.xml at build (Lesson 0007), and each page carries canonical, Open Graph, and JSON-LD (Lesson 0003, 0008). Every claim in the lessons is grounded in a primary source, never memory.