Misc

GEO Site Structure Self-Check: Verifying JSON-LD, hreflang, sitemap, llms.txt and robots

A verification checklist for GEO content sites: check JSON-LD, hreflang, sitemap, llms.txt and robots.txt with curl+grep, with pass criteria and knowflowhub.com results.

TL;DR

To be cited correctly by AI and search engines, a GEO content site must pass five structural checks: JSON-LD structured data, hreflang language declarations, sitemap.xml, the llms.txt text index and robots.txt crawler access. This article gives the curl+grep command, pass criteria and real results from knowflowhub.com for each.

When to Use ​

The goal of GEO (Generative Engine Optimization) is to get content cited by AI retrieval tools. Machine-readable structure determines whether AI can find content, identify language versions and parse article metadata. This checklist applies to pre-launch checks of new sites, regression checks after redesigns, and troubleshooting when 'AI cannot find my article'. All steps use curl and grep, with no tools to install.

Steps ​

Step 1: JSON-LD structured data ​

Command:

bash
curl -s https://your-domain/ | grep -o 'application/ld+json' | wc -l

Pass criteria: the count is >= 1 and a <script type="application/ld+json"> block exists; validate the block with python3 -c "import json; json.load(open('/tmp/ld.json'))". Result on knowflowhub.com: 1 JSON-LD block on the homepage.

Step 2: hreflang declarations ​

Command:

bash
curl -s https://your-domain/ | grep -o 'hreflang="[^"]*"' | sort -u

Pass criteria: every published language has an hreflang value, plus x-default. Result on knowflowhub.com: zh-CN, en-US, ja-JP, x-default.

Step 3: sitemap.xml inventory ​

Command:

bash
curl -s https://your-domain/sitemap.xml | grep -oE '/content/[a-z]+/[0-9-]+/[a-z0-9-]+' | sort -u | wc -l

Pass criteria: the URL count matches published articles; de-duplicate multilingual URLs by slug. Result on knowflowhub.com: the sitemap is 195 KB of XML, 82 items after slug de-duplication.

Step 4: llms.txt index ​

Command:

bash
curl -s https://your-domain/llms.txt | head -30

Pass criteria: file exists (HTTP 200), starts with a site description, and lists Markdown links to the .md version of each article with a one-line summary. Result on knowflowhub.com: llms.txt returns the site intro and the content index.

Step 5: robots.txt access ​

Command:

bash
curl -s https://your-domain/robots.txt

Pass criteria: AI crawlers (GPTBot, ChatGPT-User, OAI-SearchBot, Googlebot, Google-Extended, Bingbot, PerplexityBot, etc.) all get Allow: / and are not blocked by Disallow. Result on knowflowhub.com: GPTBot, ChatGPT-User, OAI-SearchBot, Googlebot and Google-Extended are all allowed.

Notes ​

  • JSON-LD and hreflang must be in the raw HTML, not rendered only by JavaScript, or crawlers cannot read them; always check the HTML fetched by curl.
  • Do not double-count multilingual URLs of the same slug in the sitemap; if content is organized by date directory, each article must be indexed under all three language routes.
  • llms.txt is a community proposal (llmstxt.org), not a search-engine requirement, but it is already adopted by several AI retrieval tools; refresh it whenever content changes.
  • Passing the structural checks does not guarantee indexing; discovery depends on crawl timing and external references. A valid structure is a prerequisite, not a sufficient condition.

Sources ​