---
title: "Markdown mirror can compete with the HTML page, or diverges from it (geo/markdown-mirror-indexable)"
description: "geo/markdown-mirror-indexable: Without X-Robots-Tag: noindex or a canonical Link header, .md mirrors can be indexed as duplicates; mirrors carrying different…"
canonical: https://void-design.vercel.app/rules/geo/markdown-mirror-indexable
lastModified: 2026-09-16
---

# Markdown mirror can compete with the HTML page, or diverges from it

`geo/markdown-mirror-indexable` · severity **warn** · category AI search · detected by `void geo` and `void audit`

## Why it matters

Without X-Robots-Tag: noindex or a canonical Link header, .md mirrors can be indexed as duplicates; mirrors carrying different facts than the HTML risk looking like cloaking.

## How to fix it

Send X-Robots-Tag: noindex and Link: <html-url>; rel="canonical" on Markdown responses, keep them out of the sitemap, and generate them from the same source as the HTML.

## Example

```ts
// app/md/[[...slug]]/route.ts
return new Response(md, {
  headers: {
    'Content-Type': 'text/markdown; charset=utf-8',
    'X-Robots-Tag': 'noindex',
    Link: '<' + htmlUrl + '>; rel="canonical"',
    Vary: 'Accept',
  },
})
```

## References

- https://llmstxt.org/
- https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/

## More ai search rules

`void geo` reports 41 rules in this category. Generative-engine optimisation: whether AI crawlers that don't run JavaScript see the same content, valid and visible JSON-LD, an explicit AI robots policy, llms.txt, Markdown mirrors and answer-first writing.

- `unstructured-content` Long content with no lists, tables or subheadings — [geo/unstructured-content](https://void-design.vercel.app/rules/geo/unstructured-content)
- `wall-of-text` Paragraphs longer than 150 words — [geo/wall-of-text](https://void-design.vercel.app/rules/geo/wall-of-text)
- `vague-headings` Generic section headings ("Overview", "More", "Details") — [geo/vague-headings](https://void-design.vercel.app/rules/geo/vague-headings)
- `markdown-alternate` No working Markdown alternate for this content page — [geo/markdown-alternate](https://void-design.vercel.app/rules/geo/markdown-alternate)
- `markdown-negotiation-vary` Accept: text/markdown negotiation without Vary: Accept — [geo/markdown-negotiation-vary](https://void-design.vercel.app/rules/geo/markdown-negotiation-vary)
- `markdown-negotiation` No Markdown response for Accept: text/markdown — [geo/markdown-negotiation](https://void-design.vercel.app/rules/geo/markdown-negotiation)
- `llms-txt-missing` No /llms.txt — [geo/llms-txt-missing](https://void-design.vercel.app/rules/geo/llms-txt-missing)
- `llms-txt-error` /llms.txt returns a server error — [geo/llms-txt-error](https://void-design.vercel.app/rules/geo/llms-txt-error)

Detected by `void geo` and `void audit`. Explain it in a terminal: `void rules geo/markdown-mirror-indexable`
