What llms.txt actually is
llms.txt is a single Markdown file that lives at the root of your domain, at yoursite.com/llms.txt. It hands an AI model a short, human-written map of what your site is and where its most useful content lives. The whole idea is one file: plain Markdown, curated by a person, pointed at the pages you most want a model to read.
The format was proposed by Jeremy Howard of Answer.AI in September 2024, and the reference lives at llmstxt.org. It caught on fast among documentation teams because it solves a problem they feel every day: large language models are getting good at reading, but they are terrible at reading a normal website. A model that lands on your homepage sees the same wall of navigation menus, cookie banners, JavaScript widgets, and footer links that a human learns to tune out. The model cannot tune it out as easily, and every one of those tokens costs it budget it would rather spend on your actual answer.
Think of the three files a site can put at its root and what each one is really for. robots.txt says who is allowed in. sitemap.xml says here is every door in the building. llms.txt says here are the four rooms worth visiting and here is a sentence about each one. It is the concierge, not the security guard and not the floor plan.
The key word is curated. llms.txt is not generated by dumping your URL list into a file. A person decides which pages matter, writes a one-line description of each, and orders them by importance. That editorial judgment is the point. You are telling a model, in language it can parse in a fraction of a second, what you would tell a smart new hire on their first day: start here, then read this, and ignore the rest for now.
I want to be honest with you from the first paragraph, because a lot of the writing about this file oversells it. llms.txt is not a magic ranking lever. No major model provider has confirmed that they crawl it and weight it the way Google weights a backlink. What it is, is cheap, sensible plumbing for a world where agents and retrieval systems increasingly fetch your pages on demand. It takes twenty minutes to ship, it cannot hurt you, and it puts you in front of a convention that is clearly gaining momentum. That combination is worth twenty minutes.
One point of confusion worth clearing up right now: the name has a period in it, llms.txt, and the file extension is .txt, but the content inside is Markdown. That trips people up. The convention borrows the .txt extension from robots.txt for familiarity and predictability, so it sits in the same mental slot as the crawler files people already know, while the body uses Markdown syntax because Markdown is what models read most cleanly. So do not put HTML, JSON, or XML inside it. Write Markdown, save it as a .txt file, and serve it as plain text. That small detail confuses a surprising number of first-time authors.
It also helps to understand where this came from, because the origin explains the design. Answer.AI is a research lab that works closely with language models all day, and they kept hitting the same wall: pointing a model at a real website produced worse results than pointing it at a clean text file, every time. The web was built for humans with browsers, not for models reading raw markup. llms.txt is their proposed patch for that mismatch, and the design reflects a practitioner's frustration rather than a committee's ambition. That is part of why it is so small. It does exactly one thing, and it refuses to grow into a configuration language.
This guide walks the whole thing end to end: the problem it solves, how it differs from the files you already know, the exact format down to the required and optional parts, how to write one for a docs site versus a store versus a publisher versus a personal site, the larger llms-full.txt variant, who reads these files in 2026 and who openly does not, how it fits a broader GEO and AEO strategy, how to validate and maintain it, the mistakes I see most, and a complete worked example you can copy.
The problem it solves: models choke on normal web pages
To understand why this file exists, you have to look at a web page the way a language model does, not the way you do. Your browser takes the HTML, runs the JavaScript, loads the fonts and images, and paints something clean. A model, or the pipeline feeding a model, usually gets the raw document. That document is built for a rendering engine, not for reading comprehension.
A typical marketing or docs page is maybe 5 to 15 percent content and 85 to 95 percent scaffolding. Navigation trees, breadcrumb bars, mega-menus, cookie consent modals, newsletter popups, analytics scripts, social share widgets, related-article rails, and three levels of footer. When that page gets converted to text for a model, all of that noise comes along for the ride unless someone stripped it carefully. The model now has to find your one paragraph of substance inside a haystack of chrome.
Two hard limits make this worse. The first is the context window. Even the large windows in 2026 are finite, and a retrieval system that wants to read ten of your pages cannot afford to spend most of its budget on repeated navigation menus. The second is JavaScript. A lot of modern sites render their real content client-side, which means a crawler that does not execute JS sees an almost empty shell. Search engines built expensive rendering pipelines to cope. Most AI retrieval paths did not, or execute JS unreliably, so JS-only content is often invisible to them.
Markdown sidesteps all of it. Markdown is close to pure content with almost no structural overhead. A heading is a hash, a link is brackets and parentheses, and there are no scripts, no styles, no popups. Token for token, Markdown is dramatically cheaper and cleaner than the equivalent rendered HTML. A model reading a well-formed Markdown file spends its budget on meaning instead of on parsing div soup.
That is the gap llms.txt fills. Instead of asking a model to reverse-engineer your site by crawling rendered pages, you hand it a Markdown file that says, in plain words, this is who we are and these are the specific pages worth reading. Many teams pair this with a second move: publishing a clean Markdown version of each important page, reachable by appending .md to the URL, so the links in llms.txt point at content that is already model-friendly. Now the whole path is clean. The map is Markdown, and the destinations are Markdown.
There is a cost dimension here too that is easy to miss. Every token a model spends parsing your navigation is a token it does not spend reasoning, and in a retrieval system that fetches many pages per query, that overhead multiplies. A team running an AI feature over your content is paying, literally in API costs and latency, for every kilobyte of chrome they have to wade through. Clean Markdown is not just easier to understand; it is cheaper and faster to process. When you make your content cheap to read, you make yourself the path of least resistance, and systems built on tight budgets gravitate toward the path of least resistance.
Consider the concrete asymmetry. A rendered documentation page might be 200 kilobytes of HTML that reduces to 3 kilobytes of actual prose after you strip the markup, scripts, and styles. A model or its preprocessing pipeline has to do that reduction on the fly, imperfectly, every single time. The .md version of that same page is 3 kilobytes to begin with, and llms.txt is the index that points at all of those clean versions. You are doing the reduction once, deliberately, at publish time, instead of forcing every consumer to redo it badly at read time. The efficiency argument fits in that one sentence.
None of this replaces having good content. A curated map to thin pages is still a map to thin pages. But if you already have substance, llms.txt removes the friction between that substance and a model trying to use it. It is the difference between handing someone a well-labeled index and telling them to read the entire library catalog card by card.
How it differs from robots.txt and sitemap.xml
People keep asking if llms.txt replaces robots.txt or sitemap.xml. It replaces neither. The three files sit at your root and look superficially similar, but they answer three different questions, and you want all three.
| File | Question it answers | Format | Audience | Length |
|---|---|---|---|---|
| robots.txt | What may you crawl? | Directive grammar | All crawlers | Short, rules |
| sitemap.xml | Where is every page? | XML | Search engines | Exhaustive |
| llms.txt | What is worth reading? | Markdown | LLMs and agents | Short, curated |
| ai.txt | May you train on this? | Directive grammar | AI training crawlers | Short, rules |
robots.txt is about permission. It is a plain-text file of user-agent rules that tell crawlers what they may and may not fetch. Allow this path, disallow that one, here is the sitemap. It is a directive file, machine-first, and it has been a web standard since 1994. Critically, robots.txt controls access. It does not describe your content and it is not written for comprehension. A model reading your robots.txt learns what it is allowed to touch, not what any of it means.
sitemap.xml is about coverage. It is an XML list of every URL you want indexed, often with last-modified dates and priority hints. Its job is completeness: give a search engine the full set of doors so nothing important is missed during discovery. A big site's sitemap can hold tens of thousands of URLs. It is exhaustive by design, it is XML rather than readable prose, and it makes no attempt to rank or explain anything. Everything is just a URL in a list.
llms.txt is about comprehension and curation. It is Markdown, written for a reader, and it is deliberately short. Where sitemap.xml says here are all 40,000 pages, llms.txt says here are the eight pages that matter and here is a sentence about each. Where robots.txt says you may enter, llms.txt says here is what is worth your time once you are inside. It is the only one of the three built to be read and understood rather than obeyed or enumerated.
The formats reflect the jobs. robots.txt uses a rigid directive grammar. sitemap.xml uses XML schema. llms.txt uses Markdown because Markdown is the native tongue of the systems meant to read it. That is not a cosmetic choice. It signals the whole intent: this file is content for an intelligent reader, not configuration for a bot.
Be precise about why sitemap.xml, despite listing your URLs, is a poor substitute for llms.txt. A sitemap is optimized for a crawler that will visit every URL over time and decide relevance itself. It carries no descriptions, no prioritization a human would recognize, and no sense of what any page is about. Priority tags in sitemaps are notoriously ignored by search engines because they were gamed for years. So a model handed a sitemap gets a flat list of addresses with no editorial signal at all. It would have to fetch and read every one to learn what matters. llms.txt front-loads that judgment. The whole value is the human deciding, in advance, this page over that one, and saying why in a sentence.
The same logic explains why you keep all three files rather than collapsing them. They are optimized for different consumers at different moments. A search crawler doing broad discovery wants the exhaustive sitemap. A bot checking permission wants the terse rules of robots.txt. A model that has landed on your site and needs to act wants the curated Markdown of llms.txt. Removing any one of them degrades a real use case. They are not redundant; they are specialized, and specialization is why each stays small and good at its one job instead of becoming a bloated do-everything file that serves no consumer well.
One more distinction that trips people up. robots.txt and llms.txt do not overlap in function, so nothing in llms.txt grants or denies access. If you want to control if AI crawlers may train on your content, that is a robots.txt or ai.txt job, not an llms.txt job. llms.txt assumes a model has already decided to read you and answers the next question: what should I read. Keep the mental model clean and you will never misuse the file.
The anatomy of the file: required and optional parts
The llmstxt.org spec is refreshingly small. There is exactly one required element and everything else is optional. That constraint is a feature, because it means a valid file can be five lines long and you can add structure only where it earns its place.
Here is the structure from top to bottom.
The H1 title is the only required part. A single Markdown H1, a hash followed by the name of your site or project. This is the anchor a model reads first to know whose file it is landing on. Without it the file is not spec-valid.
The blockquote summary comes next and is strongly recommended. A single Markdown blockquote, a line starting with a greater-than sign, holding one or two sentences that describe what you are. Write it the way you would want a model to quote you, because a model may well quote it. Keep it concrete. "Acme is an open-source analytics library for Python that tracks events with a two-line install" beats "Acme is a leading solution for modern data teams."
After the blockquote you may add zero or more free Markdown sections. These are ordinary paragraphs and lists, no headings, giving any extra context a reader needs: key concepts, important warnings, how the docs are organized. Keep it tight. This is orientation, not documentation.
Then come the file-list sections, which are the heart of a working llms.txt. Each is an H2 heading, two hashes, followed by a Markdown list of links. Each list item is a link in standard Markdown, the page name in brackets and the URL in parentheses, and after the link you add a colon and a one-line description. You group these H2 sections however your site divides naturally: Docs, Guides, API Reference, Products, Blog. The H2 name labels the group, and each link plus description tells the model what that page is and why it might want it.
There is one special section name the spec reserves: Optional. Any links you place under an H2 literally titled Optional are understood to be skippable. A tool that needs a shorter context, or a model working under a tight token budget, can drop everything in Optional and still have a coherent picture of your site. Put your nice-to-haves there: the changelog, secondary references, deep-cut posts. Keep your must-reads in the named sections above it.
A few formatting details save you grief later. Use absolute URLs in your links, not relative paths, because a model may have fetched your llms.txt out of context and needs the full address to follow anything. Keep each list item on a single line, link then colon then description, because multi-line entries confuse simple parsers. Do not nest headings deeper than H2 inside the file; the format expects H1 once at the top and H2 for sections, and going deeper breaks the file-list contract that tools rely on. These are small rules, but they are the difference between a file that parses cleanly everywhere and one that works in your editor but breaks in a consumer.
It also helps to see the format as a deliberate inversion of how you would normally write for search. SEO trained us to be comprehensive, to target every keyword, to never leave a page unlinked. llms.txt asks for the opposite instinct. Its entire value is subtraction: what can you leave out so that what remains is unmistakably the important part. If writing one feels uncomfortable because you keep wanting to add more, that discomfort is a sign you are doing it right. The restraint is the product. A model does not reward you for volume here; it rewards you for having already done the hard work of deciding what matters.
Those pieces are the entire grammar. H1 required, blockquote recommended, free sections optional, H2 link-lists as the body, and an Optional section for the skippable material. Because it is plain Markdown, it is trivially parseable. The reference tools from Answer.AI can read one of these into a structured object and even expand every linked page into a single context blob for feeding a model. You are writing for humans and machines at once, and the format is small enough that both can read it comfortably.
Writing link descriptions a model will actually use
The links are where an llms.txt file is won or lost. A model does not read your file for the pleasure of the prose. It reads it to decide which pages to fetch next. Every description is a tiny pitch: given a user's question, is this page the one to open. Write them with that job in mind.
Lead with what the page is, not with adjectives. "Installation guide: install the CLI, authenticate, and run your first query in under five minutes" tells a model exactly when to reach for it. "Everything you need to get started on your journey" tells it nothing. The best descriptions read like the answer to why would a model open this, in one plain clause.
Curate ruthlessly. The instinct when you first write one of these is to include everything, because leaving a page out feels like hiding it. Resist. A file with 200 links is a sitemap with extra steps, and it defeats the purpose. Pick the pages you would genuinely want surfaced if a model could only read a handful of your site. For most sites that is somewhere between five and thirty links total. If a page is not worth a sentence of your attention, it is not worth a model's attention either.
Order matters. Put the most important, most representative pages first, both across sections and within them. Some tools truncate, some models weight earlier context more heavily, and a human skimming your file forms an impression from the top. Lead with your strongest, clearest, most linkable pages.
Point links at clean content when you can. This is where the .md companion convention pays off. If your docs platform can serve a Markdown version of each page, link to that, or at least make sure the linked HTML is content-rich rather than a JavaScript shell. A great description that points at a page a model cannot parse is a broken promise. The map and the destination both need to be readable.
Keep descriptions consistent in shape. A model, and a person, reads a list faster when every item follows the same rhythm: page name, colon, one clause of what and why. Do not let some entries balloon into three sentences while others are two words. Uniformity is a readability signal, and readability is the entire reason this file exists.
A test I use on every description before it ships: could a model, reading only this one line, correctly decide if it should open the page for a given question? If yes, the description works. If the line is so vague it would apply equally to five of your pages, it fails, because it gives the model no basis to choose. Descriptions that could be swapped between pages without anyone noticing are descriptions doing no work. Each one should be specific enough that it could only belong to the page it sits under. That specificity is what turns a list of links into a genuinely useful index.
Watch the length, too. A description that runs to three lines stops being scannable and starts competing with the page it points to. One clause, maybe two, is the target. If you find yourself needing a paragraph to describe a page, that is usually a sign the page itself is doing too many things, and the fix is on the page, not in the description. The link entry is a signpost, not a summary. Its job is to get a model to the right door, not to reproduce what is behind it. Trust the destination to carry the detail.
Finally, write for the question, not for yourself. You know your site's internal names for things. A model matches on the user's language. If your pricing page is internally called "Plans and Packaging," the description should still say pricing, cost, and tiers, because that is what a user asked about. The description is the bridge between how people ask and how you organize. Build the bridge on their side of the river.
How to author one for your kind of site
The format is universal, but a good llms.txt looks different for a docs site than for a store. The sections you choose, and the pages you prioritize, should mirror how someone would actually use your content through a model. Here are the four patterns I reach for most.
| Site type | Typical sections | Lead with | Push to Optional |
|---|---|---|---|
| Docs / dev tool | Getting Started, Guides, API Reference | Install and first-run path | Changelog, migration notes |
| Ecommerce | Categories, Buying Guides, Info | Main collections + policies | Seasonal, clearance |
| Publisher | Core topics, Pillars, About | Point-of-view pillar pieces | Daily archive |
| Personal | Writing, Work, Contact | Identity blockquote + best posts | Older or minor posts |
Documentation and developer tools. This is the format's home turf and the easiest win. Your sections mirror your docs tree: Getting Started, Guides, API Reference, and an Optional section for the changelog and migration notes. Lead with the install-and-first-run path, because that is what most model-mediated questions about a dev tool are really asking. Link to Markdown versions of pages if your platform serves them. A model helping someone integrate your SDK will lean on this file constantly, and this is the one case where consumption today is real, because coding assistants and IDE agents fetch docs on demand.
Ecommerce and product catalogs. You are not going to list 40,000 SKUs, and you should not try. Curate at the category and information level. Sections like Shop by Category with links to your main collection pages, a Buying Guides section for your best editorial content, and an Info section for shipping, returns, sizing, and warranty, the pages a shopping agent needs to answer practical questions. Your blockquote should state what you sell and what makes you distinct in one honest line. Save the individual-product detail for structured data and a proper product feed. llms.txt is the store directory, not the shelf.
Publishers and media. Your value is topical authority and your best evergreen pieces, not your firehose of daily posts. Build sections around your core topics or verticals, each linking to your strongest pillar articles, and use the Optional section for archives. Lead with the pieces that define your point of view, the ones you would want a model to cite when someone asks about your beat. Include your about and editorial-standards pages so a model can attribute you with confidence. Resist listing every article. A publisher's llms.txt is a greatest-hits record, not a back catalog.
Personal sites and portfolios. This is the highest-value case for the smallest sites, and it is exactly why this article lives on a personal blog. A short llms.txt lets a model understand who you are, what you do, and what to point people at when your name comes up. One blockquote of identity, a section of your best writing, a section for your work or projects, and a contact link. That is the complete file, and it may be the single most efficient thing a solo professional can publish for AI discovery.
A word on SaaS and B2B products specifically, since they sit between docs and marketing. Your llms.txt should point at the pages a prospect or their AI assistant would actually need to evaluate you: what the product does, who it is for, how pricing works, and where the docs live. Lead with a crisp what-it-does page, include pricing because model-mediated buyers ask about it constantly, and link your docs root so a technical evaluator can go deeper. Skip the press releases and the careers page. The question a model is answering on your behalf is usually should I recommend this tool, and your file should make that easy to answer honestly.
Nonprofits, local businesses, and service firms follow the same logic with different nouns. A law firm points at practice-area pages and an about page that establishes credentials. A restaurant points at its menu, hours, and reservations. A nonprofit points at what it does, how to donate, and its impact reporting. In every case the move is identical: ask what a person would want to know if they came to you through a model instead of a browser, and put exactly those pages first with honest one-line descriptions. The vertical changes the vocabulary. It does not change the method.
The through-line across all four is the same discipline. Match your sections to how a model-mediated user would navigate your value, lead with your strongest material, describe each link in the words a user would ask with, and stop well before you have listed everything. The site type changes the sections. It never changes the discipline.
The llms-full.txt variant
There is a companion file worth knowing: llms-full.txt. Where llms.txt is a map of links, llms-full.txt is the territory. It inlines the actual content of your key pages into one long Markdown file, so a model can ingest everything in a single fetch without following any links at all.
The reasoning is straightforward. Following links costs round trips, and some retrieval pipelines cannot or will not chase them. If you concatenate your important documentation into one clean Markdown document, a model that fetches it once has your whole story in context immediately. For a focused docs set, this is genuinely useful. Anthropic, for example, publishes both files for its developer docs, a slim llms.txt index and a fat llms-full.txt that carries the expanded content.
The tradeoff is size. A full file can run to hundreds of thousands of tokens for a large documentation set, which can exceed a model's context window or simply cost too much to feed on every query. So the two files serve two modes. llms.txt is for a model that wants to navigate and fetch selectively, the way you would use a table of contents. llms-full.txt is for a model or workflow that wants to load everything at once and reason over the whole corpus, the way you would hand someone the entire manual.
Most sites should start with llms.txt alone. Add llms-full.txt when your content is bounded and coherent enough that one file makes sense, documentation being the obvious case, and when you have a way to generate it automatically. You do not hand-write llms-full.txt. You generate it from your source content in a build step, the same way you generate a sitemap, so it stays in sync. Answer.AI's tooling can expand an llms.txt into a full context blob, which is essentially this file produced on demand.
Two cautions. First, staleness is more dangerous here than in the index file, because a full file that drifts out of date feeds a model a large body of wrong content in one shot. Automate its generation or do not publish it. Second, do not confuse llms-full.txt with a dump of your entire site. It should still be curated to your important content, just expanded rather than linked. The difference between llms.txt and llms-full.txt is inline versus linked, not selective versus everything. Both stay disciplined about what belongs.
There is a useful middle ground some teams adopt: per-section full files. Instead of one enormous llms-full.txt covering everything, you publish smaller full files scoped to a topic, so an agent working on billing can load the billing content in full without pulling in your entire API reference. This keeps each file inside a comfortable token budget while still offering the load-everything convenience for a bounded area. It is more work to maintain, so it only makes sense at real scale, but for large documentation sets it is the pattern that keeps the full-content option viable without blowing past context limits.
Think about the two files as serving two different reading strategies a model might use. One strategy is retrieval: figure out which few pages are relevant, fetch only those, reason over them. llms.txt is built for that, because it is an index. The other strategy is full-context: load the whole corpus and let the model find what it needs internally. llms-full.txt is built for that. Neither is universally better. Retrieval scales to huge sites but can miss cross-cutting connections; full-context catches everything but hits a size ceiling. Offering both lets a consumer pick the strategy that fits its budget and task, which is exactly the kind of flexibility a good publisher provides.
If you are a small site or a personal blog, you almost certainly do not need llms-full.txt. Your llms.txt plus clean, parseable pages is plenty. Reach for the full variant when you run bounded documentation that agents actively consume and you can generate it cleanly. Otherwise it is weight you will forget to maintain.
Who reads it today, and the honest limits of adoption
This is the part most guides skip, and it is the part a skeptical practitioner cares about most. Who actually reads llms.txt in 2026, and does it move anything.
Start with the publisher side, which is thriving. A large and growing number of sites publish these files. Documentation platforms like Mintlify auto-generate llms.txt and llms-full.txt for every site they host, which pushed adoption into the thousands almost overnight. Anthropic, Cursor, Stripe-style dev-tool companies, and a long tail of open-source projects publish them. There is a healthy directory ecosystem cataloging who has one. On the supply side, this convention is real and spreading.
The consumption side is where you need clear eyes. No major model provider has publicly confirmed that they crawl llms.txt across the open web and use it to influence training or answers at scale. Google has been the most direct: John Mueller compared it to the old keywords meta tag and said Google does not use llms.txt, and Google's crawlers were not observed fetching it in server logs. OpenAI and Anthropic have not announced automated, web-wide consumption of the file for their base models either. So if your hope is that publishing llms.txt will get you cited by ChatGPT tomorrow, temper it. That mechanism is not confirmed to exist.
Where it does get read is more specific and, in my view, more interesting. Agentic tools and coding assistants fetch these files on demand. When a developer points an IDE agent at your docs, or a user tells an assistant to use your site, the tool often looks for llms.txt first because it is the cheapest way to orient. Retrieval and RAG pipelines that a team builds around your content can be told to prefer it. Anywhere a model is explicitly aimed at your site rather than passively trained on the web, llms.txt is a clean front door that gets used. That is a real and growing surface, even if it is not the ambient-crawl surface people imagine.
So the honest verdict is this. llms.txt is a low-cost, high-optionality bet, not a proven ambient ranking channel. It is confirmed useful in on-demand and agent contexts today. It is unconfirmed and probably not used in base-model web crawling today. And it is early enough that first movers pay almost nothing to be positioned if consumption broadens, which the trajectory of every other web convention suggests it eventually might.
Separate two claims that often get blurred together, because the blurring is where the hype lives. Claim one: sites are publishing llms.txt in growing numbers. That is true and easy to verify. Claim two: publishing llms.txt causes measurable gains in AI visibility. That is not established, and anyone selling it as a settled fact is ahead of the evidence. Both things can be true at once: the convention is spreading, and its payoff is still mostly potential rather than proven. Hold both in your head and you will make good decisions about it instead of either dismissing it or overinvesting.
I also want to name the reasonable skeptic's position fairly, because it is not wrong. The skeptic says: if the big providers are not confirmed to consume this at scale, why bother, and is this not just SEO snake oil in a new wrapper? The honest answer is that the skeptic is right about the present and possibly wrong about the near future. Today, the confirmed value is narrow. But the cost is so low, and the direction of travel toward agent-mediated access so clear, that the expected value still comes out positive even after you discount heavily for uncertainty. This is not a case where you need to believe the hype to justify the action. The action is cheap enough that mild optimism suffices.
I ship them anyway, and I recommend you do too, for three reasons. It takes twenty minutes. It cannot hurt, because it is additive and controls nothing. And the moment your content is being used by an agent, a coding tool, or a RAG system, which is happening more every month, this file is the difference between a clean orientation and a model guessing. You are not betting the farm. You are buying cheap insurance on a trend that is clearly moving in one direction.
Where it fits in a GEO and AEO strategy
llms.txt is one layer in a stack, and it is not the load-bearing one. If you are serious about being found and cited by AI systems, you are working on Generative Engine Optimization and Answer Engine Optimization, and llms.txt is a modest supporting player in both. Put it in its place and it earns its keep. Treat it as the whole strategy and you will be disappointed.
GEO, the work of getting cited by ChatGPT, Claude, Gemini, and Perplexity, is won mostly by things llms.txt does not touch. Original points of view the model has not seen elsewhere. Proprietary statistics and concrete numbers that make good citations. Long-form depth, because 2,000-word pieces get included at higher rates than thin snippets. Consistent entity signals, so the model knows your brand is one brand across the web. Author and organization credibility. No paywalls on the content you want cited. llms.txt supports this by making your best content easy to find once a system is looking, but it does not create authority. The content does.
AEO, ranking inside answer engines and AI Overviews, is won by extractability. A direct-answer TL;DR at the top of every page. FAQPage schema with questions phrased the way people actually ask. Comparison tables, which these surfaces love. Concrete numbers over vague claims. Fresh last-updated stamps. llms.txt again plays a supporting role: it points a model at the pages where those extractable answers live, but the extractability itself comes from how you structure each page.
So the correct priority order is unambiguous. First, publish genuinely useful, original, well-structured content. Second, mark it up with real structured data: Article, FAQPage, Product, Organization, author Person schema. Third, keep your entity consistent and your crawl paths clean. Then, and only then, add llms.txt as the curated index that ties it together for AI readers. Doing llms.txt while skipping the first three is like printing a beautiful table of contents for a book you never wrote.
Where llms.txt genuinely adds value in this stack is discoverability and orientation for AI consumers specifically. A model or agent that has decided to use your site gets an instant, clean answer to what should I read, which improves the odds that it fetches your strongest, most citable pages instead of stumbling into your least representative ones. That is a real edge at the margin. It is just a margin on top of the fundamentals, not a substitute for them.
There is a sequencing trap I see teams fall into, and it deserves a flag. Because llms.txt is new and interesting, it attracts attention out of proportion to its impact, and a marketing team will sometimes spend a sprint perfecting it while the actual content is thin and the schema is missing. That is effort spent on the roof of a house with no walls. The discipline is to earn your way to llms.txt. Once your pages are genuinely useful, marked up, and consistent, the file is a natural capstone that takes an afternoon. Before that, it is a distraction dressed up as progress.
The flip side is that llms.txt composes so cleanly with the rest of the stack that once you have done the fundamentals, skipping it is silly. The same curated list of your best pages that you write for llms.txt is useful for your internal linking, your sitemap prioritization, and your own clarity about what your site is actually for. Writing one often surfaces the uncomfortable truth that half your pages are not worth pointing anyone at, which is a useful thing to learn. In that sense the exercise pays off even if no model ever reads the file, because it forces the editorial judgment that good sites need anyway.
My rule of thumb: llms.txt is the last 5 percent, not the first 50. Ship it, because the last 5 percent is cheap and it composes cleanly with everything else. But if you have not done the content and schema work, close this article and go do that first. This file makes good content easier for AI to use. It cannot rescue content that is not there.
The full crawler-file stack: how the root files compose
llms.txt does not live alone at your root. It is one of a small set of files that together tell machines how to treat your site, and they compose cleanly once you know what each is for. Getting the whole stack right is a half-day of work that pays off across every AI surface.
robots.txt is the gatekeeper. It sets crawl permissions for all bots and points to your sitemap. This is where you allow or disallow specific AI crawlers by user-agent if you want to, though many teams split training-crawler policy into a dedicated file.
ai.txt is the training-policy file. Modeled on robots.txt, it declares which AI training crawlers may use your content: GPTBot, ClaudeBot, Google-Extended, PerplexityBot, CCBot, and others. This is your opt-in or opt-out for model training specifically, and it is the file that actually controls AI access. If you want to be in the training data, allow them here. If you do not, disallow them here. Note the clean division of labor: ai.txt controls training access, llms.txt describes content for reading. One is policy, one is a map.
sitemap.xml is the exhaustive index for search engines, the full list of every URL you want discovered and crawled.
llms.txt is the curated reading guide for AI models and agents, the file this whole article is about.
Then structured data, your schema.org markup, sits inside your pages rather than at the root, but it is part of the same machine-readability effort. Article, FAQPage, Product, and Organization schema tell a model what each page means in a structured way, and PotentialAction schema tells an agent what it can do on a transactable page. Where llms.txt is prose-level orientation, schema is field-level precision. You want both. The prose tells a model where to look; the structured data tells it exactly what it found.
The pattern to internalize is that these files answer non-overlapping questions, so you are never choosing between them. May you crawl this is robots.txt. May you train on this is ai.txt. Where is everything is sitemap.xml. What is worth reading is llms.txt. What does this specific thing mean is schema. Ship all five, keep them consistent with each other, and a machine arriving at your site has a complete, unambiguous picture from the first request.
A contradiction I catch often is worth calling out specifically: a site disallows GPTBot or ClaudeBot in robots.txt or ai.txt, then publishes a lovingly curated llms.txt hoping to be read by exactly those systems. You cannot slam the door and set out a welcome mat at the same time. Decide your posture first. If you want AI systems to use your content, allow their crawlers and then hand them a good map. If you want to keep them out, do that cleanly and skip the map. The files must agree, because a machine reads all of them and a contradiction just makes you look confused.
For a small site, the whole stack is a single afternoon. robots.txt allowing the crawlers you want and pointing to your sitemap. sitemap.xml generated by your platform. ai.txt stating your training posture per crawler. llms.txt with your handful of best pages. schema.org markup on your key templates. None of these is hard individually, and the payoff is that a model arriving from any direction, ambient crawl, agent fetch, or retrieval pipeline, finds a coherent and consistent picture. Coherence across the stack is itself a quality signal. A site whose machine-readable files all tell the same story reads as maintained and trustworthy, which is exactly the impression you want a model to form.
The most common failure I see is treating any one of these as the whole answer. A site with a beautiful llms.txt but no schema, or great schema but a robots.txt that accidentally blocks the AI crawlers it wants, has a broken stack. These files are a set. Audit them together, not one at a time, and make sure a permission you set in one is not contradicted by a description you wrote in another.
Validating and maintaining it
A wrong or stale llms.txt is worse than none, because it actively misdirects a model that trusts it. So the maintenance discipline matters as much as the initial authoring. It is light, and most of it can be automated.
Start with validation. There is no official W3C-style validator, because this is a community convention rather than a formal standard, but you have several practical checks. Answer.AI ships an llms_txt package in Python and JavaScript that parses a file into a structured object. If it parses cleanly, your structure is valid: H1 present, blockquote well-formed, sections and links correctly shaped. Run any Markdown linter over the file to catch broken syntax. Then run a link checker across every URL in the file, because dead links are the fastest way to burn a model's trust and yours. There are also community web validators and a VS Code preview extension that render the file the way a consumer would parse it.
The checks that matter most are the ones a linter cannot do. Does every link still resolve. Does each description still match what the page actually says. Did a page you feature get moved, merged, or deprecated. Is anything important missing because you shipped new flagship content and forgot to add it. These are editorial checks, and they are the reason a curated file exists, so they cannot be fully automated away. Put a human eye on the file whenever your key content changes.
Automate what you can. The most robust setup generates llms.txt from a source of truth in your build pipeline, the same way you generate sitemap.xml, so it never drifts. If you hand-maintain it, add a CI check that fails the build when any URL in llms.txt returns a non-200, which catches the most common rot before it ships. Keep the file's list roughly consistent with your sitemap's most important entries, so the two root files tell the same story rather than contradicting each other.
Set a cadence. I treat llms.txt like any other high-value, low-churn asset: touch it whenever flagship content changes, and review it in full on a quarterly audit alongside the rest of the crawler stack. That is enough for most sites. A docs site that ships constantly should generate it automatically and forget about it; a personal site can review it by hand twice a year. Match the effort to how fast your content moves.
A quick sanity read is worth doing too, and it costs nothing. Open your published llms.txt in a browser and read it as if you were a model landing on it cold, knowing nothing about your site. Does the blockquote tell you what this is? Do the sections make sense in order? Would the descriptions help you pick the right page for a real question? If any answer is no, fix it before you worry about tooling. The most valuable validator is a careful human reading the file the way its intended audience will, because the failures that matter most are failures of judgment, and no linter checks for those.
One habit worth building: whenever you publish a piece good enough that you would want a model to cite it, add it to llms.txt in the same commit. That single reflex keeps the file current with almost no dedicated maintenance, because the update happens at the exact moment you have the context. A file maintained this way stays a trustworthy map. A file updated in occasional cleanups slowly becomes a museum of pages that no longer exist.
The mistakes I see most
Most llms.txt files I audit fail in one of a handful of predictable ways. None are hard to avoid once you have seen them, so this is the list I check against.
Dumping the sitemap. The single most common mistake. Someone exports every URL and pastes it in, producing a 500-link file with no descriptions. That is not an llms.txt, it is a sitemap in Markdown, and it defeats the entire purpose of curation. If you would not personally point a model at a page, leave it out.
Writing marketing fluff instead of descriptions. "The industry-leading platform trusted by teams everywhere" tells a model nothing it can act on. Descriptions exist to help a model decide what to fetch. Every clause should carry information a reader could use to make that decision. If you deleted the sentence, would a model be any worse at choosing? If not, rewrite it.
Letting it go stale. A file that points at pages that moved, got renamed, or no longer exist is worse than no file, because a model that trusts it fetches dead ends and forms wrong impressions. Stale is the failure mode that quietly grows over time, which is exactly why the on-publish habit and the CI link check matter.
Putting it in the wrong place. It must be at the root, at yoursite.com/llms.txt, alongside robots.txt. In a subfolder or under a path, nothing will find it. This sounds too obvious to mention until you have watched a carefully written file sit at /docs/llms.txt where no consumer looks for it.
Treating it as access control. llms.txt does not allow or block anything. If you put a page in it, you are not granting access; if you leave one out, you are not hiding it. Access is a robots.txt and ai.txt job. People occasionally leave sensitive pages out of llms.txt thinking that protects them, which it does not at all.
Skipping the fundamentals and expecting magic. A perfect llms.txt on a site with thin content, no schema, and JavaScript-only rendering will not get you cited. This file is the last 5 percent, and it only works stacked on real content and structured data. If you came here hoping llms.txt alone would fix AI visibility, that is the mistake underneath all the others.
Copying someone else's file without adapting it. Because good examples are public, it is tempting to grab a well-known company's llms.txt and swap the names. The structure is fine to borrow; the content never is. Their sections reflect their site, their priorities, their audience. A borrowed file points a model at pages that do not exist on your domain and describes them in language that does not match what you actually offer. Learn the shape from good examples, then write your own from your own pages. The file is only as useful as the judgment you personally put into it.
Forgetting the file exists after you ship it. This is the quiet killer. llms.txt is not a set-and-forget artifact any more than a sitemap is, but because nothing visibly breaks when it goes stale, it slips off the maintenance radar. Six months later it points at three renamed pages and omits your two best new pieces, and you have no idea, because there is no error message for a stale map. The fix is process, not heroics: tie updates to your publishing workflow so the file changes when your content does, and put it on the quarterly audit list so someone lays eyes on it on a schedule.
Over-engineering a tiny site. The opposite failure. A personal blog does not need llms-full.txt, six sections, and a generation pipeline. One blockquote, a short list of your best pages, and a contact link is a complete and excellent file. Match the ambition of the file to the size of the site.
A complete worked example
Theory is cheap, so here are two real files you can adapt line by line. Read them as literal Markdown: each bullet below is one line of the file.
First, a SaaS documentation site. This is the canonical use case, and it shows every part of the format working together. The file opens with the required H1 and a blockquote summary, adds one line of free orientation, then groups curated links under H2 sections, and pushes the skippable material into an Optional section:
- # Acme Analytics
- > Acme Analytics is an open-source, privacy-first product analytics library for Python and JavaScript. Install in two lines, self-host in minutes, and track events without shipping user data to third parties.
- Docs are written to be read top to bottom by newcomers and searched by reference by veterans. Start with the quickstart, then the core concepts.
- ## Getting Started
- - Quickstart: install the SDK, send your first event, and see it in the dashboard in under five minutes
- - Core concepts: events, properties, identities, and how Acme models a user session
- - Self-hosting: run Acme on your own infrastructure with Docker or a single binary
- ## Guides
- - Tracking a funnel: instrument a multi-step flow and measure drop-off
- - Privacy and compliance: GDPR, data residency, and PII-safe event design
- ## API Reference
- - JavaScript SDK: full method reference for the browser and Node client
- - Python SDK: full method reference for the Python client
- - HTTP API: the raw event ingestion endpoint and auth
- ## Optional
- - Changelog: version history and breaking changes
- - Migration from v1: upgrade notes for existing users
Notice what that file does. The blockquote is concrete and quotable. Every link points at a .md version, so the destinations are as clean as the map. Descriptions say what and why in one clause. The must-reads are up top and the nice-to-haves are in Optional, so a token-constrained model can drop the last two links and still understand the product.
Now a personal site, which is the pattern most readers of this blog should copy. It is deliberately tiny by design:
- # Frederick Sona
- > Full-stack eCommerce and growth leader and creator of Search Everywhere Optimization, a method for ranking across all 19 modern discovery surfaces from Google to ChatGPT, Claude, and Gemini.
- ## Writing
- - The 19 ranking surfaces: the full map of modern discovery surfaces and how to rank on each
- - Get cited by AI: how to be referenced by ChatGPT, Gemini, and Claude
- - llms.txt, the complete guide: what the AI-readability standard is and how to author one
- ## About
- - About and contact: who Frederick is and how to get in touch
That file is a handful of substantive lines and it does everything a personal site needs: it states identity in a quotable blockquote, points a model at the three pieces most worth citing, and gives a way to make contact. It took five minutes to write. If a coding assistant, a research agent, or a RAG pipeline is ever pointed at this domain, it now has a clean, honest answer to who is this and what should I read. The format promises exactly that, delivered in a file you could type from memory.
What is next for the standard
Predicting standards is a good way to look foolish later, but the trajectory here has enough shape to reason about. A few things seem likely, and a few are worth watching.
The convention will keep spreading on the supply side regardless of what any single model provider decides, because the cost of publishing is near zero and documentation platforms auto-generate it. When Mintlify and its peers ship these files by default, adoption compounds without any individual team choosing it. Supply-side ubiquity is close to a foregone conclusion. The open question is always demand: will the big model providers consume it in ambient crawling, not just on-demand.
My read is that on-demand consumption grows first and fastest, because that is where the value is already concrete. Coding assistants, IDE agents, research tools, and enterprise RAG systems have a clear reason to fetch a clean index of a site they have been aimed at, and they are multiplying. Ambient, web-wide use in base-model training is the slower and less certain path, partly because providers are cautious about publisher-supplied signals they cannot verify, which is exactly the concern Google voiced. I would not build a strategy on ambient crawl arriving. I would build one on agents and retrieval tools, which are here now.
Watch the overlap with the Model Context Protocol. MCP lets a site expose itself as a set of tools an agent can call directly, bypassing the page entirely. llms.txt and MCP are complementary: llms.txt is the readable description an agent reads to orient, and MCP is the callable surface it uses to act. As agent-mediated tasks grow, I expect these two to be discussed together, with llms.txt as the front-door description and MCP as the action layer behind it. A site serious about being agent-ready in 2027 will likely have both.
Standardization is the other thread. Today llms.txt is a community convention with a reference spec, not an IETF or W3C standard. If consumption broadens, expect pressure toward formalization: a stricter grammar, an official validator, maybe conventions for versioning and signing so a consumer can trust the file has not been tampered with. Formalization would raise the ceiling on what these files can safely be used for, especially for agent actions where trust matters.
There is a scenario worth taking seriously where llms.txt matters far more than it does today: agent-mediated commerce and tasks becoming the default way people interact with services. If a meaningful share of bookings, purchases, and support requests start flowing through agents acting on a user's behalf, then the sites those agents can read and act on cleanly become the defaults, and the sites they cannot become invisible in a way that is much harder to recover from than a search-ranking slump. In that world, a clean llms.txt paired with real agent actions is not a nice-to-have; it is table stakes, the way a mobile-responsive site became table stakes after smartphones. We are not there yet. But the groundwork is being laid now, and the files are cheap to put down early.
I would also not be surprised to see the reverse pressure emerge: consumers demanding proof that a file is authentic before they trust it for actions. The moment agents start acting on what a site declares, the incentive to lie in these files appears, and the ecosystem will need signing or verification to keep them trustworthy. That is a good problem to have, because it means the files are being used for something that matters. Watch that space. If verified llms.txt becomes a thing, it will be because the unverified version proved useful enough to be worth attacking.
My honest bet, so you can hold me to it: within a couple of years, publishing a clean llms.txt will be as unremarkable as publishing a sitemap: something every competent site simply has, even if no one can prove it moved a specific metric. The downside of adopting early is twenty minutes. The downside of adopting late, if agent and retrieval consumption becomes the default path to your content, is being the site a model has to guess about while your competitors hand it a map. I know which side of that bet I want to be on, and it is why this file exists on my own domain. Ship yours, keep it honest and current, and stack it on real content and schema. Those three moves are the whole play.
Frequently asked questions
What is an llms.txt file?
It is a Markdown file at your website root, at yoursite.com/llms.txt, that gives AI models a short, curated map of your most important content. Each entry links to a key page with a one-line description. It exists because raw HTML is noisy and context windows are limited.
Where does llms.txt go?
At the root of your domain, the same place robots.txt and sitemap.xml live, for example fredericksona.com/llms.txt. If you put it in a subfolder, consumers will not find it. Root placement is part of what makes it discoverable.
Is llms.txt an official standard?
No. It is a community convention proposed by Jeremy Howard of Answer.AI in September 2024, with a reference spec at llmstxt.org. It is not an IETF or W3C standard yet, though adoption is growing and formalization may follow if consumption broadens.
Does llms.txt replace robots.txt or sitemap.xml?
No, they do different jobs. robots.txt controls crawl access, sitemap.xml is an exhaustive URL index for search engines, and llms.txt is a short curated reading guide for AI models. Keep all three; they do not overlap.
Do ChatGPT, Claude, and Google actually read llms.txt?
On demand, often yes: agents, coding assistants, and RAG pipelines fetch it to orient when pointed at your site. For ambient, web-wide crawling into base models it is unconfirmed, and Google has said it does not use the file.
What is the difference between llms.txt and llms-full.txt?
llms.txt is a map of curated links. llms-full.txt inlines the actual content of your key pages into one long Markdown file so a model can ingest everything in a single fetch. Use the full variant for bounded documentation you can generate automatically; most sites only need llms.txt.
How long should llms.txt be?
Short and curated. For most sites, five to thirty links total, each with a one-line description, grouped under a few H2 sections. If you are pasting hundreds of URLs, you are building a sitemap, not an llms.txt, and defeating the purpose.
What is required in an llms.txt file?
Only one thing: a single H1 with your site or project name. A blockquote summary is strongly recommended, and H2 sections with link lists form the useful body. A special section titled Optional marks links a model can skip under a tight token budget.
Will llms.txt get my content cited by AI?
Not by itself. Citations come from original, useful, well-structured content plus schema and consistent entity signals. llms.txt supports that by making your best pages easy for an AI to find once it is looking, but it is the last 5 percent of the work, not the first 50.
How do I validate and maintain llms.txt?
Parse it with Answer.AI's llms_txt tooling, lint the Markdown, and run a link checker so every URL returns a 200. Add flagship pages the moment you publish them, and review the whole file on a quarterly audit. A stale file that points at dead pages is worse than none.
Should a small personal site bother with one?
Yes, it is one of the highest-value moves a solo professional can make.
Does llms.txt control if AI can train on my content?
No. llms.txt only describes content; it grants and blocks nothing. Training access is controlled by robots.txt and ai.txt, where you allow or disallow specific AI crawlers like GPTBot, ClaudeBot, and Google-Extended by user-agent.
I'm Frederick Sona, and I've spent most of my career chasing one question: why do some brands break through while others, often the better ones, don't? I've looked for the answer as a marketer, a designer, a technologist, a salesperson, and a founder, and the honest answer is that it takes all of it: being easy to find, easy to trust, and easy to buy from. Search Everywhere Optimization is one piece of how I think about that, but this blog covers the whole picture, from search and technology to brand, design, and the work of turning attention into revenue. If any of this was useful, come say hello at fredericksona.com.