Generation tooling
verified-as-of: 2026-08-30 (tool versions, maintenance status and platform features are volatile — re-verify before recommending)
Contents
- Pick by situation
- Docs platforms (built-in)
- Static-site-generator plugins
- Crawl-based generators (sites you do not own)
- CMS and site builders
- Edge content negotiation
- Quality practices that generators get wrong
- References
1. Pick by situation
| You have… | Use | Emits |
|---|---|---|
| Docs on Mintlify / GitBook / ReadMe / Fern | nothing — it is automatic | llms.txt (+ full on Mintlify/GitBook) + .md twins |
| Docusaurus, MkDocs, VitePress, Starlight, Sphinx, Nuxt | the framework plugin (table §3) | llms.txt + llms-full.txt (+ .md, llms-small.txt on Starlight) |
| A live site you do not own | crawl-based generator (§4) — create-llmstxt-py, dotenvx/llmstxt, or your own sitemap→markdown pipeline | llms.txt (+ full) with extracted or AI-written descriptions |
| WordPress | Yoast ≥25.3 / Rank Math / AIOSEO (§5) | llms.txt only (AIOSEO Pro adds full + markdown posts) |
| Webflow / Framer | host a hand-written file | whatever you upload |
| Any Cloudflare-proxied HTML site | “Markdown for Agents” toggle (§6) | on-the-fly markdown on Accept: text/markdown, no llms.txt |
2. Docs platforms
| Platform | Emits | Descriptions from | Notes |
|---|---|---|---|
| Mintlify | llms.txt, llms-full.txt, .md per page, /.well-known/ copies, /_llms/ split indexes | frontmatter description (truncated at 300 chars), nav order from docs.json; optional markdown.instructions agent text | index capped at 100,000 chars → recursive /_llms/<group>.md; default language/version only; hidden/noindex pages excluded; hand-written root files override; auth sites list public pages or require auth1 |
| Fern | llms.txt (root and per-subdirectory), .md per page; no llms-full.txt | frontmatter description, fallback subtitle; adds OpenAPI/AsyncAPI links | dropped llms-full because it “exceeded most model context windows, added heavy serving overhead, saw little use”2 |
| GitBook | llms.txt (Jan 2025), llms-full.txt + .md per page (Jun 2025), /sitemap.md, Accept: text/markdown | auto from page structure | zero-config; no curation controls documented; full export “will be more expensive”34 |
| ReadMe | llms.txt (default on, all plans), .md per page; no llms-full | project title + guide/API hierarchy | a custom file from the repo root disables auto-updates; hidden pages excluded5 |
| GitDoc (vendor claim) | llms.txt + llms-full.txt “for the pages you mark as priority”, regenerated in the build | sidebar/nav | vendor blog, 2026-05-226 |
3. Static-site-generator plugins
| Plugin | Emits | Input | Descriptions / ordering | Maturity & limits |
|---|---|---|---|---|
docusaurus-plugin-llms (rachfop) | llms.txt, llms-full.txt, optional per-page .md, versioned + customLLMFiles | source tree at postBuild | frontmatter → first heading → site fallback; includeOrder globs | 144★, MIT; not run in docusaurus start; image rewrite only for bundled assets7 |
@signalwire/docusaurus-plugin-llms-txt | llms.txt, .md, optional full | built HTML (rehype/remark) | manual sections[].description, autoSectionDepth | v1.2.2, ~10 months stale; ENOENT / “processed 0 documents” bug89 |
| Docusaurus core | none | — | — | issue #10899 open since Feb 202510 |
mkdocs-llmstxt (pawamoy) | llms.txt, .md, optional full_output | built HTML → BeautifulSoup → Markdownify | sections: dict with per-file descriptions | 130★, v0.5.x, maintenance mode, seeking maintainer; needs site_url; mkdocstrings show_source mangles tables/code in the full file1112 |
vitepress-plugin-llms (okineadev) | llms.txt, llms-full.txt, .md | VitePress source | frontmatter description; <llm-only> / <llm-exclude> tags | 394★; used by Vite, Vue, Vitest, Rolldown; relative URLs break under redirects/domain moves13 |
starlight-llms-txt (delucis) | llms.txt, llms-full.txt, llms-small.txt | Astro Starlight | projectName, description, details, optionalLinks, customSets, promote/demote; minify strips asides | 110★, docs updated Aug 2026; needs site14 |
sphinx-llms-txt (jdillard) | llms.txt (markdown), llms-full.txt (reStructuredText) | Sphinx build | toctree titles; llms_txt_summary, llms_txt_exclude, llms_txt_full_max_size | v0.7.1; full file is RST; points to NVIDIA sphinx-llm15 |
nuxt-llms / Nuxt Content | llms.txt (~5K tokens), opt-in llms-full.txt (~1M+ tokens) | Nuxt Content, runtime hooks | sections in nuxt.config | first-party; full file explicitly for 200K+-context tools16 |
| Next.js / Nextra | hand-rolled app/llms.txt/route.ts (force-static or dynamic); next-llms-txt adds per-page .md endpoints | components | “reads and parses readable text” | discussion #80692 unresolved; no Nextra built-in found (tentative)1718 |
llms-txt-action (demodrive-ai) | llms.txt, llms-full.txt, .md | built HTML dir + sitemap.xml | local/offline or cloud LLM summaries via LiteLLM (default GPT-4o) | 16★; needs --dirty with mkdocs gh-deploy19 |
4. Crawl-based generators (sites you do not own)
| Tool | What it does | Limits |
|---|---|---|
Firecrawl /llmstxt API + llmstxt.firecrawl.dev | URL → async job → llms.txt (+ full); maxUrls 1–100 (default 10), 1 credit/URL, public pages only, 5,000-URL alpha cap | deprecated in favour of the main endpoints (page carries no date; still up); users pointed to the Python repo2021 |
create-llmstxt-py (Firecrawl, 320★) | /map → scrape each page to markdown (batches of 10; failures skipped, no retry) → GPT-4o-mini writes a 3–4-word title + 9–10-word description → flat llms.txt; llms-full.txt concatenates under <|firecrawl-page-N-lllmstxt|> | default 20 URLs; memory issues on large sites; sections are not inferred; descriptions are AI-written and unreviewed22 |
dotenvx/llmstxt (147★, BSD-3) | sitemap.xml → - [Title](url): description bullets; --include-path / --exclude-path globs; --replace-title regex | llms.txt only; titles extracted from HTML; description derivation undocumented23 |
Jina Reader r.jina.ai/<url> | headless Chrome or curl engine → Readability → Turndown; headers x-respond-with, x-target-selector, x-retain-links, x-max-tokens, x-markdown-chunking | per-page cleaner, no site/llms.txt mode; anonymous traffic rate-limited24 |
| Screaming Frog v24.3 | per-page .md via a Readability.js + Turndown custom-JS snippet; llms.txt via n8n/CSV converters | no native llms.txt export; thin pages return nothing; JS rendering slow2526 |
plainsignal/llmstxt Chrome extension | llms.txt + one .md per page + zip from sitemap or rendered DOM; meta description as blockquote | 10★, HTTPS only27 |
| SEO-tool generators (SEOmator etc.) | robots.txt → sitemap discovery, index-sitemap expansion, LLM-written title+description per URL | vendor-claimed mechanics only28 |
| llms-text.com generator/validator | crawls a domain and exports llms.txt + llms-full.txt (“deep-crawls up to 50 subpages”); validator checks syntax, links, UTF-8, headers | vendor; its guidance: 10–20 evergreen URLs, 4–7 H2s, 10–20-word descriptions, index under 10 KB, `Content-Type: text/plain |
5. CMS and site builders
| Platform | Emits | Descriptions | Limits |
|---|---|---|---|
| Yoast SEO ≥25.3 (2025-06-10) | llms.txt only, regenerated weekly | custom excerpt only — no description otherwise; 5 latest posts/pages/CPT (≤12 months, cornerstone first) + top-5 taxonomies | 5-item cap; markdown chars escaped; a static file wins over the dynamic one2930 |
| Rank Math | llms.txt only | “intro text”; post types/taxonomies, limit default 100; custom lines | no full31 |
| AIOSEO | llms.txt (free); llms-full.txt + markdown post conversion (Pro) | site title/tagline; per-post-type limits, exclusions | paywall32 |
website-llms-txt, llms-full-txt-generator | llms.txt (+ full) | titles + SEO-plugin descriptions; honour noindex | one shipped a broken-access-control CVE fix33 |
| Joost de Valk “Markdown Alternate” | <link rel="alternate" type="text/markdown"> + .md URLs per post | — | negotiation, not an index34 |
| Webflow / Framer | host an uploaded file (Framer: Pro/Enterprise “Hosting → Files”); a Framer marketplace plugin scans the CMS | manual | no generation3536 |
| Shopify (Apr–May 2026, silent) | auto /llms.txt, /agents.md, /sitemap_agentic_discovery.xml, /.well-known/ucp on every store | boilerplate: H1 store name, /collections/all, contact, UCP + MCP endpoints | templates/llms.txt.liquid replaces, does not merge; no changelog; 78.1% of top-10k Shopify hosts vs WordPress 8.7%373839 |
6. Edge content negotiation
Cloudflare “Markdown for Agents” (2026-02-12; Pro/Business/Enterprise; zone toggle under AI Crawl Control): on Accept: text/markdown the edge converts HTML → markdown (body + meta-derived YAML frontmatter + JSON-LD, nav/header/footer/scripts dropped) and returns Content-Type: text/markdown; charset=utf-8, x-markdown-tokens, x-original-tokens, Vary: Accept; ETag/Last-Modified/Content-Encoding stripped; origin HTML ≤ 2 MB (raised from 1 MB); a chunked-encoding silent pass-through was fixed Jul 2026.404142 It produces no llms.txt — pair it with a hand-written index. Checkly measured a 99.7% token reduction on its own docs (single site).43
7. Quality practices that generators get wrong
- Descriptions are the product. Every platform generator draws the one-liner from frontmatter
description; crawl tools scrape<meta>or have a small model invent it; WordPress generators are weakest (Yoast emits none without a custom excerpt; Yoast/Rank Math “list content but don’t really prioritize it”).1222944 Treat AI-written descriptions as drafts to edit, and audit the page list, not just the output. The spec’s own test: give an agent only the llms.txt and ask it questions.45 - Sections and order come from config or nav, never inferred by crawlers. mkdocs
sections:, signalwiresections[]+autoSectionDepth, StarlightcustomSets+promote/demote, docusaurusincludeOrder; Mintlify usesdocs.jsonorder. Mintlify’s editorial rule: order by “frequency, not importance” — the first 20% of links should answer 80% of questions.11147146 ## Optional(convention only in v2): changelogs, legal, old posts, deep appendices; never pricing or the API reference.47- Size budgets are producer-side. Split large indexes (Mintlify 100k chars →
/_llms/), ship a small variant (Starlightllms-small.txt, Nuxt’s ~5K-token file), cap the full file (llms_txt_full_max_size), or drop it (Fern). No cross-vendor numeric budget exists; “index under 10 KB” is a vendor number.11415248 - Regenerate in the build; check links in CI. Custom/static files freeze updates (ReadMe, Yoast); dead links happen (litellm’s index carried a deleted page);
llms-txt-validator --check-linksandnpx llms-txt-checkexist for pipelines.5294950 - Serve
.mdtwins and honourAccept: text/markdownwhere the platform allows; addVary: Acceptand bypass full-page caches keyed without it.151 - Counter-evidence to weigh before spending effort: 97% of files get zero AI requests; Google has no implementation. Generation pays off for developer docs consumed by coding agents, not for general SEO.5253
References
Footnotes
-
https://www.mintlify.com/docs/ai/llmstxt (docs) ↩ ↩2 ↩3 ↩4 ↩5
-
https://buildwithfern.com/learn/docs/ai-features/llms-txt (docs) ↩ ↩2
-
https://gitbook.com/docs/ai-and-search/llm-ready-docs (docs) ↩
-
https://gitbook.com/docs/changelog/june-2025/24-june-performance-upgrades-llms-full.txt-and-.md-support-text-alignment-and-more (docs) ↩
-
https://gitdoc.ai/blog/llms-txt-ai-readable-documentation — 2026-05-22 (vendor) ↩
-
https://github.com/rachfop/docusaurus-plugin-llms (readme) ↩ ↩2
-
https://github.com/signalwire/docusaurus-plugins/tree/main/packages/docusaurus-plugin-llms-txt (readme) ↩
-
https://github.com/signalwire/docusaurus-plugins/issues/5 (forum) ↩
-
https://github.com/facebook/docusaurus/issues/10899 (forum) ↩
-
https://github.com/pawamoy/mkdocs-llmstxt (readme) ↩ ↩2
-
https://github.com/okineadev/vitepress-plugin-llms (readme) ↩
-
https://delucis.github.io/starlight-llms-txt/configuration/ (docs) ↩ ↩2 ↩3
-
https://sphinx-llms-txt.readthedocs.io/en/latest/ (docs) ↩ ↩2
-
https://github.com/vercel/next.js/discussions/80692 (forum) ↩
-
https://github.com/firecrawl/create-llmstxt-py (readme) ↩ ↩2
-
https://github.com/dotenvx/llmstxt (readme) ↩
-
https://github.com/jina-ai/reader (readme) ↩
-
https://www.screamingfrog.co.uk/blog/generate-markdown-at-scale/ (vendor) ↩
-
https://n8n.io/workflows/3219-generate-ai-ready-llmstxt-files-from-screaming-frog-website-crawls/ (vendor) ↩
-
https://github.com/plainsignal/llmstxt (readme) ↩
-
https://developer.yoast.com/features/llms-txt/functional-specification/ (docs) ↩ ↩2 ↩3
-
https://developer.yoast.com/changelog/yoast-seo/25.3/ (docs) ↩
-
https://aioseo.com/docs/how-to-create-an-llms-txt-using-all-in-one-seo/ (docs) ↩
-
https://university.webflow.com/videos/optimize-your-site-for-llms-with-llms-txt (docs) ↩
-
https://www.framer.com/help/articles/llms-txt-framer/ (docs) ↩
-
https://honeybound.co/blog/shopify-llms-txt-agents-md (blog) ↩
-
https://imakemvps.com/blog/llms-txt-generator-for-shopify (blog) ↩
-
https://caseyrb.com/blog/state-of-llms-txt-adoption/ — HTTP Archive, Jun 2026 (study) ↩
-
https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/ (docs) ↩
-
https://developers.cloudflare.com/changelog/post/2026-02-12-markdown-for-agents/ (docs) ↩
-
https://community.cloudflare.com/t/cloudflare-fundamentals-content-encoding-support-for-markdown-for-agents-and-other-improvements/893536 (forum) ↩
-
https://www.checklyhq.com/blog/state-of-ai-agent-content-negotation/ (blog) ↩
-
https://llmstxt.org/ (spec) ↩
-
https://www.mintlify.com/blog/real-llms-txt-examples (vendor) ↩
-
https://dev.to/lab451/complete-llmstxt-guide-for-2026-57d (blog) ↩
-
https://www.llms-text.com/blog/llms-txt — 2025-07-25 (vendor) ↩
-
https://github.com/bridgetoagent/llms-txt-validator (readme) ↩
-
https://toddmorourke.com/learn/markdown-for-agents/ (blog) ↩
-
https://www.searchenginejournal.com/google-says-llms-txt-is-purely-speculative-for-now/577576/ (blog) ↩