<?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: Mayank Sharma</title>
    <description>The latest articles on DEV Community by Mayank Sharma (@mayank_sharma).</description>
    <link>https://dev.to/mayank_sharma</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%2F4178336%2F0edb8953-63ef-4bfc-8b8b-53975d8cd72c.png</url>
      <title>DEV Community: Mayank Sharma</title>
      <link>https://dev.to/mayank_sharma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mayank_sharma"/>
    <language>en</language>
    <item>
      <title>llms.txt: what it is, how to write one, and whether it actually does anything</title>
      <dc:creator>Mayank Sharma</dc:creator>
      <pubDate>Mon, 12 Oct 2026 05:11:05 +0000</pubDate>
      <link>https://dev.to/mayank_sharma/llmstxt-what-it-is-how-to-write-one-and-whether-it-actually-does-anything-13ki</link>
      <guid>https://dev.to/mayank_sharma/llmstxt-what-it-is-how-to-write-one-and-whether-it-actually-does-anything-13ki</guid>
      <description>&lt;p&gt;Every few months a new file shows up that promises to make your site "AI-ready". The current one is &lt;code&gt;llms.txt&lt;/code&gt;. We publish one on our own site, and I've read the arguments on both sides, so here is what I'd tell a developer who just got a ticket that says "add llms.txt".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short version:&lt;/strong&gt; it's cheap to add and harmless, it's useful for coding assistants and docs, and there's no public evidence yet that it changes whether ChatGPT or Perplexity cite you. Ship it if it takes ten minutes; don't sell it to your boss as an SEO win.&lt;/p&gt;

&lt;h2&gt;
  
  
  What llms.txt is
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; is a proposal published at llmstxt.org in September 2024 by Jeremy Howard of Answer.AI. The idea: put a Markdown file at the root of your site (&lt;code&gt;https://example.com/llms.txt&lt;/code&gt;) that gives a language model a short, curated map of your most useful pages.&lt;/p&gt;

&lt;p&gt;Why not just use &lt;code&gt;sitemap.xml&lt;/code&gt;? A sitemap lists every URL for a crawler. &lt;code&gt;llms.txt&lt;/code&gt; is meant to be read by a model at inference time, with limited context, so it's short, human-written and annotated. Think "README for your website", not "index of everything".&lt;/p&gt;

&lt;h2&gt;
  
  
  The format
&lt;/h2&gt;

&lt;p&gt;The spec is small. In order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An &lt;code&gt;H1&lt;/code&gt; with the name of the site or project. This is the only required part.&lt;/li&gt;
&lt;li&gt;A blockquote with a one-paragraph summary.&lt;/li&gt;
&lt;li&gt;Optional free text with anything a model should know.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;H2&lt;/code&gt; sections, each with a Markdown list of links: &lt;code&gt;- [Title](url): short note&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;An optional section literally called &lt;code&gt;## Optional&lt;/code&gt; for links that can be skipped when context is tight.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a realistic example for a small SaaS:&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;# Acme Invoices&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; Acme Invoices is invoicing software for freelancers in the EU. It creates&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; VAT-compliant invoices, tracks payments and exports to accounting tools.&lt;/span&gt;

Prices are in EUR. There is a free plan for up to 5 invoices a month.

&lt;span class="gu"&gt;## Product&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Features&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.example/features&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: What the app does, with screenshots
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Pricing&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.example/pricing&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Plans, limits and what's in the free tier

&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;Getting started&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.example/docs/start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Create your first invoice
&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://acme.example/docs/api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: REST endpoints and auth

&lt;span class="gu"&gt;## Optional&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Changelog&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://acme.example/changelog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;: Release notes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things that make the difference between a useful file and noise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Write the notes yourself.&lt;/strong&gt; "Plans, limits and what's in the free tier" helps a model choose a link. A copied meta description usually doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leave things out.&lt;/strong&gt; Thank-you pages, login, tag archives and thin pages don't belong there. Short is the point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep it current.&lt;/strong&gt; A link to a page that 404s is worse than no link.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The proposal also suggests offering clean Markdown versions of pages (for example &lt;code&gt;/docs/start.md&lt;/code&gt;) and an &lt;code&gt;llms-full.txt&lt;/code&gt; with the full text inlined. Those are optional, and most sites skip them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Shipping it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  As a static file (any stack)
&lt;/h3&gt;

&lt;p&gt;Put &lt;code&gt;llms.txt&lt;/code&gt; wherever your framework serves static files from the root: &lt;code&gt;public/&lt;/code&gt; in Next.js, Vite and Create React App, &lt;code&gt;static/&lt;/code&gt; in SvelteKit and Hugo, the web root on a plain server. Check it returns &lt;code&gt;200&lt;/code&gt; with a text content type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://your-site.com/llms.txt | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generated in Next.js (App Router)
&lt;/h3&gt;

&lt;p&gt;If your pages come from a CMS, generate the file so it never drifts out of date:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/llms.txt/route.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getPublishedPages&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@/lib/cms&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;revalidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;86400&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// rebuild daily&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getPublishedPages&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// [{ title, url, summary, section }]&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`- [&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;](&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;): &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;section&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[...(&lt;/span&gt;&lt;span class="nx"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[]),&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;# Acme Invoices&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt; Invoicing software for EU freelancers: VAT-compliant invoices, payment tracking, accounting exports.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;...[...&lt;/span&gt;&lt;span class="nx"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`## &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
  &lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/plain; charset=utf-8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you'd rather not write one by hand, I work on a free &lt;a href="https://presencescout.com/tools/llms-txt-generator" rel="noopener noreferrer"&gt;llms.txt generator&lt;/a&gt; at Presence Scout. It drafts the file from your sitemap and existing page titles, with no AI-written text, so you get a starting point to edit rather than a finished file. The notes will only be as good as your titles and descriptions, which is honestly true of any generator.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it actually do anything?
&lt;/h2&gt;

&lt;p&gt;This is where I'd be careful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where it clearly helps:&lt;/strong&gt; developer tools. Coding assistants and agents work better when you hand them a compact map of a library's docs, and a lot of documentation sites now publish &lt;code&gt;llms.txt&lt;/code&gt; for exactly that reason. If you maintain an API or an SDK, this alone justifies the file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where the evidence is thin:&lt;/strong&gt; AI search. I haven't seen any of the major assistants document that their crawlers fetch &lt;code&gt;llms.txt&lt;/code&gt; and use it to decide what to cite. So treat claims like "llms.txt gets you into ChatGPT answers" as unproven.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What matters more for AI search:&lt;/strong&gt; whether the crawlers can read your pages at all. If &lt;code&gt;robots.txt&lt;/code&gt;, your CDN's bot rules or a JavaScript-only render keep them out, no index file will fix it. Check that first; a five-line &lt;code&gt;curl&lt;/code&gt; with the crawler's user agent will tell you more than any new file.&lt;/p&gt;

&lt;h2&gt;
  
  
  My checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Crawlers can fetch your key pages (status 200, real HTML, not a JS shell)&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;llms.txt&lt;/code&gt; at the root, under ~50 links, with hand-written notes&lt;/li&gt;
&lt;li&gt;[ ] No links to private, thin or redirecting pages&lt;/li&gt;
&lt;li&gt;[ ] Generated from your CMS, or on a reminder to review quarterly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a small file. Treat it like one: quick to ship, easy to maintain, and not a strategy on its own.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Mayank, Digital Marketing Manager at Presence Scout. We build tools that show where a brand appears in AI answers and Google results.&lt;/em&gt;&lt;/p&gt;

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