How we made construct.computer readable by AI agents Construct shipped Markdown twins for all 92 pages in its sitemap on October 26, 2026, serving each page's clean Markdown version at its path plus .md (for example, /pricing.md) alongside an llms.txt, a robots.txt naming AI crawlers, and keyless JSON APIs for its free tools. The engineering write-up reports that the /pricing/ page is 81,770 bytes as HTML but 4,733 bytes as Markdown, and that Cloudflare's edge conversion returns 12,518 bytes for the same page and sometimes omits the headline. Construct said the change does not affect Google rankings, citing Google's statement that AI Overviews need no special files or Markdown, but changes what a fetching agent reads, since Vercel found in December 2024 that none of the major AI crawlers, including GPTBot, ClaudeBot and PerplexityBot, render JavaScript. How we made construct.computer readable by AI agents - ai-search - engineering https://construct.computer/blog/tag/engineering/ - cloudflare https://construct.computer/blog/tag/cloudflare/ - infrastructure https://construct.computer/blog/tag/infrastructure/ To make a website readable by AI agents, give every page a clean Markdown version at a predictable URL, point to it from the HTML with a Link header, let a client ask for it with an Accept: text/markdown header, and make sure the words are in the HTML before any JavaScript runs. That is what we shipped on construct.computer on October 26, 2026, along with an llms.txt , a robots.txt that names the AI crawlers, and our free tools as JSON APIs that need no key. The payoff is in what an agent receives. Our pricing page is 81,770 bytes of HTML and 4,733 bytes of Markdown. None of this changes where we rank on Google, which says plainly that it needs no special files or Markdown for AI Overviews. It changes what an agent reads when it fetches one of our pages, which is the part we control. We build Construct, an AI agent platform whose agents spend much of their day reading other people's websites. This post is the engineering write-up: the code, the headers as they come back from production, the parts that did not work the first time, and what the evidence does and does not support. What an agent gets when it fetches a page An agent reading the web has two ways in. A browser agent renders the page and reads the screen or the accessibility tree. A fetching agent ChatGPT, Claude or Perplexity looking something up for a user, or a crawler building an index downloads the HTML and works from the text. Vercel looked at the major AI crawlers in December 2024 and found that "none of the major AI crawlers currently render JavaScript", GPTBot, ClaudeBot and PerplexityBot included Vercel https://vercel.com/blog/the-rise-of-the-ai-crawler . That bit us before we did anything clever. Our homepage FAQ used a Radix accordion, which only renders an answer once it is opened. In the prerendered HTML the six questions were there and the six answers were not, so every crawler that skips JavaScript saw questions with no answers. The fix commit 9a66a2c mounts every answer, collapsed, in the server render, and the page looks and behaves the same. The second problem is size. A modern marketing page is mostly markup, scripts and inline styles. Here is the same content in three forms, measured on October 26: | Uncompressed size of four construct.computer pages as HTML, as our Markdown twin and as Cloudflare's edge conversion, 2026-10-26, sortable by column | | | | | |---|---|---|---|---| | / homepage | 269,870 bytes | 11,258 bytes | 2,812 | we serve our own | | /pricing/ | 81,770 bytes | 4,733 bytes | 1,183 | 12,518 bytes | | /use-cases/memory/ | 35,092 bytes | 3,460 bytes | 865 | 5,710 bytes | | /tools/zapier-cost-calculator/ | 60,073 bytes | 7,878 bytes | 1,970 | 13,781 bytes | The last column is what an agent gets today from any page but the homepage when it sends Accept: text/markdown to the page URL. It is bigger than our twin and, as we explain below, sometimes missing the headline. A Markdown twin of every page Every page in our sitemap, 92 of them on October 26, now has a Markdown twin at its path plus .md : /pricing/ is /pricing.md and the homepage is /index.md . The convention comes from the llms.txt proposal, which asks sites to "provide a clean markdown version of those pages at the same URL as the original page" with .md added llmstxt.org https://llmstxt.org/ , and from the AEO Spec that Dualmark publishes Dualmark https://dualmark.dev/docs/spec/overview . We generate the twins at build time from the prerendered HTML, in scripts/markdown-twins.mjs , so a twin cannot drift from its page. The script reads the sitemap, parses each page with rehype, keeps only