---
title: "No working Markdown alternate for this content page (geo/markdown-alternate)"
description: "geo/markdown-alternate: llms.txt v2 recommends per-page Markdown mirrors advertised with <link rel=\"alternate\" type=\"text/markdown\">; coding agents fetch…"
canonical: https://void-design.vercel.app/rules/geo/markdown-alternate
lastModified: 2026-09-16
---

# No working Markdown alternate for this content page

`geo/markdown-alternate` · severity **info** · category AI search · detected by `void geo` and `void audit`

## Why it matters

llms.txt v2 recommends per-page Markdown mirrors advertised with <link rel="alternate" type="text/markdown">; coding agents fetch them instead of parsing HTML. An advertised mirror that 404s or serves HTML is a warning.

## How to fix it

Serve page.md via a route handler plus a proxy rewrite, and advertise it with alternates.types.

## Example

```ts
// app/blog/[slug]/page.tsx — generateMetadata
alternates: { canonical: path, types: { 'text/markdown': path + '.md' } },

// proxy.ts — /blog/hello-world.md → /md/blog/hello-world
export function proxy(request: NextRequest) {
  const { pathname } = request.nextUrl
  if (pathname.endsWith('.md')) return NextResponse.rewrite(new URL('/md' + pathname.slice(0, -3), request.url))
  return NextResponse.next()
}
export const config = { matcher: ['/blog/:path*', '/docs/:path*'] }
```

## References

- https://llmstxt.org/
- https://nextjs.org/docs/app/guides/ai-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.

- `no-statistics` Long content with no quantified facts — [geo/no-statistics](https://void-design.vercel.app/rules/geo/no-statistics)
- `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-mirror-indexable` Markdown mirror can compete with the HTML page, or diverges from it — [geo/markdown-mirror-indexable](https://void-design.vercel.app/rules/geo/markdown-mirror-indexable)
- `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)

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