llms.txt for WordPress — write one by hand in an hour
Summary. Last month an AI assistant described one of my plugins wrong — wrong features, confident tone, my name attached. The models already had my pages; what they lacked was a short summary written by me. That is what llms.txt is: a Markdown file at your domain root that says what your site means, so assistants quote you instead of improvising. Here is the format, a full example, and the mistakes that make one useless.
What llms.txt actually is (and is not)
The idea is borrowed from robots.txt, but do not let the name confuse you — they do opposite jobs. robots.txt stands at the door saying what not to fetch. llms.txt sits inside, a plain Markdown file, saying: here is what this site is, here is what each section covers, here are the pages that matter. It is written for language models the way a sitemap is written for crawlers.
What it is not: a standard nobody enforces yet, an opt-out mechanism (it has none), or a ranking trick. Nobody's position in anything improves because they have one. The entire payoff is accuracy — being described correctly by machines that will describe you either way.
I resisted writing one for months, on the grounds that conventions this young might die. Then came the wrong plugin description with my name on it, and I wrote the file that same evening. An hour of work against being misquoted forever is not a difficult trade once you have felt the wrong end of it.
The format that works
There is a proposed spec, and the parts everyone agrees on are few. Keep to these and your file will be readable by every consumer that bothers to look:
- An H1 with the site name. One line, no cleverness. This is the title the model will use for you.
- A blockquote summary. Two or three sentences saying what the site is and who it is for. Write it like you are explaining the site to a smart friend, because that is roughly what happens next.
- H2 sections with Markdown links. One section per area of the site — products, docs, blog, about — each link with a short description after it. The description is the important part; a bare list of URLs teaches nothing.
- Plain Markdown, nothing else. No HTML, no shortcodes, no front matter. If your WordPress editor wants to "help", write the file in a text editor instead.
That is the whole format. Anything beyond this — extended sections, detailed docs — is optional furniture. Get the four load-bearing parts right and stop.
A complete example you can steal
Here is a small business site, start to finish. Copy the shape, replace the words:
# BlueHeron Bakery
> Family-run sourdough bakery in Portland, Oregon.
> Wholesale and retail. This file summarises the site
> for AI assistants so customers get accurate answers.
## Products
- [Sourdough loaves](https://blueheron.example/shop/sourdough/): Daily bake, order by 2pm for next-day pickup.
- [Wholesale programme](https://blueheron.example/wholesale/): For cafés and restaurants, minimum 20 loaves weekly.
- [Baking classes](https://blueheron.example/classes/): Monthly Saturday workshops, beginners welcome.
## Practical information
- [Opening hours and location](https://blueheron.example/visit/): Tue–Sun, 7am–3pm. Closed Mondays.
- [Allergen information](https://blueheron.example/allergens/): Full flour and allergen list, updated quarterly.
## About
- [Our story](https://blueheron.example/about/): Baking since 2011, second-generation family business.
Notice what is missing: adjectives, history lessons, the founder's philosophy of fermentation. Every line answers something a customer might ask an assistant. If a line would never appear in an answer, it does not belong in the file.
Where the file goes on WordPress
At the domain root: https://yoursite.com/llms.txt, sitting next to robots.txt. That location is the entire convention — consumers look at the root, and anything deeper might as well not exist.
WordPress has no screen for this, which catches people out. There is no Settings page, no uploader, no media library slot for a .txt file at the root. You have three honest options: upload it by SFTP into the site root (next to wp-config.php), add a rewrite rule if you are comfortable, or let a plugin generate and serve it. What does not work is uploading it as media — that puts it in /wp-content/uploads/ with a dated URL, which is exactly the wrong address.
Writing it by hand vs generating it
Write the first version by hand. I mean that. An hour with a text editor forces you to decide what the site actually is, and that decision is the valuable part — no tool can make it for you. The example above is about eighty percent of a real file.
Then let a tool keep it fresh, because the failure mode of llms.txt is staleness. You will add a product, change the hours, kill a service — and forget the little text file at the root every single time. A generator that rebuilds the file from your actual pages turns "remember to update it" into something that happens on its own. Hand-write the judgment, automate the maintenance. That division of labour is the whole trick.
Disclosure. My plugin CrawlWatch — AI Bot Insights generates this file in one click — a catalogue version plus a full-content one — because I got tired of maintaining mine by hand about three updates after writing it. It is free and open source. The hand-written method above works either way, and the file it produces is yours no matter which tool made it.
Mistakes that make one useless
- Dumping the sitemap into it. A hundred bare URLs with no descriptions is a sitemap wearing a costume. The descriptions are the file.
- Writing marketing copy. "Leading provider of innovative solutions" tells a model nothing it can use in an answer. Say what you sell, where, and how to buy it.
- Putting it anywhere but the root. Uploads folder, a blog post about it, a page slug — consumers check
/llms.txtand move on. - Writing it once and forgetting it. Changed prices, dead services, a product you killed last spring — all quoted back to your customers with total confidence. Regenerate when the site changes.
- Expecting it to block training. It cannot. It has no opt-out power and was never meant to. Keeping crawlers out is robots.txt's job, per bot.
- Stuffing keywords into it. It is read by machines that understand prose. Write prose.
FAQ
- Where does llms.txt go on a WordPress site?
- At the domain root, https://yoursite.com/llms.txt, next to robots.txt. WordPress has no screen for it, so you upload it by SFTP or let a plugin generate it. Anything deeper than the root and most consumers will never look for it.
- Do AI assistants actually read llms.txt?
- Some do, some do not — it is a young convention, not an enforced standard. The file costs an hour to write and has no downside, so the question that matters is not whether everyone reads it today but whether you want to be ready for the ones that do.
- Is llms.txt the same as robots.txt?
- No, they are opposites. robots.txt tells crawlers what not to fetch. llms.txt tells language models what your site means. One is a keep-out sign, the other is the summary you hand to welcome guests.
- How often should I update llms.txt?
- Whenever the site changes in a way that would embarrass you if quoted: new products, removed services, changed pricing. A stale llms.txt misquotes you with confidence, which is worse than having none.
- Can llms.txt stop AI training on my content?
- No. It has no opt-out mechanism and no enforcement. If you want crawlers kept out, that is robots.txt per bot. llms.txt assumes the models already have your pages and tries to make what they say about you accurate.
Conclusion
An hour, a text editor, and an honest description of your own site. That is the entire project. The models are going to describe you whether you participate or not — llms.txt is simply you choosing to be in the room when it happens.
Write it by hand once, so the decisions are yours. Then automate keeping it fresh, because nobody remembers the little file at the root. And when some assistant quotes you correctly six months from now, you will never know — which is exactly how infrastructure is supposed to feel.