Generate /llms.txt, /llms-full.txt, and per-page markdown files from built HTML documentation, following the llms.txt spec.
This tool works on pre-built HTML, making it useful for environments that cannot run MkDocs plugins (e.g., Zensical) or when you want llms.txt generation as a separate build step. For standard MkDocs workflows, see mkdocs-llmstxt.
Requires Python 3.10+.
# Run without installing
uvx llmstxt-standalone
# Install as a CLI tool
uv tool install llmstxt-standalone # or: pipx install
# Add to a project
uv add llmstxt-standalone # or: pip installGenerate llms.txt from a built MkDocs site:
# Run from project root (expects mkdocs.yml and site/)
llmstxt-standalone build
# Explicit paths
llmstxt-standalone build --config mkdocs.yml --site-dir ./build --output-dir ./dist
# Preview without writing files
llmstxt-standalone build --dry-run
# Suppress output
llmstxt-standalone build --quiet
# Show detailed progress
llmstxt-standalone build --verbose| Option | Short | Default | Description |
|---|---|---|---|
--config |
-c |
mkdocs.yml |
Path to MkDocs config file |
--site-dir |
-s |
site |
Path to built HTML directory |
--output-dir |
-o |
same as site-dir | Where to write output files |
--dry-run |
-n |
Preview without writing | |
--quiet |
-q |
Suppress output | |
--verbose |
-v |
Show detailed progress |
Add llmstxt plugin configuration to an existing mkdocs.yml:
llmstxt-standalone init
# Specify config path
llmstxt-standalone init --config path/to/mkdocs.yml
# Overwrite existing llmstxt config
llmstxt-standalone init --force
# Show detailed progress
llmstxt-standalone init --verbose| Option | Short | Description |
|---|---|---|
--config |
-c |
Path to mkdocs.yml (default: mkdocs.yml) |
--force |
-f |
Overwrite existing llmstxt section |
--quiet |
-q |
Suppress output |
--verbose |
-v |
Show detailed progress |
Check that a config file is valid:
$ llmstxt-standalone validate
Config valid: mkdocs.yml
Site: My Project
Sections: 3
Pages: 12
# Exit code only (for scripts)
llmstxt-standalone validate --quiet
# Show section details
llmstxt-standalone validate --verbose| Option | Short | Description |
|---|---|---|
--config |
-c |
Path to mkdocs.yml (default: mkdocs.yml) |
--quiet |
-q |
Suppress output |
--verbose |
-v |
Show detailed config information |
llmstxt-standalone --version # Show version
llmstxt-standalone --help # Show available commandsThe build command generates three outputs:
llms.txt— an index file with markdown links to all pagesllms-full.txt— concatenated content of all pages- Per-page
.mdfiles alongside the HTML
The per-page markdown files make the URLs in llms.txt resolve to actual content. If your site is at https://docs.example.com/, the URL https://docs.example.com/install/index.md returns markdown instead of HTML.
The tool reads your mkdocs.yml for site metadata. You can configure llmstxt output explicitly or let it derive structure from your nav.
plugins:
- llmstxt:
markdown_description: |
Extra context for LLMs about your project.
full_output: llms-full.txt
content_selector: article.md-content__inner
sections:
Getting Started:
- index.md
- install.md
Usage:
- guide/basics.md
- guide/advanced.md| Option | Default | Description |
|---|---|---|
markdown_description |
"" |
Additional context for LLMs, appears after site description |
full_output |
llms-full.txt |
Filename for concatenated content |
content_selector |
auto-detect | CSS selector for main content |
sections |
derived from nav | Section names mapped to page lists |
Without an explicit llmstxt plugin config, sections derive from your nav structure. Top-level pages go into a "Pages" section; nested nav items become sections named by their keys.
The tool respects use_directory_urls from your mkdocs.yml. When enabled (the default), install.md maps to install/index.md; when disabled, it maps to install.md.
If content_selector is not set, the tool tries these selectors in order:
.md-content__inner(Material for MkDocs)[role="main"](default MkDocs theme)articlemain- The entire document
Page titles resolve in this order:
- The title from your
navstructure - The HTML
<title>tag (with site name suffix stripped) - The first
<h1>tag - A title derived from the filename
from pathlib import Path
from llmstxt_standalone.config import load_config
from llmstxt_standalone.generate import generate_llms_txt
config = load_config(Path("mkdocs.yml"))
result = generate_llms_txt(config, site_dir=Path("site"))
print(result.llms_txt) # Index content
print(result.llms_full_txt) # Full content
print(result.markdown_files) # List of written .md paths- Produces output identical to mkdocs-llmstxt when configured the same way
- Handles Unicode, international characters, and special characters
- Works with Material for MkDocs, ReadTheDocs, and the default MkDocs theme
- Parses configs containing Python YAML tags like
!python/object/apply
MIT