---
title: "Agent-Readable Websites: llms.txt and Markdown Mirrors"
canonical: https://wavect.io/blog/agent-readable-website-llms-txt-markdown-mirrors/
language: en
description: "What makes a site readable by AI agents: robots access, served HTML, Markdown mirrors, llms.txt and JSON-LD, plus the conversion failures a build gate catches."
image: "https://wavect.io/img/blog/headers/header_agent-readable-website-llms-txt-markdown-mirrors.png"
---

[**Back**](/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/team/kevin-riedl/)

[Kevin Riedl](/team/kevin-riedl/) https://linkedin.com/in/wsdt

9 min read · 18 Aug 2026 Last reviewed August 18, 2026

[**Next**](/blog/can-an-ai-agent-use-your-product/)

# Agent-Readable Websites: llms.txt, Markdown Mirrors and What Actually Breaks

TL;DR

An agent-readable website needs four independent surfaces to work together: robots rules that let retrieval fetchers in, text present in the served HTML before JavaScript runs, a clean Markdown or llms.txt copy advertised with rel=alternate, and valid JSON-LD naming the publisher. Passing three of the four still leaves you invisible. llms.txt is a convention rather than a standard, and its most common defect is relative URLs, because the file is read detached from the page it came from. The conversion failures worth gating are unresolved template values, unbalanced code fences, undecoded HTML entities, collapsed adjacent links, table column mismatches, duplicate H1s and empty bodies. The most expensive single mistake is confusing training crawlers with retrieval fetchers: blocking GPTBot is a licensing choice, while a wildcard disallow underneath it removes you from answers entirely. None of these failures has a visible symptom, so the checks belong in the build rather than in a checklist.

**An agent-readable website serves a clean machine copy of each page, advertises it in the page head, and blocks nothing that needs to fetch it.** The hard part is not deciding to do this. It is keeping it true after the fourth deploy, because every failure mode here is invisible in a browser and silent in your logs.

We run this stack on the site you are reading: a Markdown mirror of every page, an llms.txt per language, published agent skills, and a verifier that fails the production build when any of it breaks. This post is the list of things that verifier has caught, which is a more useful list than the one you get from reading the specification.

## The four surfaces an agent actually uses

Agent readability gets discussed as one topic, but it is four independent surfaces, and a site can pass three and still be invisible.

| Surface | Question it answers | Failure looks like |
| --- | --- | --- |
| robots.txt | Am I allowed to fetch this at all? | Silent absence from answers |
| Served HTML | Is the text here before JavaScript runs? | An empty shell with navigation |
| Markdown mirror | Is there a cheap, unambiguous copy? | Expensive, noisy parsing of rendered chrome |
| JSON-LD | Who published this and what is it? | Facts guessed from prose, or nothing |

The order matters. Fixing structured data on a page that a retrieval fetcher is disallowed from reading is wasted work, and that is the most common way this project gets started backwards.

## llms.txt, honestly

llms.txt is a convention, not a standard. No engine is obliged to read it, and anyone selling you guaranteed pickup is overselling. It is also cheap to generate and it gives an agent a clean map instead of your rendered navigation, which is why we publish one and usually recommend one.

If you publish it, three things decide whether it is useful:

- **Absolute URLs.** This is the mistake we see most, and we made it ourselves. An llms.txt gets fetched and passed around detached from the page it came from, so there is no base URL left to resolve relative links against. A file full of `/services/…` paths is a file full of dead ends.
- **The blockquote under the H1.** That one sentence is what an agent is most likely to reuse verbatim when it introduces you. Leave it out and the agent writes that sentence itself, from whatever it inferred.
- **Notes on every link.** The `: notes` half of each bullet is how an agent with a limited budget decides which link to open. A bare list of titles makes it guess.

## Markdown mirrors and how to advertise them

A mirror is the same content as the page, minus the chrome, served as Markdown at a predictable path and pointed to from the page head:

```
<link rel="alternate" type="text/markdown" href="/services/ai-visibility.md">
```

Generating mirrors is straightforward. Keeping them faithful is the part that needs a machine, because a mirror can be subtly wrong in ways nobody notices for months. The generator runs after the site build, walks the rendered HTML, and the verifier then compares the two.

## The failure modes worth knowing about

These are real findings from our own build, not hypotheticals. Each one shipped at least once before the gate existed.

| Failure | Why it happens | What an agent sees |
| --- | --- | --- |
| Unresolved template value | A generator emits its no-value sentinel, or a pair of template delimiters survives unrendered, and nobody reads the output | A page that quotes your templating language back at you |
| Unbalanced code fence | An opening fence with no closing one | Every heading after it stops being a heading, so the document loses its structure |
| Unresolved HTML entity | Entities not decoded during conversion | An undecoded ampersand or apostrophe entity, read as its literal characters rather than as the punctuation |
| Collapsed adjacent links | Whitespace between two anchors dropped in conversion | Two link texts glued into one phrase |
| Attribution glued to its link | A missing space before an author link | An author string where the word before the link is fused to the name |
| Table column mismatch | Header row and delimiter row disagree on column count | The table stops parsing as a table, so every number loses its column |
| More than one H1 | Chrome headings leaking into the body | Ambiguity about what the page is even about |
| Empty body | Content injected client-side, so the mirror has nothing to mirror | Front matter and silence |

Our favourite was subtler than any of these. Adding one decorative glyph to a page put a literal double-quote character inside an SVG text node, which stopped the HTML minifier inside foreign content. The rest of that page shipped unminified, and its Markdown mirror silently truncated at two thirds, taking the entire FAQ with it. Nothing looked wrong in a browser. The gate failed the build, named the route, and the fix was one character.

## The robots.txt trap: retrieval is not training

This is the single most expensive misunderstanding in the topic, and it is one line of configuration.

Some crawlers exist to collect training data. Others fetch a page in order to answer a question and cite it, right now. Blocking the first group is a licensing decision you may well want to make. Blocking the second group removes you from answers entirely, and it is almost always unintentional:

```
User-agent: GPTBot
Disallow: /

User-agent: *
Disallow: /
```

The first block is a deliberate training opt-out. The second one takes every answer-engine fetcher down with it, because a crawler with no group of its own inherits the wildcard. The team that wrote this believed they had opted out of training. They had also opted out of being cited.

If you want the position "cite me, but do not train on me", that is coherent and configurable: name the retrieval fetchers explicitly and let them through, and disallow the training crawlers by name.

## Why a gate, and not a checklist

Every item above is easy to fix once and impossible to keep fixed by intention. The content changes weekly, the templates change monthly, and none of these failures produces a visible symptom. A quarterly audit finds them a quarter late.

So the checks belong in the build, next to the tests. Ours run after the site is generated and fail the deploy, which means a broken mirror is a red pipeline rather than a slow leak. That is the whole trick, and it is why we hand people the rule catalog instead of a report: the [agent readability checker](/tools/agent-readability-checker/) runs the same mirror rules in your browser, and it is the same code path that decides whether this site deploys.

For the neighbouring problems, our [Open Knowledge Format guide](/blog/open-knowledge-format-okf/) covers packaging internal knowledge as portable Markdown, and the [AI-ready company wiki guide](/blog/ai-ready-company-wiki/) covers serving that knowledge to your own agents. This post is strictly about the public surface: what somebody else's agent can read.

## Frequently Asked Questions

### What makes a website agent-readable?

Four things together: robots rules that let retrieval fetchers in, text present in the served HTML before JavaScript runs, a clean Markdown or llms.txt copy advertised in the page head, and valid JSON-LD that names the publisher. Passing three of the four is usually enough to stay invisible.

### Is llms.txt a standard?

No. It is a convention and no engine is obliged to read it. It is cheap to publish and gives an agent a clean map instead of rendered navigation, which is why we run one, but treat guaranteed pickup claims as a reason to doubt the rest of the pitch.

### Do relative URLs work in llms.txt?

Not reliably. The file is fetched and passed around detached from the page it came from, so there is no base URL left to resolve against. Use absolute URLs.

### Should we block GPTBot?

That is a licensing decision, not a visibility one. Blocking GPTBot or CCBot opts you out of training data and does not remove you from ChatGPT or Perplexity answers, because those are served by separate retrieval fetchers. Blocking the retrieval fetchers is what removes you from answers.

### Do Markdown mirrors duplicate content for search engines?

Carry the canonical URL into the mirror and keep the mirrors out of your XML sitemap, so discovery still points at the HTML page. The mirror is an alternate representation of one canonical document, advertised with rel=alternate.

### How do we stop this decaying after launch?

Put the checks in the build rather than in a document. Content and templates change constantly and none of these failures has a visible symptom, so anything enforced by intention regresses within a quarter or two.

## Final thoughts

Agent readability is not a content project. It is four mechanical surfaces, a short list of conversion bugs, and one configuration line that decides whether any of the rest matters.

Start with robots.txt, because it is the cheapest check and the most expensive mistake. Then serve a clean copy, advertise it, validate your structured data, and put all of it behind a gate so the next deploy has to keep it true.

## You may also like..

[**Open Knowledge Format: The Enterprise Guide** How to package organizational knowledge as portable, human-readable Markdown with provenance and freshness signals.](/blog/open-knowledge-format-okf/) [**AI enablement vs generic AI consulting** Compare a measured implementation on your own infrastructure with a strategy-only engagement.](/compare/ai-enablement-vs-generic-ai-consultancy/)

Agent engineering

## Continue through this cluster

Coding agents, MCP, context systems, evaluation and the controls required for dependable automation.

[Start with the cornerstone**Graph Engineering for AI Agents: When Does a Knowledge Graph Pay Off?**](/blog/graph-engineering-ai-agents/)

- [Localized URLs Break hreflang: Keep One English Slug](/blog/english-slugs-vs-localized-urls-hreflang/)
- [Can an AI Agent Use Your Product, or Only Read About It?](/blog/can-an-ai-agent-use-your-product/)
- [Graft Review 2026: Do Agent Repo Maps Belong in Git?](/blog/graft-review-agent-repo-map/)
- [How Coding Agents Keep Token Bills in Check with Output Compression](/blog/codag-cost-control/)
- [Smarter Token Usage with Your AI Coding Agent](/blog/smarter-token-usage-with-your-ai-coding-agent/)

Inbox, without the noise

## Follow the work that matters to you

Get a short email when we publish something new. Follow the whole blog or only the problems you care about.

[**Back**](/blog/overview/)

[![Kevin Riedl](/img/team/kevin.webp)](/team/kevin-riedl/)

[Kevin Riedl](/team/kevin-riedl/) https://linkedin.com/in/wsdt

9 min read · 18 Aug 2026 Last reviewed August 18, 2026

[**Next**](/blog/can-an-ai-agent-use-your-product/)

New posts by email ×

×

Get new posts by email

A short email when we publish. Free, no tracking.

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/blog/agent-readable-website-llms-txt-markdown-mirrors/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-08-18",
      "inLanguage": "en",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-08-18",
      "url": "https://wavect.io/blog/agent-readable-website-llms-txt-markdown-mirrors/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "abstract": "An agent-readable website needs four independent surfaces to work together: robots rules that let retrieval fetchers in, text present in the served HTML before JavaScript runs, a clean Markdown or llms.txt copy advertised with rel=alternate, and valid JSON-LD naming the publisher. Passing three of the four still leaves you invisible. llms.txt is a convention rather than a standard, and its most common defect is relative URLs, because the file is read detached from the page it came from. The conversion failures worth gating are unresolved template values, unbalanced code fences, undecoded HTML entities, collapsed adjacent links, table column mismatches, duplicate H1s and empty bodies. The most expensive single mistake is confusing training crawlers with retrieval fetchers: blocking GPTBot is a licensing choice, while a wildcard disallow underneath it removes you from answers entirely. None of these failures has a visible symptom, so the checks belong in the build rather than in a checklist.",
  "articleBody": " Blog overview/AI and agents/Agent engineering Agent-Readable Websites: llms.txt, Markdown Mirrors and What Actually Breaks TL;DR An agent-readable website needs four independent surfaces to work together: robots rules that let retrieval fetchers in, text present in the served HTML before JavaScript runs, a clean Markdown or llms.txt copy advertised with rel=alternate, and valid JSON-LD naming the publisher. Passing three of the four still leaves you invisible. llms.txt is a convention rather than a standard, and its most common defect is relative URLs, because the file is read detached from the page it came from. The conversion failures worth gating are unresolved template values, unbalanced code fences, undecoded HTML entities, collapsed adjacent links, table column mismatches, duplicate H1s and empty bodies. The most expensive single mistake is confusing training crawlers with retrieval fetchers: blocking GPTBot is a licensing choice, while a wildcard disallow underneath it removes you from answers entirely. None of these failures has a visible symptom, so the checks belong in the build rather than in a checklist. An agent-readable website serves a clean machine copy of each page, advertises it in the page head, and blocks nothing that needs to fetch it. The hard part is not deciding to do this. It is keeping it true after the fourth deploy, because every failure mode here is invisible in a browser and silent in your logs. We run this stack on the site you are reading: a Markdown mirror of every page, an llms.txt per language, published agent skills, and a verifier that fails the production build when any of it breaks. This post is the list of things that verifier has caught, which is a more useful list than the one you get from reading the specification. The four surfaces an agent actually uses Agent readability gets discussed as one topic, but it is four independent surfaces, and a site can pass three and still be invisible. SurfaceQuestion it answersFailure looks like robots.txtAm I allowed to fetch this at all?Silent absence from answers Served HTMLIs the text here before JavaScript runs?An empty shell with navigation Markdown mirrorIs there a cheap, unambiguous copy?Expensive, noisy parsing of rendered chrome JSON-LDWho published this and what is it?Facts guessed from prose, or nothing The order matters. Fixing structured data on a page that a retrieval fetcher is disallowed from reading is wasted work, and that is the most common way this project gets started backwards. llms.txt, honestly llms.txt is a convention, not a standard. No engine is obliged to read it, and anyone selling you guaranteed pickup is overselling. It is also cheap to generate and it gives an agent a clean map instead of your rendered navigation, which is why we publish one and usually recommend one. If you publish it, three things decide whether it is useful: Absolute URLs. This is the mistake we see most, and we made it ourselves. An llms.txt gets fetched and passed around detached from the page it came from, so there is no base URL left to resolve relative links against. A file full of /services/… paths is a file full of dead ends. The blockquote under the H1. That one sentence is what an agent is most likely to reuse verbatim when it introduces you. Leave it out and the agent writes that sentence itself, from whatever it inferred. Notes on every link. The : notes half of each bullet is how an agent with a limited budget decides which link to open. A bare list of titles makes it guess. Markdown mirrors and how to advertise them A mirror is the same content as the page, minus the chrome, served as Markdown at a predictable path and pointed to from the page head: <link rel=\"alternate\" type=\"text/markdown\" href=\"/services/ai-visibility.md\"> Generating mirrors is straightforward. Keeping them faithful is the part that needs a machine, because a mirror can be subtly wrong in ways nobody notices for months. The generator runs after the site build, walks the rendered HTML, and the verifier then compares the two. The failure modes worth knowing about These are real findings from our own build, not hypotheticals. Each one shipped at least once before the gate existed. FailureWhy it happensWhat an agent sees Unresolved template valueA generator emits its no-value sentinel, or a pair of template delimiters survives unrendered, and nobody reads the outputA page that quotes your templating language back at you Unbalanced code fenceAn opening fence with no closing oneEvery heading after it stops being a heading, so the document loses its structure Unresolved HTML entityEntities not decoded during conversionAn undecoded ampersand or apostrophe entity, read as its literal characters rather than as the punctuation Collapsed adjacent linksWhitespace between two anchors dropped in conversionTwo link texts glued into one phrase Attribution glued to its linkA missing space before an author linkAn author string where the word before the link is",
  "articleSection": "Engineering",
  "author": {
    "@id": "https://wavect.io/team/kevin-riedl/#person",
    "@type": "Person",
    "name": "Kevin Riedl",
    "sameAs": [
      "https://www.wikidata.org/wiki/Q139796365",
      "https://www.linkedin.com/in/wsdt",
      "https://github.com/wsdt"
    ],
    "url": "https://wavect.io/team/kevin-riedl/"
  },
  "dateModified": "2026-08-18",
  "datePublished": "2026-08-18",
  "description": "An agent-readable website needs four independent surfaces to work together: robots rules that let retrieval fetchers in, text present in the served HTML before JavaScript runs, a clean Markdown or llms.txt copy advertised with rel=alternate, and valid JSON-LD naming the publisher. Passing three of the four still leaves you invisible. llms.txt is a convention rather than a standard, and its most common defect is relative URLs, because the file is read detached from the page it came from. The conversion failures worth gating are unresolved template values, unbalanced code fences, undecoded HTML entities, collapsed adjacent links, table column mismatches, duplicate H1s and empty bodies. The most expensive single mistake is confusing training crawlers with retrieval fetchers: blocking GPTBot is a licensing choice, while a wildcard disallow underneath it removes you from answers entirely. None of these failures has a visible symptom, so the checks belong in the build rather than in a checklist.",
  "headline": "Agent-Readable Websites: llms.txt, Markdown Mirrors and What Breaks",
  "image": "https://wavect.io/img/blog/headers/header_agent-readable-website-llms-txt-markdown-mirrors.svg",
  "inLanguage": "en",
  "keywords": "AI Visibility, Machine-Readable Web",
  "mainEntityOfPage": {
    "@id": "https://wavect.io/blog/agent-readable-website-llms-txt-markdown-mirrors/",
    "@type": "WebPage"
  },
  "publisher": {
    "@id": "https://wavect.io/#organization",
    "@type": [
      "Organization",
      "ProfessionalService",
      "LocalBusiness"
    ]
  },
  "url": "https://wavect.io/blog/agent-readable-website-llms-txt-markdown-mirrors/",
  "wordCount": 1906
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "item": "https://wavect.io/",
      "name": "Home",
      "position": 1
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/blog/overview/",
      "name": "Blog overview",
      "position": 2
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/blog/topics/ai-agents/",
      "name": "AI and agents",
      "position": 3
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/blog/clusters/agent-engineering/",
      "name": "Agent engineering",
      "position": 4
    },
    {
      "@type": "ListItem",
      "item": "https://wavect.io/blog/agent-readable-website-llms-txt-markdown-mirrors/",
      "name": "Agent-Readable Websites: llms.txt and Markdown Mirrors | ",
      "position": 5
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Four things together: robots rules that let retrieval fetchers in, text present in the served HTML before JavaScript runs, a clean Markdown or llms.txt copy advertised in the page head, and valid JSON-LD that names the publisher. Passing three of the four is usually enough to stay invisible."
      },
      "name": "What makes a website agent-readable?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. It is a convention and no engine is obliged to read it. It is cheap to publish and gives an agent a clean map instead of rendered navigation, which is why we run one, but treat guaranteed pickup claims as a reason to doubt the rest of the pitch."
      },
      "name": "Is llms.txt a standard?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Not reliably. The file is fetched and passed around detached from the page it came from, so there is no base URL left to resolve against. Use absolute URLs."
      },
      "name": "Do relative URLs work in llms.txt?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "That is a licensing decision, not a visibility one. Blocking GPTBot or CCBot opts you out of training data and does not remove you from ChatGPT or Perplexity answers, because those are served by separate retrieval fetchers. Blocking the retrieval fetchers is what removes you from answers."
      },
      "name": "Should we block GPTBot?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Carry the canonical URL into the mirror and keep the mirrors out of your XML sitemap, so discovery still points at the HTML page. The mirror is an alternate representation of one canonical document, advertised with rel=alternate."
      },
      "name": "Do Markdown mirrors duplicate content for search engines?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Put the checks in the build rather than in a document. Content and templates change constantly and none of these failures has a visible symptom, so anything enforced by intention regresses within a quarter or two."
      },
      "name": "How do we stop this decaying after launch?"
    }
  ]
}
```
