How This Site Is Optimized for Generative Engines (GEO)

TL;DR: This site treats language models as first-class readers. It serves llms.txt and llms-full.txt, a fully linked schema.org JSON-LD graph (Person, WebSite, WebApplication, ScholarlyArticle, FAQPage, BlogPosting with full articleBody), RSS and JSON feeds with complete content, explicit robots rules welcoming AI crawlers, and every page pre-rendered as static HTML — all validated on every build by an automated seo:check script.

Why GEO

Search is splitting in two: classic crawlers ranking pages, and generative engines answering questions directly. Generative Engine Optimization (GEO) means making your content easy for LLMs to ingest, ground, and cite. This site is a working example.

What is implemented here

Machine-readable profile files. llms.txt follows the llmstxt.org convention: a compact map of the site with sections, projects, publications, FAQ, and feeds. llms-full.txt is the complete plain-text profile — bio, experience, education, publications with citation strings, teaching, awards, skills — for direct ingestion.

A linked JSON-LD graph. Every page emits schema.org structured data connected by stable @ids: one Person node referenced from WebSite, ProfilePage, WebApplication (one per project, with featureList and offers), ScholarlyArticle/Report/Chapter for publications, FAQPage with bilingual Question nodes, and BlogPosting that includes the full articleBody, speakable selectors, keywords, and reading time.

Feeds with full content. The RSS feed carries content:encoded with complete post HTML, and the JSON Feed mirrors it in JSON Feed 1.1.

Crawler policy. robots.txt explicitly welcomes AI crawlers — GPTBot, ClaudeBot, PerplexityBot, Google-Extended, CCBot — instead of leaving them to default rules.

Static HTML. Every route is pre-rendered, so crawlers without JavaScript see the same content users do — verified after every change.

Continuous validation. An npm run seo:check script parses every JSON-LD block in the build output, enforces required fields per node type, and verifies every internal link resolves. It runs before every commit that touches SEO.

The takeaway

GEO is not a trick; it is publishing discipline. Structure your facts once, in data files; derive HTML, JSON-LD, feeds, and text mirrors from that single source; and validate the output mechanically.