About

Why this site exists.

Most teams are either shipping only .md siblings, or doing partial negotiation. This site exists to show the complete pattern.

We kept seeing the same two implementation patterns in the wild:

  1. Publish a few .md files and assume agents will discover them.
  2. Check Accept, return Markdown, and stop there.

Both are better than nothing. But neither is full content negotiation. If the canonical URL still returns HTML to Accept: text/markdown, many agents will never reach your Markdown. And if you negotiate without Vary: Accept, caches eventually serve the wrong variant.

There are also useful web checkers focused on whether a URL can return Markdown at all, including Cloudflare’s isitagentready.com. That baseline check is helpful, but this project is specifically about the full negotiation contract: representation selection, cache correctness, and unsatisfiable request handling.

What we wanted to make concrete

Why guides and recipes are separate

Guides explain protocol decisions. Recipes translate them into concrete stack code. Keeping them separate makes it easier to audit correctness without losing copy-paste speed.

Scope

This is not a generic AI SEO site. It is a narrow implementation reference for serving Markdown and HTML representations from one URL correctly.

Production proof

We also validate this pattern against a live production implementation at roots.io, including the full negotiation path: Accept matching, Vary: Accept, canonical-URL Markdown delivery, and 406 behavior when the request is unsatisfiable.

Agent landscape

Most AI agents don’t yet send Accept: text/markdown when their built-in browse or fetch tools hit a URL. We track who does on the Status page.

Feedback

See something unclear or incorrect? Submit feedback or tweet @retlehs.

Know of an open-source package, guide, or writeup about Markdown content negotiation? Send it our way and we’ll be happy to add a reference to it.