Can AI crawlers read your site? robots.txt, llms.txt and JavaScript rendering, checked Raphaël Aubry, founder of Howseen, published a guide showing how to check from the terminal whether AI crawlers can read a site, covering robots.txt rules, llms.txt, and JavaScript rendering. The guide notes that OpenAI, Anthropic, and Perplexity each run separate crawlers for training, search indexing, and user-triggered fetches, and that most AI crawlers parse raw HTML without executing JavaScript, so client-rendered pages return empty shells. Aubry also released a free tool that runs the same checks across up to 100 URLs. Originally published on howseen.ai: howseen.ai/llms-txt https://howseen.ai/llms-txt?utm source=devto&utm medium=referral&utm campaign=o2-syndication By Raphaël Aubry, founder of Howseen An AI assistant can only cite a page it can read. Before anyone talks about "GEO" or content strategy, three boring things decide whether your site is even in the running: robots.txt let the AI crawlers in? llms.txt , and does it matter? Here is how to check all three from a terminal, what the official documentation says, and a free tool that runs the same checks on up to 100 URLs at once. curl -s https://yoursite.com/robots.txt The thing most people miss: AI companies run several crawlers with different jobs, and each one reads its own group in robots.txt. From each company's documentation: | Company | Token | Job | |---|---|---| | OpenAI | GPTBot | Collects content for model training | | OpenAI | OAI-SearchBot | Surfaces sites in ChatGPT search | | OpenAI | ChatGPT-User | Fetches pages for user actions in ChatGPT | | Anthropic | ClaudeBot | Collects content for model training | | Anthropic | Claude-SearchBot | Indexes content for Claude search results | | Anthropic | Claude-User | Fetches pages when a Claude user asks | | Perplexity | PerplexityBot | Surfaces and links sites in Perplexity search | | Perplexity | Perplexity-User | Fetches pages when a user asks a question | | | Google-Extended | Token for Gemini training and grounding, not a separate crawler | Three consequences: GPTBot training and keep OAI-SearchBot ChatGPT search . OpenAI says sites that block OAI-SearchBot do not appear in ChatGPT search answers. Google-Extended does not control AI Overviews. User-agent: followed by Disallow: / blocks every bot that has no group of its own, AI crawlers included. In my experience it is usually a leftover from an old scraper defense that nobody reopened. Reading robots.txt by eye works until rules overlap. The standard RFC 9309 https://www.rfc-editor.org/rfc/rfc9309 says the most specific user-agent group wins, then the longest matching rule, and Allow wins a tie. Here is that logic in the checker I describe at the end of this post: js const specific = parsed.groups.filter g = g.agents.includes token ; if specific.length { matchedGroup = token; rules = specific.flatMap g = g.rules ; } else { const star = parsed.groups.filter g = g.agents.includes ' ' ; if star.length { matchedGroup = ' '; rules = star.flatMap g = g.rules ; } } let best = null; for const r of rules { if ruleMatches r.path, path continue; const len = r.path.length; if best || len best.path.length || len === best.path.length && r.type === 'allow' best = r; } const allowed = best || best.type === 'allow'; Note the fallback: a bot with its own group ignores the group entirely. Adding User-agent: GPTBot with a single Disallow: /private/ means GPTBot no longer sees anything you wrote under . One more layer sits before robots.txt: your firewall or CDN. A WAF rule that blocks unknown bots can reject AI crawlers before they read a single line. If your logs show no hits from these tokens at all, check there too. Most AI crawlers fetch the raw HTML and parse it. They do not run your JavaScript. If your page is a client-rendered shell, they get an empty