Two weeks of serving Markdown to agents, straight from the nginx logs GoodBarber, an app platform, has served Markdown versions of every public page for two weeks via two routes — an `Accept: text/markdown` content-negotiated response and a `.md` URL suffix — generating the Markdown from cached HTML through a Django middleware without duplicating templates or content. The company's engineering lead reports that the conversion is byte-identical for browsers (adding roughly eight microseconds per request) and now also feeds nightly regenerated llms.txt and llms-full.txt files in eleven languages. The writeup focuses on how the two doors are built, how requests were counted from dedicated nginx logs, and what those logs can and cannot prove. Since early September, every public page of our website has had a Markdown twin, reachable by header or by URL. Two dedicated nginx logs have recorded every request through either door since September 4. Two weeks later I read them, all of them, with the method below. The results, in short, are on our blog https://www.goodbarber.com/blog/do-ai-agents-read-markdown-what-two-weeks-of-our-own-server-logs-say-a1622/ . This is the engineering cut: how the two doors are built, how the count was made, and what the logs can and cannot prove. I co-founded GoodBarber, an app platform, and I run its engineering. The site in question is the one that sells it: marketing pages, a blog, a help center, on eleven language hosts. Pierre-Laurent, our head of backend engineering, counted in August four months of requests to our llms.txt https://dev.to/pierrelaurentmedori/llmstxt-in-the-wild-1321-requests-and-not-one-ai-assistant-came-looking-3205 and found no assistant that came on its own. What stayed with me was his other number: over the same four months, assistants and their crawlers made 1.6 million requests to our regular pages, and Claude Code accounted for about 4,500 of them, half on the help center. The index goes unread while the pages get fetched, so what I wanted to know is what a fetch receives. The site is a Django application behind nginx, with a full-page cache. The constraint was mine: no rewriting of templates, no duplicated content. So the Markdown is produced from the HTML the full-page cache already holds. The converting middleware is the last one in Django's list, which makes it the first to see a response on the way out, before minification and before the CSRF placeholder is substituted; that's what keeps the output identical between a cache hit and a miss, and cacheable by a fingerprint of the HTML. Conversion happens once per distinct HTML, and everything else is a lookup. Two doors open onto it. Send Accept: text/markdown on any public page and, if the q-values make Markdown the preferred type, you get it at the same URL, with Vary: Accept . Or add .md to the path: /pricing.md , /blog/