GEO in practice: optimizing for AI search engines and LLMs
How to embed canonical Schema.org structured data so large language models and AI search engines can pick up your pages precisely.
Quick answer
What is GEO optimization?
GEO optimizes for retrieval and source alignment with generative AI engines like ChatGPT Search and Perplexity.
Machine-readable page data: /data/geo-optimization.json
In-depth analysis
Injecting Schema.org JSON-LD helps your site win traffic in the era of AI search engines.
// JSON-LD hardcoded in the page <head> (GEO rule: place centrally, SSG static output)
<script type="application/ld+json">
{ "@context":"https://schema.org", "@type":"TechArticle",
"headline":"...", "mainEntityOfPage": { "@type":"WebPage" } }
</script>GEO Overview · Key takeaways
- Tech choice and boundaries confirmed
- Core config in place
- Locally verified
- Postmortem notes recorded
Explore the hub
See all 5 guides in Traffic & SEOSame category as this article, sorted across the codebase.
AI Search scaling: from a single page to a million
Horizontal scaling strategy for AI Search across huge page counts and high concurrency.
Astro scaling: from a single page to a million
Horizontal scaling strategy for Astro across huge page counts and high concurrency.
Cloudflare Pages scaling: from a single page to a million
Horizontal scaling strategy for Cloudflare Pages across huge page counts and high concurrency.
GEO scaling: from a single page to a million
Horizontal scaling strategy for GEO across huge page counts and high concurrency.
Share & save
What readers are asking
Questions that keep coming back in reader feedback, already answered.
- 01
Why is a full-length llms.txt being downweighted?
AI crawlers prefer a summary plus canonical URLs; padding it with the entire corpus reads as low quality. Keep llms.txt as a map and let the landing pages carry the detail.
See the full guide → - 02
Why is my Astro component's interactivity not working?
Components ship as zero-JS HTML by default, so an interactive one needs a client:* directive (client:load, client:visible, …). Without it the script is never bundled into the page.
See the full guide → - 03
Why is my custom Tailwind v4 brand colour not applied?
Colours must be declared in @theme (for example --color-brand). A missing @tailwindcss/vite plugin, or a leftover v3 config, makes bg-brand silently render nothing.
See the full guide →