<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: danielgreid</title>
    <description>The latest articles on DEV Community by danielgreid (@danielgreid).</description>
    <link>https://dev.to/danielgreid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4046003%2F99bde4c6-25ee-476a-b0ee-c1e7f0377024.png</url>
      <title>DEV Community: danielgreid</title>
      <link>https://dev.to/danielgreid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielgreid"/>
    <language>en</language>
    <item>
      <title>llms.txt: What It Actually Does, and Why It Rots</title>
      <dc:creator>danielgreid</dc:creator>
      <pubDate>Fri, 24 Jul 2026 18:46:10 +0000</pubDate>
      <link>https://dev.to/danielgreid/llmstxt-what-it-actually-does-and-why-it-rots-hh</link>
      <guid>https://dev.to/danielgreid/llmstxt-what-it-actually-does-and-why-it-rots-hh</guid>
      <description>&lt;p&gt;When ChatGPT, Claude or Perplexity answers a question about your product, it is not consulting a decade of PageRank. It fetches a handful of pages and tries to work out what your site is. That is a very different retrieval problem from classic search, and most sites are accidentally hostile to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why sitemaps are the wrong mental model
&lt;/h2&gt;

&lt;p&gt;A sitemap optimises for &lt;strong&gt;coverage&lt;/strong&gt; — every URL, every paginated archive, every tag page. That is correct for a crawler with a huge budget and a ranking model to sort the noise afterwards.&lt;/p&gt;

&lt;p&gt;An LLM landing on your site has neither. It has a limited context window and one shot. If the first thing it ingests is 400 URLs of &lt;code&gt;?page=17&lt;/code&gt; and &lt;code&gt;/tag/misc&lt;/code&gt;, your three genuinely useful guides are buried.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt; inverts this. It is a small markdown file at your root that optimises for &lt;strong&gt;priority&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Your Product&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; One-line description of what this actually does.&lt;/span&gt;

&lt;span class="gu"&gt;## Docs&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Quickstart&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/docs/quickstart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Install and first request in 5 minutes
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;API Reference&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://example.com/docs/api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Every endpoint with request/response examples
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two rules make or break it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Every link carries a description.&lt;/strong&gt; The colon-suffix annotation is what lets a model decide whether to fetch a page. A bare link list is barely better than a sitemap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Omit aggressively.&lt;/strong&gt; If a page does not answer a question someone would ask, it does not belong.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  llms-full.txt and the context tradeoff
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llms-full.txt&lt;/code&gt; inlines expanded content rather than linking out, so a model can ingest everything in one request. This is genuinely useful for compact docs — and actively harmful for large sites, where you will blow the context window and get truncated mid-document.&lt;/p&gt;

&lt;p&gt;Rough heuristic: if your docs exceed roughly 50k tokens, ship &lt;code&gt;llms.txt&lt;/code&gt; alone and let models fetch selectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part nobody mentions: it rots
&lt;/h2&gt;

&lt;p&gt;This is where most implementations quietly fail. You write the file, ship it, and three months later half the descriptions describe features you renamed and two links 404. Nothing in your build catches it, because nothing validates it.&lt;/p&gt;

&lt;p&gt;Two things worth automating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Link liveness&lt;/strong&gt; — CI check that every URL in &lt;code&gt;llms.txt&lt;/code&gt; still returns 200&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regeneration on docs change&lt;/strong&gt; — treat it as a build artifact, not a hand-maintained file&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I ended up building a free generator for exactly this loop, after my own docs got cited with a description I had rewritten months earlier. Paste a URL, it crawls the structure, and produces spec-compliant &lt;code&gt;llms.txt&lt;/code&gt; and &lt;code&gt;llms-full.txt&lt;/code&gt; you can edit before exporting — reorder, drop low-value pages, rewrite descriptions. No signup, nothing stored: &lt;a href="https://aicrawlable.com" rel="noopener noreferrer"&gt;aicrawlable.com&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Worth being honest about
&lt;/h2&gt;

&lt;p&gt;No search engine has committed to llms.txt as a ranking signal, and it may never become one. What it does today is cheap insurance: when a model &lt;em&gt;does&lt;/em&gt; fetch your site, it reads a curated map instead of guessing. That asymmetry — near-zero cost, meaningful upside — is the whole argument.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
