How to publish an llms.txt file
Published 7/24/2026
llms.txt is a community-proposed convention (not an IETF or W3C standard) for giving AI systems
a concise, structured entry point to a site’s most relevant content, in Markdown.
Step 1: Create the file at your domain root
Place a plain-text file at /llms.txt — for example https://example.com/llms.txt. Where that
file physically lives depends on your hosting:
- Static-site hosts (Cloudflare Pages/Workers Assets, Netlify, Vercel, or any static-site
generator, including this site) — put the file in the project’s static-assets directory (often
named
public/), so it’s copied to the site root unchanged at build time, alongside files likerobots.txtandfavicon.ico. - WordPress — a real file placed directly in the site’s web root (via SFTP or your host’s file
manager) is served as-is; Apache and Nginx check for a matching file on disk before handing the
request to WordPress’s own routing, so no plugin is required if you have direct file access. If
your host doesn’t allow that, a small plugin (or a
functions.phpsnippet hooked to WordPress’sinitaction, matching the request path and outputting the content with atext/plaincontent-type) can serve it instead — the same technique WordPress itself uses to serve a virtualrobots.txtwhen no physical file exists.
Step 2: Start with a top-level Markdown heading
# Example Site
A top-level # heading near the start of the file is the structural convention this format is
built around — CrawlPact’s llms.txt validator specifically checks
for its presence, since its absence is the most common structural issue.
Step 3: Add links to your most relevant resources
# Example Site
> A one-line summary of what this site is.
## Documentation
- [Getting started](/docs/getting-started)
- [API reference](/docs/api)
Each Markdown link ([label](url)) is a linked resource an AI system reading this file can
follow. Keep the list focused — this file is meant to be a concise entry point, not a full
sitemap.
Step 4 (optional): Publish a longer llms-full.txt
Some sites also publish /llms-full.txt — the same convention, but with more complete content
inlined rather than just linked, for systems that prefer a single larger fetch over following
multiple links.
Step 5: Verify
Run CrawlPact’s llms.txt validator. It reports the file’s size,
whether a top-level heading was found, and how many linked resources were detected, for both
/llms.txt and /llms-full.txt independently.
What this doesn’t do
Publishing llms.txt is informational — it does not control crawler access (that’s
robots.txt’s role) and there is no guarantee any specific AI system reads or prioritises it, since
adoption of this convention varies by operator.
Related guides
How to block only AI training crawlers, without blocking AI search
A step-by-step implementation guide for writing robots.txt groups that restrict training-purpose crawlers while leaving search-purpose crawlers untouched.
How to publish an RSL (Really Simple Licensing) declaration
A step-by-step implementation guide for declaring permitted and prohibited AI uses of your content via RSL.
How to set the Content-Signal HTTP header
A step-by-step implementation guide for publishing a Content-Signal response header, and where to configure it depending on your hosting setup.
See how this applies to your own site
Run a free audit to check your declared AI crawler policy against your own domain.
Audit a domain