# Markdown Mirror - Definition (llms.txt v2)

> A clean Markdown copy of a page at the same URL with .md added. What llms.txt v2 asks for, the URL forms, link relations and common mistakes.

Source: https://angeo.dev/markdown-mirror-definition/
Updated: 2026-09-26

Canonical definition

# Markdown Mirror - Definition (llms.txt v2)

**A Markdown mirror is a clean Markdown copy of a web page, served at the same URL with `.md` added.** It gives AI agents the page's text and links without HTML, scripts, cookie banners or navigation. The llms.txt v2 proposal recommends it, together with two link relations that tell agents where the mirror and the site's llms.txt are.

**In one sentence**
The same page, without the website around it - at a URL an agent can guess, and linked from the page so it does not have to.

## What the llms.txt v2 proposal asks for

The [llms.txt proposal](https://llmstxt.org/), revised on 10 August 2026, adds three recommendations:

| Recommendation | In practice |

| Pages that agents might need have a clean Markdown version **at the same URL** | Append `.md`, or replace the extension. A URL without a file name gets `index.md` or `index.html.md`. |

| A page points to its mirror with `rel="alternate" type="text/markdown"`, and to the llms.txt that covers it with `rel="describedby"` | As a `<link>` element in the head, or as an HTTP `Link:` header. The Markdown file itself can only use the header. |

| Links in llms.txt should lead to LLM-friendly content | llms.txt links point to the mirrors, not to the HTML pages. |

## URL forms

| HTML page | Mirror |

| `/blue-shirt.html` | `/blue-shirt.html.md` (append) or `/blue-shirt.md` (replace) |

| `/docs/setup/` | `/docs/setup/index.md` or `/docs/setup/index.html.md` |

| `/` | `/index.md` |

Serving both forms costs little. A client that guesses the other form then gets the page instead of a 404.

## What a correct setup looks like

```
<!-- on the HTML page -->
<link rel="alternate" type="text/markdown" href="https://shop.example/blue-shirt.html.md">
<link rel="describedby" href="https://shop.example/llms.txt">

# response for the mirror
HTTP/2 200
Content-Type: text/markdown; charset=utf-8
Link: <https://shop.example/blue-shirt.html>; rel="canonical", <https://shop.example/llms.txt>; rel="describedby"
X-Robots-Tag: noindex
```

`text/markdown` is the registered media type (RFC 7763). Keeping the mirror out of the search index with `X-Robots-Tag: noindex` and pointing `rel="canonical"` at the HTML page is our practice, not part of the proposal: it stops search engines treating the mirror as duplicate content.

## Common mistakes

- **Advertising a mirror that returns 404.** A broken `rel="alternate"` is worse than none: a client follows it and fails. Only advertise pages that have a mirror.

- **Empty mirrors.** A page built from a theme template often has no body content in the database. Its mirror is empty. Do not advertise it.

- **Cached 404s.** Page caches such as LiteSpeed or Varnish may keep serving an old 404 for the `.md` URL. Purge after enabling mirrors.

- **Serving HTML as Markdown.** The response must be Markdown with a `text/markdown` content type, not the HTML page under a new URL.

## How to check any page

```
curl -sI https://shop.example/some-page/ | grep -i '^link'
curl -sI https://shop.example/some-page/index.md | grep -iE '^(HTTP|content-type|link)'
```

## On Magento 2 and WordPress

[angeo/module-llms-txt](https://angeo.dev/modules/llms-txt/) 4.x serves a Markdown mirror of every product, category and CMS page at `/{url-key}.md` and accepts both URL forms. Mirrors are **off by default**: turn on *Serve /url-key.md Mirrors*. *Emit Link Relations* and *Link to Markdown Mirrors in llms.txt* then add the head links, the `Link:` header and the llms.txt links. The [AEO audit](https://angeo.dev/aeo-score-definition/) checks the result as the `link_relations` signal and fails when a declared mirror is broken.

On WordPress, angeo.dev uses its own plugin to serve `/slug/index.md` for every listed page, with `/slug.md` as an alias.

## Questions

What is a Markdown mirror?
A clean Markdown version of a web page, served at the same URL with `.md` added or the extension replaced, so AI agents can read the content without the page's HTML, scripts and navigation.

Is a Markdown mirror part of the llms.txt standard?
It is a recommendation in the llms.txt proposal, revised on 10 August 2026. llms.txt is a proposal, not a formal standard, and no AI vendor has committed to reading mirrors.

What URL does the mirror of /docs/setup/ have?
`/docs/setup/index.md` or `/docs/setup/index.html.md`. A URL without a file name gets an index file name before `.md`.

How does an agent find the mirror?
Through `rel="alternate" type="text/markdown"` on the HTML page, as a `<link>` element or an HTTP `Link:` header, and through the links in llms.txt.

Should the Markdown mirror be indexed by Google?
We keep mirrors out of the index with `X-Robots-Tag: noindex` and point `rel="canonical"` at the HTML page, so the HTML page is the one that ranks.

Does a Markdown mirror improve rankings or AI citations?
There is no published evidence either way. It makes the content easier for agents to read; whether any assistant uses it is up to the vendor.

## Related

- [llms.txt - definition](https://angeo.dev/llms-txt-definition/)

- [llms.txt v2: the spec and the evidence](https://angeo.dev/llms-txt-v2-spec-and-evidence/)

- [Module: llms.txt for Magento 2](https://angeo.dev/modules/llms-txt/)

- [AEO score - definition](https://angeo.dev/aeo-score-definition/)

- [The product description AI cannot read](https://angeo.dev/magento-product-description-invisible-ai-chatgpt/)

## Sources

- [llms.txt proposal](https://llmstxt.org/)

- [llms.txt change notes (v2, August 2026)](https://llmstxt.org/changes.html)

- [RFC 7763: The text/markdown media type](https://www.rfc-editor.org/rfc/rfc7763.html)

- [RFC 8288: Web Linking (Link header)](https://www.rfc-editor.org/rfc/rfc8288.html)

- [angeo/module-llms-txt on GitHub](https://github.com/angeo-dev/module-llms-txt)

Checked 24 September 2026 against llmstxt.org (revised 10 August 2026) and the README of angeo/module-llms-txt 4.3.3. Disclosure: we build the module and the audit referenced above.

## More on this topic

- [How to generate llms.txt for Magento 2 in 5 minutes](https://angeo.dev/how-to-generate-llms-txt-for-magento-2-in-5-minutes/)
- [What Is llms.jsonl and Why Ecommerce Catalogs Need It](https://angeo.dev/what-is-llms-jsonl-and-why-ecommerce-needs-it/)
- [llms.txt for Magento 2: 6 Modules Compared (2026)](https://angeo.dev/llms-txt-magento-2-free-vs-paid-module-comparison/)
