Skip to content

How to create an llms.txt: structure, example and an honest assessment

How to create an llms.txt: the structure set out in the spec, a full example, publishing it in the right place and what it really does for you with AI.

Written by
Updated
8 min read

Also available inNederlandsDeutschEspañol

In this article
  1. What is llms.txt?
  2. How is an llms.txt structured?
  3. Example: an llms.txt for an HR consultancy
  4. How do you publish an llms.txt?
  5. What often goes wrong?
  6. Do AI systems actually use llms.txt?
  7. Is llms.txt worth it?
  8. How to check this on your own site
  9. Frequently asked questions

An llms.txt is a Markdown file in the root of your website that tells language models in a few lines what your site is and which pages matter. You can create one in fifteen minutes: a title, a short summary and a few lists of links. Whether AI systems actually read the file is less certain. We discuss that honestly further down.

This article is part of our complete guide to GEO, which explains GEO (Generative Engine Optimization) more broadly. Here we focus only on llms.txt: what it is, how to structure it according to the specification, how to publish it and what you can expect from it.

You'll get a complete example for a fictional consultancy that you can adapt straight away. After that come the mistakes we see most often, the biggest trap being an HTML error page posing as an llms.txt.

What is llms.txt?

llms.txt is a proposal for a text file at /llms.txt that gives an LLM (large language model, the language model behind tools like ChatGPT) a concise, easy-to-read entry point to your website. The proposal comes from Jeremy Howard, co-founder of Answer.AI and fast.ai, and has been published on llmstxt.org since September 2024. The current version is v2, which according to the site was updated based on two years of experience in practice.

The idea is simple. A web page is full of navigation, cookie banners, scripts and styling. A language model has limited space in its context and has to fish the content out of all that. An llms.txt puts the essentials in plain Markdown in one place: who you are, what you do and where the most important information is.

Worth knowing: llms.txt is not an official web standard like robots.txt, which is defined in RFC 9309. It's a proposal that anyone can follow or ignore, including the AI companies themselves.

robots.txtllms.txt
PurposeControlling crawler accessSummarising content for language models
StatusInternet standard (RFC 9309)Proposal on llmstxt.org
FormatIts own rule syntaxMarkdown
If it's missingCrawlers may fetch everythingNothing, the model reads your pages itself

If you want to control which bots may read your site, you need robots.txt. We cover that in AI crawlers in robots.txt.

How is an llms.txt structured?

An llms.txt follows a fixed order of Markdown elements, of which only the H1 with the name of your site or project is required. The specification on llmstxt.org describes this structure:

  1. An H1 with the name of your site or project. This is the only required element.
  2. A blockquote with a short summary of your site or project.
  3. Zero or more blocks of free text, such as paragraphs or lists, but without headings. This is where you add extra explanation, for example who you work for or what you don't do.
  4. Zero or more H2 sections with a list of links. Each item is a Markdown link [name](url), optionally followed by a colon and a short description.

An H2 named "Optional" has a special role. According to the specification, it's a convention for secondary information: links an agent can skip when space is tight. In v1, tools had to leave that section out automatically. In v2 it's only a convention, as the changes page explains.

The file doesn't have to sit in the root. v2 also allows files in a subfolder, such as /docs/llms.txt. A file like that applies to all URLs under that path, and if several files apply, an agent should use the most specific one.

Markdown versions of your pages

The specification also suggests offering a clean Markdown version of important pages at the same URL with .md appended, for example /services.html.md or /services.md. Since v2, you can make those versions discoverable with a <link> element or an HTTP Link: header: rel="alternate" type="text/markdown" points to the Markdown version, and rel="describedby" to the llms.txt that describes the page. This is an extra step. For a typical business website, the llms.txt itself is the starting point.

What about llms-full.txt?

llms-full.txt is a variant that doesn't just link to your pages but bundles their full text into a single file. It isn't in the specification on llmstxt.org. It's mainly found on documentation platforms: Mintlify, for example, generates it automatically and includes the title, URL, description and full Markdown content of each page.

For a documentation site with hundreds of pages, that can be useful, because a developer can hand the whole file to an AI assistant in one go. For a service business with twenty pages, it adds little and is mostly one more thing to maintain.

Example: an llms.txt for an HR consultancy

Below is a complete example for a fictional company. The example is made up: the company name, the domain and all details don't exist. Use it as a template and replace everything with your own content.

# Linden HR Advisory

> Linden HR Advisory is a fictional HR consultancy based in Bristol that helps
> small and medium-sized businesses with 10 to 250 employees with absence
> policy, employment law and organisational development. Area served:
> United Kingdom. Language: English.

We work exclusively for employers, not for individual employees.
An initial 30-minute consultation is free of charge. Rates are listed on
the Rates page.

## Services

- [Absence management](https://www.lindenhr.example/services/absence): Support from the first sick day through to return to work
- [Employment law advice](https://www.lindenhr.example/services/employment-law): Advice on contracts, dismissal and settlement agreements
- [Organisational development](https://www.lindenhr.example/services/organisation): Restructuring teams, job frameworks and appraisal cycles

## About the company

- [About us](https://www.lindenhr.example/about-us): Team, background and approach
- [Rates](https://www.lindenhr.example/rates): Hourly rates and fixed prices per service
- [Contact](https://www.lindenhr.example/contact): Address, phone number and opening hours

## Knowledge base

- [Writing an absence policy](https://www.lindenhr.example/knowledge/absence-policy): Step-by-step plan with required elements
- [Probation and dismissal](https://www.lindenhr.example/knowledge/probation): What is and isn't allowed during a probation period

## Optional

- [Vacancies](https://www.lindenhr.example/vacancies): Open positions at the consultancy
- [News](https://www.lindenhr.example/news): Announcements and events

Note a few choices in this example. The summary names the target audience, location and area served in plain sentences, so a model can correctly place the consultancy as an entity. The free text sets boundaries ("not for individual employees") that stop an AI answer from recommending the consultancy for the wrong question. And the least important pages sit under "Optional".

In your own file, use absolute URLs and link only to pages that exist and can be reached without logging in.

How do you publish an llms.txt?

You publish an llms.txt as plain text at https://www.yourcompany.com/llms.txt, so the file is returned directly with status code 200. Here's how:

  1. Write the file in a text editor and save it as llms.txt in UTF-8.
  2. Put it in the root of your website, next to robots.txt. In WordPress you can do this via FTP, your hosting control panel or an SEO plugin. The specification lists Yoast SEO and AIOSEO among its integrations, along with Wix, Mintlify and GitBook.
  3. Check the content type. The specification doesn't prescribe a MIME type. text/plain or text/markdown, with charset=utf-8, are the logical choices. When we checked in October 2026, the files from llmstxt.org and from the developer documentation of Anthropic and OpenAI were served as text/plain; charset=utf-8.
  4. Open the URL in your browser and check that you see exactly your Markdown, with no styling, menu or error message around it.

What often goes wrong?

The most common mistake is that /llms.txt returns an HTML page instead of the file. Many websites, especially sites built on a JavaScript framework or a CMS with "pretty" error pages, catch every unknown URL and show a styled 404 page. Sometimes even with status code 200. A tool that checks whether the file "exists" then sees a successful response, while the content is just HTML.

You can spot this with one command in the terminal:

curl -I https://www.yourcompany.com/llms.txt

If content-type shows something like text/html, you're getting a web page back, not an llms.txt. Other mistakes we come across regularly:

  • No H1 on the first line, for example because there's a title without # or an empty introduction.
  • Links without Markdown formatting, such as bare URLs in a list. Then the name that tells the model what's behind the link is missing.
  • A redirect to the homepage instead of to the file.
  • Outdated links to pages that now return a 404 or have moved.
  • Marketing language in the summary. "The best partner for all your HR needs" doesn't help a model. Facts about your audience, offering and area served do.
  • An llms.txt behind a firewall that blocks AI bots. Then no crawler can read it; see AI crawlers in robots.txt.

Do AI systems actually use llms.txt?

There is no public evidence that the major AI search engines use llms.txt to decide which sources to cite. Who publishes the file and who reads it are two separate questions.

On the publishing side, adoption is growing. According to llmstxt.org, thousands of sites publish an llms.txt, including OpenAI, Anthropic and Gemini for their developer documentation. Platforms such as Mintlify, GitBook, Wix and the WordPress plugins Yoast SEO and AIOSEO can generate the file. The site also reports that Lighthouse, the audit tool in Chrome, checks whether a site has an llms.txt.

On the reading side, Google is explicitly cautious. John Mueller, Search Advocate at Google, wrote on Bluesky in June 2025 that, as far as he knew, no AI system uses llms.txt. And the documentation on AI features in Google Search says you don't need to create new machine-readable files or AI text files to appear in AI Overviews or AI Mode.

As far as we can tell, OpenAI, Anthropic and Perplexity have not documented that their search bots use llms.txt when choosing sources. They do publish the file for their own documentation. That's not the same as reading it on other sites.

Where llms.txt demonstrably is used is manually: developers who give an llms.txt or llms-full.txt to a coding assistant, and AI agents that are already on a site and looking for their way around. That's also what the proposal was originally intended for.

Is llms.txt worth it?

llms.txt is little work with an uncertain effect, which makes it worth trying as long as your basics are already in order. A good file takes fifteen minutes to an hour. It can't hurt, but it doesn't replace anything.

The basics that demonstrably do count look like this:

  • Allowing AI crawlers, such as GPTBot and OAI-SearchBot, in robots.txt and in your firewall.
  • Content in the HTML itself, via server-side rendering, so crawlers that don't run JavaScript can read your text.
  • Structured data that makes clear who you are; see schema markup for AI.
  • Pages that answer questions clearly, with sources, an author and a date.

A useful side benefit of creating an llms.txt: you have to write down in a few sentences what your company does and which pages matter most. You can reuse that summary straight away on your about page and in your Organization schema.

How to check this on your own site

Five steps tell you whether your llms.txt works as intended:

  1. Open https://www.yourcompany.com/llms.txt and check that you see plain Markdown.
  2. Use curl -I to check that the status code is 200 and the content type is text/plain or text/markdown.
  3. Check that the first line is an H1 (# Name) and that a blockquote with a summary follows directly after it.
  4. Go through every link: no 404s, no redirects to the homepage and no pages behind a login.
  5. Schedule a regular check, for example every quarter, so new and moved pages are included.

Flowproof's free scan checks the structure of your llms.txt (H1, blockquote summary, H2 sections, Markdown links and content type), along with your AI crawlers in robots.txt, your structured data and whether your content is in the raw HTML.

Frequently asked questions

Is llms.txt the same as robots.txt?

No. robots.txt tells crawlers which parts of your site they may or may not fetch. llms.txt grants no permission and forbids nothing: it's a Markdown overview that points a language model to your most important pages. You need both, for different purposes.

Does llms.txt help you appear in Google AI Overviews?

Not according to Google. Its documentation on AI features says you don't need to create new machine-readable files or AI text files to appear in AI Overviews or AI Mode. For Google, what counts is your regular pages, crawlability and quality.

Can a plugin generate an llms.txt for me?

Yes. The specification on llmstxt.org lists Yoast SEO, AIOSEO, Wix, Mintlify and GitBook among its integrations. Do check afterwards that the summary is correct and that the links point to your most important pages, because an automatically generated file is often just a bare list of pages.

Do I also need an llms-full.txt?

For most business websites, no. llms-full.txt bundles the full text of every page into a single file and is mainly found on documentation sites. It isn't part of the official specification on llmstxt.org.

Further reading

Back to the complete guide to GEO.

How does your website score?

Flowproof checks in a minute whether AI search engines can read, understand and cite your site.

Scan your website for free
How to create an llms.txt: structure, example and value