---
title: "How This Site Is Optimized for Generative Engines (GEO)"
date: 2026-07-10
updated: 2026-07-13
tags: [GEO, SEO, llms.txt, JSON-LD, schema.org, structured data, Next.js, AI crawlers]
canonical: https://www.fernandogreve.com/blog/2026-07-10-geo-optimizing-for-llms
---
# How This Site Is Optimized for Generative Engines (GEO)

*Updated: 2026-07-13*

> **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](/llms.txt) follows the llmstxt.org convention: a compact map of the site with sections, projects, publications, FAQ, and feeds. [llms-full.txt](/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](/feed.xml) carries content:encoded with complete post HTML, and the [JSON Feed](/feed.json) 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.

*Section: Engineering*
*Tags: GEO, SEO, llms.txt, JSON-LD, schema.org, structured data, Next.js, AI crawlers*
