---
title: "How to Write an llms.txt (With a Validation Checklist)"
description: "How to write an llms.txt: the required title, the summary blockquote, link sections, what to leave out, a full example, and a checklist to validate the file."
image: "https://www.blackseoanalyzer.com/static/images/black-seo-analyzer-og-image.png"
canonical: "https://www.blackseoanalyzer.com/en/blog/how-to-write-llms-txt"
language: "en"
---

# How to Write an llms.txt, With a Checklist to Validate It

By [Seth Black](https://www.blackseoanalyzer.com/en/about) · Published November 01, 2026

An llms.txt is a Markdown file at the root of your site, `/llms.txt`, that gives an AI assistant a short map of what your site is and where the important pages are. The format, from [llmstxt.org](https://llmstxt.org/), needs only one thing, an H1 with the site’s name, but a useful file adds a one-line summary in a blockquote and sections of links with short notes. You can write a good one in half an hour; the checklist at the end tells you whether it is valid.

## Does llms.txt do anything?

Honestly, the evidence is thin. It is a proposed convention, not a standard, and none of the major AI vendors’ crawler documentation that I read on 31 October 2026 (OpenAI, Anthropic, Perplexity, Google) says their crawlers read it. I made the longer case in [llms.txt: does it matter?](https://www.blackseoanalyzer.com/en/blog/llms-txt-does-it-matter). The short version: it costs almost nothing, it helps agents and tools that do look for it, and it should never come before the things that definitely matter, such as letting the right crawlers in and serving real HTML.

If that trade sounds fine to you, here is how to write one properly.

## What goes in an llms.txt, and in what order?

The llmstxt.org format, in order:

| Part | Required? | What it is |
| --- | --- | --- |
| `# Name` | Yes, the only required part | The H1: your site or project name |
| `> Summary` | Recommended | A blockquote with the key facts someone needs to understand the rest of the file |
| Free text | Optional | Paragraphs or bullet lists with more detail, but no headings |
| `## Section` lists | Optional, zero or more | H2 sections, each a Markdown list of `[name](url)` links, with an optional `: note` after each |
| `## Optional` | Optional | By convention, secondary links an agent can skip when it is short on context |

The spec also suggests serving a clean Markdown version of important pages at the same URL with `.md` added, for example `/docs/start.md`, and linking those from the file. That is optional, and it only helps if the Markdown versions are kept in sync with the pages.

## What does a good llms.txt look like?

Here is a complete example for a small software company:

```markdown
# Example Widgets

> Example Widgets makes a desktop app for measuring network latency on
> Windows, macOS and Linux. One-time license, $49. Free 30-day trial.

- Founded 2019. Support by email, replies within one business day.
- The app runs locally; no account or cloud service is needed.

## Product

- [Features](https://example.com/features): what the app measures and exports
- [Pricing](https://example.com/pricing): license tiers and the trial
- [Download](https://example.com/download): installers for each platform

## Docs

- [Getting started](https://example.com/docs/start): install, first test, reading results
- [CLI reference](https://example.com/docs/cli): every command-line flag with examples
- [FAQ](https://example.com/faq): licensing, refunds, privacy

## Optional

- [Changelog](https://example.com/changelog)
- [Blog](https://example.com/blog)
```

Our own file at [blackseoanalyzer.com/llms.txt](https://www.blackseoanalyzer.com/llms.txt) follows the same shape: name, a summary with the facts people ask about most (what the product is, the price, the trial), a bullet list of hard facts, then sections for product pages, guides and posts. It is generated from the site’s data, so prices and version numbers cannot drift from the pages.

## What should you write in the summary?

The facts an assistant is most likely to be asked, stated so they can be quoted without context. What the thing is, who it is for, what it costs, and anything people get wrong. Avoid adjectives; “fast, powerful, easy” tells a model nothing it can repeat. One to three sentences is plenty.

## What should you leave out?

- **Every page on your site.** That is what a sitemap is for. Pick the ten to thirty pages that answer the questions people actually ask.
- **Login, cart, account and search pages.** They are useless to an assistant.
- **Marketing copy.** The notes after each link should say what the page contains, not why it is great.
- **Relative links.** Write `https://example.com/pricing` or `/pricing`. A bare `pricing.html` cannot be resolved reliably once the file is read outside your site.
- **Anything you would not want quoted.** Assume every line can end up in an answer.

## How do you serve it?

Put the file at the root of each host you want it to describe and serve it as plain text:

```nginx
location = /llms.txt {
    default_type text/plain;
    charset utf-8;
}
```

Then check it from outside:

```bash
curl -sI https://example.com/llms.txt | grep -iE '^(HTTP|content-type)'
curl -s https://example.com/llms.txt | head -20
```

You want a `200` and a text content type. If your CDN puts bot challenges in front of the site, exempt `/llms.txt`, since the agents that read it are mostly coming from data centers.

## How do you validate an llms.txt?

Run through this checklist. Each item maps to one of bseoa’s AI-readiness checks, so you can also let the crawler do it.

| Check | What to look for | bseoa check |
| --- | --- | --- |
| The file exists | `/llms.txt` returns `200` | [Publish an llms.txt](https://www.blackseoanalyzer.com/en/technical-seo/ai-readiness-analyzer/llms-txt-missing) |
| It is not empty | More than whitespace | [Your llms.txt Is Empty](https://www.blackseoanalyzer.com/en/technical-seo/ai-readiness-analyzer/llms-txt-empty) |
| It has a title | A first `# Name` line | [Add the Required Title](https://www.blackseoanalyzer.com/en/technical-seo/ai-readiness-analyzer/llms-txt-missing-title) |
| It has a summary | A `>` blockquote with real text | [Add a Summary Blockquote](https://www.blackseoanalyzer.com/en/technical-seo/ai-readiness-analyzer/llms-txt-missing-summary) |
| It links somewhere | At least one `[name](url)` link | [Your llms.txt Points at Nothing](https://www.blackseoanalyzer.com/en/technical-seo/ai-readiness-analyzer/llms-txt-has-no-links) |
| Links resolve | Every link starts with `http://`, `https://` or `/` | [Use Resolvable URLs](https://www.blackseoanalyzer.com/en/technical-seo/ai-readiness-analyzer/llms-txt-unresolvable-links) |

Two checks the crawler does not make, which you should do by hand:

1. **Every linked URL returns `200`.** A quick loop does it:

`bash curl -s https://example.com/llms.txt | grep -oE '\(https?://[^)]+\)' | tr -d '()' \ | while read u; do echo "$(curl -s -o /dev/null -w '%{http_code}' "$u") $u"; done`

2. **The facts are current.** A summary with last year’s price is worse than no summary. If you can, generate the file from the same data your pages use.

## Where does llms.txt sit next to robots.txt and the sitemap?

robots.txt controls which crawlers may fetch what. The sitemap lists every URL you want indexed. llms.txt is a curated reading list for assistants. It does not grant or deny access, so a file full of links is no help if robots.txt blocks the crawlers that would follow them; [the AI crawler robots.txt guide](https://www.blackseoanalyzer.com/en/blog/ai-crawler-robots-txt-guide) covers that side, and the free [robots.txt tester](https://www.blackseoanalyzer.com/en/tools/robots-txt-tester) checks a rule before you ship it. For where all of this fits, see [GEO vs SEO](https://www.blackseoanalyzer.com/en/geo-vs-seo).

-Sethers

About the author

[Seth Black](https://www.blackseoanalyzer.com/en/about)

Seth is a software engineer and engineering leader who builds bseoa, a Rust-based technical SEO crawler with a GUI and CLI. He writes about the crawling, rendering and indexing problems he runs into on real sites.

[LinkedIn](https://www.linkedin.com/in/seth-black-tx/) · [GitHub](https://github.com/sethblack) · [YouTube](https://www.youtube.com/@SethBlack)

[Back to Blog](https://www.blackseoanalyzer.com/en/blog)

## Discover hundreds of SEO Issues in Seconds

Without Monthly Subscriptions

Comprehensive technical SEO analysis powered by ML and 16 specialized modules. Optional AI-powered insights from Claude, GPT-4, or Gemini. Get actionable insights in seconds, and never pay monthly fees again.

[Download Free Trial](https://www.blackseoanalyzer.com/en/free-trial)

I use AI to generate images for my posts and for general editing, updates, and ironically SEO purposes. I used to draw all of the images for my personal blog (taleas) myself, but as the volume of content I produce has increased, I've turned to AI tools to help create visuals that complement my writing. I go out of my way to generate images that look strange, and don't represent real people. If you ever want to chat about my use of AI, please reach out.

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://www.blackseoanalyzer.com/#organization","name":"Fiscus Technology, LLC","url":"https://www.blackseoanalyzer.com/","logo":{"@type":"ImageObject","url":"https://www.blackseoanalyzer.com/static/images/black-seo-analyzer.png"},"sameAs":["https://sethserver.com/","https://github.com/sethblack"],"founder":{"@id":"https://www.blackseoanalyzer.com/#seth"}},{"@type":"WebSite","@id":"https://www.blackseoanalyzer.com/#website","name":"bseoa","url":"https://www.blackseoanalyzer.com/","publisher":{"@id":"https://www.blackseoanalyzer.com/#organization"}},{"@type":"Person","@id":"https://www.blackseoanalyzer.com/#seth","name":"Seth Black","url":"https://www.blackseoanalyzer.com/about","jobTitle":"Creator of bseoa","sameAs":["https://www.linkedin.com/in/seth-black-tx/","https://github.com/sethblack","https://www.youtube.com/@SethBlack","https://sethserver.com/"]},{"@type":"BlogPosting","@id":"https://www.blackseoanalyzer.com/en/blog/how-to-write-llms-txt#article","headline":"How to Write an llms.txt, With a Checklist to Validate It","name":"How to Write an llms.txt, With a Checklist to Validate It","description":"How to write an llms.txt: the required title, the summary blockquote, link sections, what to leave out, a full example, and a checklist to validate the file.","url":"https://www.blackseoanalyzer.com/en/blog/how-to-write-llms-txt","datePublished":"2026-11-01T05:21:23","dateModified":"2026-11-01T05:21:23","author":{"@id":"https://www.blackseoanalyzer.com/#seth"},"publisher":{"@id":"https://www.blackseoanalyzer.com/#organization"},"image":{"@type":"ImageObject","url":"https://www.blackseoanalyzer.com/static/images/black-seo-analyzer-og-image.png","width":1200,"height":630},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.blackseoanalyzer.com/en/blog/how-to-write-llms-txt"},"isPartOf":{"@id":"https://www.blackseoanalyzer.com/#website"},"inLanguage":"en-US","isAccessibleForFree":true,"wordCount":1110},{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.blackseoanalyzer.com/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://www.blackseoanalyzer.com/en/blog"},{"@type":"ListItem","position":3,"name":"How to Write an llms.txt, With a Checklist to Validate It","item":"https://www.blackseoanalyzer.com/en/blog/how-to-write-llms-txt"}]}]}
```
