Validate a site's llms.txt against what the site actually serves.
Your llms.txt generator promises AI tools a map of your docs. This tool verifies the deployed site honors the map, and fails your CI when it stops.
npx llms-txt-check https://your-docs-site.comGenerators run at build time. Breakage happens at the serving layer: host redirect rules, trailing-slash normalization, docs restructures, domain migrations. Your build can be green while every AI agent reading your llms.txt gets 404s.
Real examples found with this tool in August 2026:
- Drizzle ORM's llms.txt listed 71 URLs that returned 404 in production (16% of the file, the entire PostgreSQL section).
- Cursor's docs moved domains, and the old
docs.cursor.com/llms.txtstarted redirecting to an HTML marketing page. Agents holding the previously correct URL now ingest a React shell. - LiteLLM's llms.txt had dead links too, including its own intro page.
- A Docusaurus site once served a zero-byte llms.txt thanks to a
trailingSlashconfig interaction with its host.
Every one of these sites had a green build while serving a broken llms.txt.
- Discovery.
/llms.txtexists, returns 200, and is markdown rather than an HTML app shell. - Spec lint. One H1 title, well-formed
- [title](url): descriptionentries, no duplicate or relative URLs, no staging domains baked in. - Serving validation. Every listed URL is fetched against the live site and checked for HTTP errors, zero-byte and near-empty bodies, and
.mdURLs that return HTML.
# Check a deployed site (fetches <url>/llms.txt)
npx llms-txt-check https://docs.example.com
# Check a llms.txt URL directly
npx llms-txt-check https://docs.example.com/llms.txt
# Lint a local file without network checks
npx llms-txt-check ./static/llms.txt --lint
# Spot-check 50 URLs spread across a large file
npx llms-txt-check https://docs.example.com --sample 50
# Machine-readable output
npx llms-txt-check https://docs.example.com --jsonExit code 0 means healthy, 1 means problems were found, 2 means the tool itself could not run. That makes CI integration one line:
# .github/workflows/deploy.yml, after your deploy step
- run: npx llms-txt-check ${{ env.DEPLOY_URL }}The parser and checks are exported for programmatic use, with zero dependencies:
import { parse, lint, checkSite } from "llms-txt-check";
const doc = parse(text);
// { title, summary, preamble, sections: [{ name, links: [{ title, url, description }] }] }
const issues = lint(doc, { origin: "https://docs.example.com" });
const report = await checkSite("https://docs.example.com", { sample: 50 });
console.log(report.failures);| Flag | Default | What it does |
|---|---|---|
--sample <n> |
all | Check at most n URLs, spread evenly across the file |
--concurrency <n> |
8 | Parallel requests |
--timeout <ms> |
15000 | Per-request timeout |
--lint |
off | Skip network checks, lint the file structure only |
--json |
off | Machine-readable report |
MIT