The 30-second answer: llms.txt on a documentation site is mostly generated, so your job is curation
As of September 2026, Mintlify and GitBook serve /llms.txt, /llms-full.txt, and a Markdown version of every page without any configuration. Docusaurus and VitePress have no built-in support; a community plugin generates the same three things during the production build.
Every generator we looked at links every published page. The Vite docs index has 43 links, Mintlify’s own docs 117, and GitBook’s documentation 711. The llms.txt spec describes a short, curated index with a sentence per link, so the work that remains after installation is editorial: write the description, exclude what should not be there, decide how versions and languages are split, and keep llms-full.txt to a size an assistant will actually load.
What each platform gives you
| Platform | How | llms.txt | llms-full.txt | Per-page Markdown | Customizing |
|---|---|---|---|---|---|
| Mintlify | Built in, hosted | Yes, also at /.well-known/llms.txt | Yes | Yes (.md URLs) | Put your own llms.txt or llms-full.txt at the project root to override; delete it to restore the generated one |
| GitBook | Built in, hosted | Yes, lists every published page | Yes | Yes (append .md) | No hand-editing documented; content comes from page titles and descriptions |
| Docusaurus | Community plugin docusaurus-plugin-llms, build time | Yes | Yes | Optional (generateMarkdownFiles) | Plugin options: title, description, ignore patterns, custom sections, per-version output |
| VitePress | Community plugin vitepress-plugin-llms, build time | Yes | Yes | Yes | Plugin options: ignoreFiles, title, description, a custom llms.txt template |
One detail that is easy to miss: on Mintlify, GitBook, and VitePress the links inside llms.txt point at the .md copies, not at the HTML pages. An assistant that follows the index gets clean Markdown without navigation and scripts. That is a large part of why documentation sites see more benefit from the file than marketing sites do.
What the generated files look like in practice
Measured on September 29, 2026, by fetching the public files directly:
- Vite (VitePress plugin): llms.txt is 3.5 KB with 43 links, grouped under Introduction, Guide, and so on, after a short project description. llms-full.txt is about 430 KB.
- Vue.js (VitePress plugin): 7.4 KB, 94 links, organized as the sidebar is.
- Mintlify’s own docs: 23 KB and 117 links. Mintlify caps a generated index at 100,000 characters and, beyond that, keeps the root file as a directory that points to group files under
/_llms/. llms-full.txt is about 1.7 MB. - GitBook’s documentation: 124 KB and 711 links, one per published page, each with the page description as its annotation. llms-full.txt is about 460 KB.
The pattern is clear. Generated indexes are complete and current, which hand-written ones rarely are, and they carry no opinion about what matters, which is exactly what the spec asks an index to carry. The rest of this guide is about adding that opinion without giving up the automation.
Setup, platform by platform
Mintlify
Nothing to install. The H1 is your site name and the blockquote comes from the description field in docs.json, so that field is the one to write carefully. Mintlify also inserts an agent-instructions block after the description and sends Link and X-Llms-Txt response headers that tools use to discover the file. To take over, put an llms.txt at the project root; the generated version returns if you delete it.
GitBook
Nothing to install. Append .md to any published page URL for its Markdown, and /llms.txt or /llms-full.txt to the site root. GitBook also exposes a Model Context Protocol server for every published site. Because the index is built from page titles and descriptions and GitBook documents no way to edit it, the lever you have is the description on each page: a one-line description becomes the annotation next to the link.
Docusaurus
Install the community plugin and add it to the plugin list. Files are written only by the production build, not by the dev server.
npm install docusaurus-plugin-llms --save-dev
// docusaurus.config.js
module.exports = {
plugins: [
[
'docusaurus-plugin-llms',
{
title: 'Acme CLI',
description: 'Command-line reference and guides for the Acme deployment tool.',
ignoreFiles: ['changelog/**', 'blog/**', 'versioned_docs/version-1.*/**'],
generateLLMsFullTxt: true,
},
],
],
};VitePress
The plugin hooks into Vite’s plugin list rather than VitePress’s own, and writes llms.txt, llms-full.txt, and per-page Markdown into the build output. Its README lists Vite, Vue.js, and Vitest among the projects using it.
npm install vitepress-plugin-llms --save-dev
// .vitepress/config.ts
import { defineConfig } from 'vitepress'
import llmstxt from 'vitepress-plugin-llms'
export default defineConfig({
vite: {
plugins: [
llmstxt({
title: 'Acme CLI',
description: 'Command-line reference and guides for the Acme deployment tool.',
ignoreFiles: ['changelog.md', 'blog/*'],
}),
],
},
})Five decisions the generator cannot make for you
- The description. It is the only line an assistant is sure to read, and every tool takes it from a config field. One sentence: what the product is, who it is for, and what the docs cover. “Documentation for Acme” says nothing; “CLI reference and deployment guides for Acme, a tool for shipping containers to bare-metal servers” does.
- What to leave out. Changelogs, release notes, blog posts, and old versions add hundreds of links that compete with the pages you want quoted. Every plugin has an ignore option; use it. On hosted platforms, unpublish or archive what you would otherwise exclude.
- Versions. Link the current version from the root index. If older versions must stay reachable, put them under an
## Optionalsection so a reader with a small budget stops before them. - Languages. One index per locale, each at its locale root, is easier to use than a mixed file. The VitePress plugin handles i18n routes; Mintlify splits locale groups into separate files; on Docusaurus, generate per locale build.
- The size of llms-full.txt. The bundle is where documentation sites get the most value, and also where they overshoot. Around 400 to 500 KB, as on the Vite and GitBook docs, is comfortable. Above a couple of megabytes, drop the auto-generated API reference from the bundle and keep it in the index only.
Checking the result
After deploying, fetch the files the way a crawler would and look at the first lines and the link count:
curl -sL https://docs.example.com/llms.txt | head -12 curl -sL https://docs.example.com/llms.txt | grep -c '^- \[' curl -sL https://docs.example.com/guide/getting-started.md | head -5 curl -sI https://docs.example.com/llms-full.txt | grep -i -E 'content-(type|length)'
The first command should show your H1 and a blockquote that reads like a description, not a placeholder. The second tells you whether the index is curated or a dump. The third confirms that the per-page Markdown is really served. Then run the site through a validator to catch a missing H1, links with the wrong base URL after a domain change, and headings the generator produced as H1 instead of H2.
Validate your docs site's llms.txt
Paste your docs URL and the validator fetches /llms.txt, checks the structure against the spec, and lists every link so you can see how large the generated index really is.
Open the validator →FAQ
My docs are on Mintlify or GitBook. Do I need to do anything?
No, the files already exist. Both platforms serve /llms.txt and /llms-full.txt at the root of your docs site and a Markdown version of every page. What is worth doing is reading the generated index once: check that the site description in the blockquote is the one you would write, and that pages you consider obsolete are not listed with the same weight as the ones you want quoted.
Is there an official Docusaurus llms.txt plugin?
As of September 2026, no. The request is an open issue on the Docusaurus repository, and docusaurus.io itself returns 404 for /llms.txt. The community plugin docusaurus-plugin-llms generates llms.txt, llms-full.txt, and optional per-page Markdown at build time, and is the usual choice.
Should a documentation site publish llms-full.txt?
Usually yes, because documentation is the one case where the full text in Markdown is what an assistant wants: it can answer a configuration question from the bundle without fetching each page. Keep the size in view. The bundles we measured range from about 430 KB for the Vite docs to 1.7 MB for Mintlify's own docs; if yours is much larger, exclude the auto-generated API reference or the changelog from the bundle.
The generated llms.txt lists every page. Is that a problem?
It is the main weakness of every generator. The spec describes llms.txt as a curated index with a sentence per link, and a 700-link file gives an assistant no signal about which page matters. Use the plugin's ignore options to drop the changelog, release notes, and old versions, keep the section order that mirrors how you would teach the product, and put the description in the blockquote. If a platform gives you no control, at least make sure your page descriptions are good, because they become the link annotations.
How do versions and languages fit into one llms.txt?
Link only the current version from the root index; older versions can be listed under an Optional section or left out. For languages, one index per locale at the locale root is easier for an assistant to use than one mixed file. Mintlify separates locale groups into files under /_llms/, and the VitePress plugin supports i18n routes; on Docusaurus the plugin can produce output per version.
Do the per-page .md URLs matter more than llms.txt?
For agents, often yes. Mintlify, GitBook, and the VitePress plugin all publish a Markdown copy of each page, and their llms.txt links point at those .md URLs rather than at the HTML. An assistant that reads the index gets clean Markdown for the page it needs, without parsing navigation, scripts, and footers.
Next steps
- → llms.txt vs llms-full.txt (when the full-text bundle is worth publishing)
- → llms.txt for Shopify stores: what to put in it (the same curation problem on a platform that generates the file)
- → Generating llms.txt at build time in Next.js, Astro, and Hugo (when your site is not on a docs platform)
- → The llms.txt spec, explained line by line
- → All Learn articles