# Project LLMs.txt > Project LLMs.txt is a WordPress plugin that publishes the structured Markdown > files ChatGPT, Claude, Perplexity, Gemini, and other AI assistants use to > understand a site. Install once, stay ready. The plugin generates /llms.txt (a structured index), /llms-full.txt (the same index with full page content inlined), and individual per-page Markdown files. Free version on WordPress.org; Pro adds auto-regeneration, custom templates, ACF and custom-field mapping, per-page overrides, and a post-editor AI Preview. Both files exist for this site: https://projectllmstxt.com/llms.txt is the index, and https://projectllmstxt.com/llms-full.txt is that index followed by the full Markdown content of every page, doc, and post listed below. ## Pages - [Home](https://projectllmstxt.com/): What the plugin does, how it works in three steps, feature highlights, pricing overview, and FAQ. - [Features](https://projectllmstxt.com/features): The full feature tour with screenshots - clean Markdown output, ACF field mapping, WooCommerce detail, WP-CLI, hooks, and what Pro adds. - [Pricing](https://projectllmstxt.com/pricing): Free forever, Pro $49/yr (1 site), Studio $99/yr (5 sites), Agency $199/yr (unlimited). Monthly billing available. 30-day money-back guarantee. - [About](https://projectllmstxt.com/about): Who builds the plugin and why. - [FAQ](https://projectllmstxt.com/faq): Common questions about the llms.txt standard, AI assistant support, page builders, privacy, and refunds. - [Contact](https://projectllmstxt.com/contact): Support and general inquiries. ## Documentation - [Quick start](https://projectllmstxt.com/docs/quick-start): Zero to a live /llms.txt in three steps. - [Installation](https://projectllmstxt.com/docs/installation): Requirements, WordPress.org install, manual zip upload, and Pro setup. - [Configuration](https://projectllmstxt.com/docs/configuration): Every setting - site information, content types, extraction, integrations. - [Templates](https://projectllmstxt.com/docs/templates): Template kinds, variable substitution, conditionals, ACF and custom meta variables. - [Troubleshooting](https://projectllmstxt.com/docs/troubleshooting): Fixes for empty output, permission errors, and stale files. - [Hooks & filters](https://projectllmstxt.com/docs/hooks): The developer reference for every action and filter, including WP All Import examples. ## Blog - [What is llms.txt? The complete guide for site owners](https://projectllmstxt.com/blog/what-is-llms-txt): Plain-English guide to the llms.txt standard - what it is, who reads it, and whether your site needs one. - [llms.txt vs robots.txt vs sitemap.xml: what is the difference?](https://projectllmstxt.com/blog/llms-txt-vs-robots-txt-vs-sitemap): How the three root-level files differ, whether they conflict, and which ones a WordPress site needs. - [The real state of llms.txt adoption in 2026](https://projectllmstxt.com/blog/llms-txt-adoption-2026): An honest status check on who publishes llms.txt, who actually reads it, and whether it is worth doing. - [How to make your WordPress site readable by AI](https://projectllmstxt.com/blog/make-wordpress-site-readable-by-ai): Step-by-step guide to publishing llms.txt and llms-full.txt on WordPress, verifying they are live, and the settings worth revisiting. - [llms.txt for WooCommerce: turning products into AI-ready files](https://projectllmstxt.com/blog/llms-txt-for-woocommerce): How a WooCommerce catalog exports as Markdown - price, stock, variation, and review data stated plainly instead of inferred from HTML. ## Legal - [Privacy](https://projectllmstxt.com/privacy) - [Terms](https://projectllmstxt.com/terms) - [Refund policy](https://projectllmstxt.com/refund-policy) ## Brand - Tagline: Make your site readable by AI. - Primary color: teal (#0D9488) - Pro / upgrade color: violet (#7C3AED) --- # Full Content --- # Project LLMs.txt - Make your site readable by AI **URL:** https://projectllmstxt.com/ > Project LLMs.txt publishes the clean, structured Markdown that ChatGPT, Claude, Perplexity, Gemini, and other AI assistants use to understand your site. Install once, stay ready. --- Project LLMs.txt is a WordPress plugin. It publishes the clean, structured Markdown that ChatGPT, Claude, Perplexity, Gemini, and other AI assistants use to understand your site. Install once, stay ready. It is GPL licensed, calls no external APIs, runs entirely on your own server, and sets no cookies and no tracking. ## The llms.txt standard Search engines needed `robots.txt` to understand your site. AI assistants need `llms.txt`, a structured Markdown manifest of your content. Without it, they are guessing at your HTML. ## How it works, in three steps 1. **Install the plugin.** Two minutes from WordPress.org. Free, no account needed, no data leaves your server. 2. **Click Generate.** The plugin scans your posts, pages, and products and converts everything to clean, structured Markdown in one click. 3. **Your site, in the format AI reads best.** When any AI tool visits your site and finds `/llms.txt`, it gets a clean structured index of everything - not a pile of HTML to fight through. ## What sets it apart Most llms.txt plugins stop at a list of links. Project LLMs.txt reads your content the way an AI assistant would, and it respects the rules you have already set. - **It respects your SEO settings.** Pages set to noindex or nofollow in Yoast, Rank Math, SEOPress, AIOSEO, or Slim SEO are left out automatically. What you keep out of search stays out of AI. (Free) - **It actually reads your ACF fields.** Text, WYSIWYG, repeaters, flexible content, galleries, relationships, and the rest are converted to clean Markdown and mapped into your templates field by field. (Pro) - **A real Markdown file for every page.** An individual `.md` file for each post, page, and product at `/llms/slug.md`, so an assistant can pull one page without downloading your whole site. (Pro) - **WooCommerce, in real detail.** Products carry variations and per-variation pricing, stock status, customer reviews, and related items. (Free) - **Made for developers and agencies.** Run everything from WP-CLI, and keep your files in sync after a bulk import with documented regeneration hooks that work from WP All Import or any custom script. (Free) - **Nothing leaves your server.** No third-party scripts, no cookies, no analytics. (Free) It works with how you already build: Gutenberg, Classic Editor, Elementor, Divi, Visual Composer, ACF, and WooCommerce. Published content is read by default, with an optional full-page scrape for layouts that render outside the editor. ## How it compares Against a typical llms.txt plugin, based on a June 2026 review of the most-installed one: | | Project LLMs.txt | Other llms.txt plugins | |---|---|---| | ACF fields | Every field type converted to Markdown | Included, but fields not converted | | Per-page Markdown files | Generated for every page | Uploaded by hand, one at a time | | WooCommerce | Variations, reviews, related items | Basic catalogue, in or out | | WP-CLI | Full command set | Not available | | Bulk-import hooks (WP All Import) | Yes, via regeneration hooks | No | | Custom fields in templates | Any post meta as a variable | Not available | | Tracking and cookies | None, ever | Often an add-on that sets cookies | | Respects SEO noindex | Yes | Yes | ## Pricing at a glance Free forever on WordPress.org. Pro $49/yr for 1 site, Studio $99/yr for 5 sites, Agency $199/yr for unlimited sites. Monthly billing is available. Every paid plan carries a 30-day money-back guarantee. --- # Features - everything Project LLMs.txt does **URL:** https://projectllmstxt.com/features > Project LLMs.txt turns your WordPress content into the clean Markdown that ChatGPT, Claude, Perplexity, Gemini, and other AI assistants read best, and it respects the rules you have already set. --- Project LLMs.txt turns your WordPress content into the clean Markdown that ChatGPT, Claude, Perplexity, Gemini, and other AI assistants read best, and it respects the rules you have already set. ## Three files, one source of truth Everything is generated from the content you have already published. No rewriting, no rebuilding. - **`/llms.txt`** (Free) - a structured index of every post, page, and product with a short description each. - **`/llms-full.txt`** (Free) - the same index with the full Markdown body of every page inlined, so an assistant gets complete context in one fetch. - **`/llms/slug.md`** (Pro) - an individual Markdown file per page, so an assistant can pull one page without downloading the whole site. ## Your builder, your fields, captured properly Project LLMs.txt reads your published content by default, covering Gutenberg, Classic Editor, shortcodes, and shortcode-based builders like Divi and Visual Composer. For builders or theme sections that render outside the editor, such as Elementor, an optional full-page scrape loads each page the way a browser does. ACF fields are not just tolerated, they are converted to Markdown field by field, and each becomes a `{{acf_field_name}}` variable you can place in a template. Capture is free; ACF field mapping is part of Pro. ## WooCommerce, in real detail Products carry variations with per-variation pricing, SKU and stock, the average rating and last few customer reviews, related and upsell products, categories, and weight and dimensions. Your catalogue reads the way a shopper would describe it, not as bare titles. Included free. ## More of what's inside - **Respects your SEO settings** (Free) - pages set to noindex or nofollow in Yoast, Rank Math, SEOPress, AIOSEO, or Slim SEO are excluded automatically. Filters are available to extend the check for custom setups. - **Compatible with WP All Import** (Free) - regeneration hooks, including a documented `pmxi_after_xml_import` example, let your files rebuild themselves after a big import or migration. - **Built for developers** (Free) - drive everything from the command line: `wp llmstxt generate`, `status`, `list`, and `clear`, for automation and CI. - **No tracking, no cookies** (Free) - no third-party scripts, no analytics. The plugin reads your content and writes the files, and it stays GPL licensed. ## Documented hooks and filters Almost everything is an extension point. Drop a few lines into a theme's `functions.php` or a small plugin and Project LLMs.txt picks it up, with no settings to change: `llmstxt_regenerate`, `llmstxt_post_is_publicly_exportable`, `llmstxt_seo_noindex_check`, `llmstxt_template_*`, `llmstxt_is_sensitive_meta_key`, `llmstxt_acf_repeater_output`, and more. Every hook and filter is documented at https://projectllmstxt.com/docs/hooks. ## What Pro adds The free plugin generates your index and keeps it accurate by hand. Pro is about staying current automatically and controlling exactly what AI reads. - **Auto-regenerate on publish** - files rebuild in the background after you save, usually within about a minute, with a debounce for bulk edits. - **Individual `.md` file per page** - a standalone Markdown file for every post, page, and product at `/llms/slug.md`. - **Custom templates per content type** - edit and save templates with `{{variable}}` tokens and conditional blocks, then bulk-regenerate. - **Post editor AI Preview** - see exactly what AI reads from a post while you write it, and hand-tune a single page with a per-page override. Free users can preview any page's Markdown; editing is Pro. - **Custom field mapping** - pull ACF fields and any custom post meta into your output as `{{acf_*}}` and `{{meta_key}}` variables. Sensitive keys are blocked by default. - **Per-type live endpoint serving** - serve individual `.md` files dynamically per content type, so large catalogs and fast-changing content stay current without regeneration runs. --- # Pricing - start free, upgrade when you're ready **URL:** https://projectllmstxt.com/pricing > Free forever on WordPress.org. Pro $49/yr for 1 site, Studio $99/yr for 5 sites, Agency $199/yr for unlimited sites, with monthly billing available and a 30-day money-back guarantee. --- The free plugin does the hard work. Pro unlocks the features serious publishers need. Annual billing saves roughly 42% against monthly. ## Plans - **Free** - $0 forever, free on WordPress.org. Generate `/llms.txt` and `/llms-full.txt`, all post types plus WooCommerce, built-in templates, WP-CLI support. 1 site. - **Pro** - $49/yr for 1 site (about $4/mo billed annually), or $7/mo billed monthly. Everything in Free, plus auto-regenerate on publish, individual `.md` files, custom templates, custom field mapping (ACF and post meta), and the post editor AI Preview. - **Studio** - $99/yr for 5 sites (about $8/mo billed annually), or $14/mo billed monthly. Everything in Pro, plus 5 site licenses and priority support. - **Agency** - $199/yr for unlimited sites (about $17/mo billed annually), or $29/mo billed monthly. Everything in Studio, plus unlimited sites and white-label options (coming soon). ## Full feature comparison | Feature | Free | Pro | Studio | Agency | |---|---|---|---|---| | Generate `/llms.txt` index | Yes | Yes | Yes | Yes | | `/llms-full.txt` (full inline content) | Yes | Yes | Yes | Yes | | Posts, pages, and custom post types | Yes | Yes | Yes | Yes | | WooCommerce products and categories | Yes | Yes | Yes | Yes | | Built-in templates (read-only) | Yes | Yes | Yes | Yes | | Manual regeneration | Yes | Yes | Yes | Yes | | WP-CLI integration | Yes | Yes | Yes | Yes | | Live endpoint mode | Yes | Yes | Yes | Yes | | Auto-regenerate on publish | - | Yes | Yes | Yes | | Individual `/llms/slug.md` files | - | Yes | Yes | Yes | | Custom templates per content type | - | Yes | Yes | Yes | | Custom field mapping (ACF + post meta) | - | Yes | Yes | Yes | | Per-page Markdown overrides | - | Yes | Yes | Yes | | Post editor AI Preview panel | - | Yes | Yes | Yes | | Site licenses | 1 | 1 | 5 | Unlimited | | Priority support | - | - | Yes | Yes | | White-label | - | - | - | Coming soon | ## 30-day money-back guarantee Not right for you? Email us within 30 days of purchase for a full refund, no questions asked. Start with the free plugin to see exactly what you are upgrading to - between it and the guarantee, trying Pro is risk-free. Every plan is GPL licensed, calls no external APIs, and runs on your own server. Tax is handled by Lemon Squeezy as merchant of record. Subscriptions can be managed, changed, or cancelled at any time at https://projectllmstxt.lemonsqueezy.com/billing. --- # Frequently asked questions **URL:** https://projectllmstxt.com/faq > Common questions about the llms.txt standard, AI assistant support, page builders, privacy, billing, and refunds. --- ## What exactly is llms.txt? `llms.txt` is an emerging standard, analogous to `robots.txt` for search engines, that tells AI assistants what's on your site in structured Markdown. A file at `/llms.txt` gives any AI-powered tool a clean, machine-readable index of your content without having to parse messy HTML. ## Will this work with ChatGPT, Claude, Perplexity, and Gemini? Yes. Project LLMs.txt produces the clean Markdown these tools read most easily, so when ChatGPT, Claude, Perplexity, Gemini, and other AI assistants reach your site, they find a structured index instead of raw HTML. The `llms.txt` standard is still early, and no major AI company has formally committed to it yet, but the file costs nothing to publish and keeps your site ready as more tools adopt it. ## Does it respect my SEO noindex settings? Yes. If you've marked a page noindex or nofollow in Yoast, Rank Math, SEOPress, AIOSEO, or Slim SEO, the plugin leaves it out of your `llms.txt` files automatically. Pages you keep out of search stay out of AI, with no extra setup. ## Does it work with my page builder? Yes. By default Project LLMs.txt reads your published content, which covers blocks, shortcodes, and shortcode-based builders like Divi and Visual Composer. For builders or theme sections that render their layout outside the editor, such as Elementor, switch Extraction Method to Full-page scrape in the plugin settings to load each page the way a browser does. ACF and custom fields are handled separately through Pro field mapping. WooCommerce products are also supported. ## Does it send my content anywhere? No. The plugin runs entirely on your server. It reads your WordPress database, generates the Markdown files, and writes them to your site. Nothing is sent to any external API. Your content stays yours. ## What's the difference between llms.txt and llms-full.txt? `/llms.txt` is the index. It lists your pages and posts with titles, URLs, and brief descriptions. `/llms-full.txt` goes further: it includes the complete Markdown content of every page, so AI assistants can read the full text rather than just your table of contents. Think of it as the difference between a library catalogue and the books themselves. ## How is this different from an XML sitemap? A sitemap tells crawlers which URLs exist. An `llms.txt` tells AI assistants what's actually on your site, in plain Markdown that they can read and reason about directly. Sitemaps are for crawlers that will eventually fetch and render each page. AI assistants often work from pre-processed text and benefit from a clean, structured summary they can consume in one request. ## How do I cancel, upgrade, or manage my subscription? Self-serve, any time, at our [billing portal](https://projectllmstxt.lemonsqueezy.com/billing). Sign in with your purchase email (you'll get a magic link - no password needed) to cancel or resume auto-renewal, switch plans, update your card, and download invoices. Cancelling stops future charges; your license keeps working until the end of the period you've already paid for. ## Is there a free trial? What's your refund policy? You can install the free plugin from WordPress.org and use the core features for as long as you like. When you upgrade, every paid plan is covered by a 30-day money-back guarantee. If Pro isn't right for you, email us within 30 days of purchase and we'll refund in full, no questions asked. Between the two, you can try everything risk-free. --- # About - built out of necessity **URL:** https://projectllmstxt.com/about > Why Project LLMs.txt exists: built by a WordPress and WooCommerce developer who got tired of hand-customizing llms.txt files for every client site. --- Project LLMs.txt is built by a developer with more than ten years of WordPress and WooCommerce experience, working with clients large and small along the way. Recently, every one of those clients started needing an `llms.txt` file - and some of their sites were a lot more complicated than others. Custom fields, page builders, WooCommerce catalogs with variations. No plugin handled everything those sites required, so I kept hand-customizing llms.txt files, site by site. This plugin exists to eliminate that work: to make it easy to generate an llms.txt that actually represents your website - not just a list of links, but your real content, your custom fields, and your products, in the format AI assistants read best. Made to make life easier for companies, and for the developers who look after them. Project LLMs.txt is a product of Imperial Labs (https://imperial-labs.com). --- # Contact - get in touch **URL:** https://projectllmstxt.com/contact > Questions about the plugin, your license, or anything else - we usually reply within one business day. --- Questions about the plugin, your license, or anything else - we usually reply within one business day. - **Email:** support@projectllmstxt.com - **Contact form:** https://projectllmstxt.com/contact, with subject options for general questions, plugin support, billing or license, refund requests, and anything else. - **Documentation:** https://projectllmstxt.com/docs/quick-start - **Troubleshooting:** https://projectllmstxt.com/docs/troubleshooting - **WordPress.org support forum:** https://wordpress.org/support/plugin/project-llmstxt/ - **Subscriptions and invoices:** https://projectllmstxt.lemonsqueezy.com/billing --- # Refund policy **URL:** https://projectllmstxt.com/refund-policy > All paid plans come with a 30-day money-back guarantee: email us within 30 days of purchase for a full refund, no questions asked. --- Last updated: June 29, 2026. The canonical text is the page itself, at https://projectllmstxt.com/refund-policy. The short version: if you are not happy within 30 days of purchase, email us and we will refund you. No questions asked. ## 30-day money-back guarantee All paid plans (Pro, Studio, Agency) come with a 30-day money-back guarantee. If you are not satisfied for any reason within 30 days of your initial purchase, we will give you a full refund. The window applies equally to monthly and annual plans. Renewals are not covered by the money-back guarantee. If you forgot to cancel before a renewal charge and reach out within 7 days, we will consider a refund case by case. After 30 days, annual plan payments are non-refundable, but you can cancel to prevent future renewals. ## How to request a refund Email support@projectllmstxt.com with the email address you used to purchase, your order ID (in your receipt email), and optionally a brief note on what did not work out. Refunds are processed within 3-5 business days and appear on your original payment method within 5-10 business days depending on your bank or card issuer. ## After a refund Your license key is deactivated and Pro features stop working on your site. The free version keeps working normally - you do not lose your llms.txt files or settings, just the Pro-only features. --- # Privacy policy **URL:** https://projectllmstxt.com/privacy > What Project LLMs.txt collects and why: purchase data through Lemon Squeezy, contact form messages through Formspree, and nothing at all from the plugin running on your server. --- Last updated: June 29, 2026. This is a summary for readers of this file; the canonical text is the page itself, at https://projectllmstxt.com/privacy. Project LLMs.txt is operated by Imperial Labs Consulting LLC. Contact: support@projectllmstxt.com. ## What we collect and why - **Purchases** are processed by Lemon Squeezy, our payment provider and merchant of record. They collect your name, email, and payment details; we receive only a transaction summary (order ID, plan, amount, email). We never see or store your full card number. - **Contact form** submissions are handled by Formspree and forwarded to our support inbox. We use the name, email, and message only to answer you. - **Website analytics**, if used, are privacy-respecting: page views, referrers, and general geography. No invasive tracking pixels, and we do not sell visitor data. - **The plugin itself** runs entirely on your WordPress server and sends us no data about your site's content, visitors, or users. Pro license validation makes a single API call containing only your license key and your site's domain - no personal data, no content. ## How we use it To deliver what you purchased and send your receipt, to validate Pro licenses, to answer support requests, and to send transactional email about your order. We do not sell your data and do not send marketing email unless you explicitly opt in. ## Third-party services Lemon Squeezy (payments and licensing), Formspree (contact form), and Cloudflare (hosting and CDN). ## Retention, rights, and cookies Order and license records are kept as long as needed for support and legal obligations (typically 7 years for financial records); contact messages only until your inquiry is resolved. Depending on where you live you may have rights to access, correct, or delete your personal data - email support@projectllmstxt.com, and contact Lemon Squeezy directly for payment data. The marketing site uses minimal cookies for functionality; the Lemon Squeezy checkout overlay may set cookies for fraud prevention and sessions. No advertising or cross-site tracking cookies. --- # Terms of service **URL:** https://projectllmstxt.com/terms > License terms for the free GPLv2 plugin and for Pro, Studio, and Agency licenses, plus billing, acceptable use, warranties, and liability. --- Last updated: June 29, 2026. This is a summary for readers of this file; the canonical text is the page itself, at https://projectllmstxt.com/terms. These Terms govern use of the Project LLMs.txt website and plugin, operated by Imperial Labs Consulting LLC. ## The plugin license - **Free version** - distributed under GPLv2 through WordPress.org, usable on unlimited sites at no cost. - **Pro** - activates Pro features on one WordPress site. - **Studio** - up to five WordPress sites you own or manage. - **Agency** - an unlimited number of sites you own or manage on behalf of clients. Paid licenses are non-transferable and for your use only. You may not sublicense, resell, redistribute, or publicly share a license key. We may revoke a license used in violation of these Terms. Licenses renew automatically and can be cancelled any time through the Lemon Squeezy customer portal. ## Payments and billing Lemon Squeezy acts as merchant of record and handles checkout, VAT and tax collection, and billing, so their terms apply to your purchase as well. Subscriptions renew automatically at the end of each monthly or annual period, with a renewal notice before each charge and no cancellation fees. ## Refunds A 30-day money-back guarantee applies; see https://projectllmstxt.com/refund-policy. ## Acceptable use Do not use the plugin or service unlawfully, reverse-engineer or extract Pro features for redistribution, generate or promote harmful, misleading, or illegal content with it, or interfere with the licensing infrastructure. ## Warranties, liability, and IP The plugin and website are provided "as is" without warranties of any kind. We do not guarantee the plugin will be error-free, that the llms.txt standard will be adopted by any specific AI tool, or that your site will appear in any AI-powered search results. Liability is limited to the amount paid to us in the 12 months before a claim, and excludes indirect, incidental, special, or consequential damages. The Project LLMs.txt name, logo, and website content belong to Imperial Labs Consulting LLC; the WordPress.org plugin code is GPLv2, and Pro-only features are proprietary. ## Changes and governing law We may modify or discontinue the service with reasonable notice, and will offer a prorated refund for any prepaid period if we materially reduce paid functionality. These Terms are governed by the laws of the State of Texas, United States, with disputes resolved in the courts of Travis County, Texas. --- # Quick start **URL:** https://projectllmstxt.com/docs/quick-start **Section:** Documentation > Install Project LLMs.txt, generate your first llms.txt file, and make your site discoverable by AI assistants in under five minutes. --- Get from zero to a live `/llms.txt` in three steps. --- ## Step 1 - Install the plugin Search for **Project LLMs.txt** in *WordPress Admin → Plugins → Add New*, then click **Install Now** and **Activate**. After activation, a new **LLMs.txt** item appears in your WordPress admin sidebar. Need more detail? See [Installation →](https://projectllmstxt.com/docs/installation) for manual zip upload, Pro setup, and server requirements. --- ## Step 2 - Generate 1. Click **LLMs.txt** in the sidebar to open the plugin. 2. On the **Generate** tab, click the **Generate** button. 3. The plugin scans your posts, pages, and any enabled content types, reads your published content (with a full-page scrape available as an option), converts each page to clean Markdown, and assembles the output files. The progress bar fills as each item is processed. When it completes you'll see a confirmation with the number of entries included. _[Screenshot: The Generate tab after a successful run: a success banner and the list of generated AI discovery files with View, Copy URL, and Download actions]_ --- ## Step 3 - Confirm it's live Visit `https://yoursite.com/llms.txt` in a browser. You should see a structured Markdown file that starts with your site name and tagline, followed by sections listing your pages and posts with brief descriptions. That file is what AI assistants read when they want to understand your site. Once it's there, you're discoverable. --- ## What's in the file A typical `llms.txt` looks like this: ``` # Your Site Name > Your site tagline Brief description of your site. ## Pages - [About](https://yoursite.com/about): ... - [Contact](https://yoursite.com/contact): ... ## Posts - [Post Title](https://yoursite.com/blog/post-title): ... ``` The index links out to every included page. AI assistants follow those links to read the full content of individual pages. --- ## Prefer the command line? Everything above also works from WP-CLI - useful for automation, CI pipelines, and bulk operations: ``` wp llmstxt generate ``` _[Screenshot: Terminal output of wp llmstxt generate: a log of each post, page, and product being processed, ending with llms.txt and llms-full.txt written successfully]_ --- ## Next steps - **[Configuration →](https://projectllmstxt.com/docs/configuration)** - choose which content types to include, set word limits, add a footer note, and configure the robots.txt pointer. - **[Templates →](https://projectllmstxt.com/docs/templates)** - customise the Markdown format for each content type. (Pro) --- # Installation **URL:** https://projectllmstxt.com/docs/installation **Section:** Documentation > Install Project LLMs.txt from WordPress.org or upload the zip manually. Covers the free plugin, the Pro version, and server requirements. --- ## Requirements | Requirement | Minimum | |-------------|---------| | WordPress | 6.0 or later | | PHP | 7.4 or later | | Root directory | Writable by the web server (for physical file output) | --- ## Install from WordPress.org (recommended) 1. In your WordPress admin go to **Plugins → Add New Plugin**. 2. Search for **Project LLMs.txt**. 3. Click **Install Now**, then **Activate**. That's it. A new **LLMs.txt** menu item appears in the admin sidebar. --- ## Manual zip upload If your server can't reach the WordPress.org repository, or you're on a private network: 1. Download the latest zip from [wordpress.org/plugins/project-llmstxt](https://wordpress.org/plugins/project-llmstxt/). 2. In your WordPress admin go to **Plugins → Add New Plugin → Upload Plugin**. 3. Choose the zip file and click **Install Now**, then **Activate**. --- ## Installing the Pro version (Pro) The Pro plugin is distributed separately from projectllmstxt.com - it is a full replacement for the free version, not an add-on. 1. Purchase a Pro license at [projectllmstxt.com/pricing](https://projectllmstxt.com/pricing). Your receipt email contains the Pro zip download link and your license key. 2. **Deactivate** the free plugin (if installed) in **Plugins → Installed Plugins**. 3. Upload the Pro zip via **Plugins → Add New Plugin → Upload Plugin** and activate it. 4. Go to **LLMs.txt → Settings** and enter your license key to unlock Pro features. _[Screenshot: The License section of the Settings tab showing a masked license key, the number of sites allowed, when it was last verified, and a green Active badge]_ > **Tip:** You can also upload the Pro zip directly over the free version without deactivating first - WordPress will replace the existing files and keep your settings. --- ## After activation Once the plugin is active: - The **LLMs.txt** item appears in the WordPress admin sidebar. - No files are written yet - output is generated on demand. Head to the [Quick start →](https://projectllmstxt.com/docs/quick-start) to run your first generation. --- ## Troubleshooting activation If the **LLMs.txt** menu item does not appear after activation, try deactivating and reactivating the plugin. If the root directory is not writable, the plugin will still activate; you can switch to Live Endpoint mode or fix the directory permissions later. See [Troubleshooting →](https://projectllmstxt.com/docs/troubleshooting) for more. --- # Configuration **URL:** https://projectllmstxt.com/docs/configuration **Section:** Documentation > A complete walkthrough of every setting in the Project LLMs.txt Settings tab - content types, word limits, file delivery, Pro options, and more. --- All settings live under **LLMs.txt → Settings**. Changes take effect on the next generation run - click **Generate** or **Regenerate** from the Generate tab after saving. --- ## Site Information These three fields appear at the top of every generated `llms.txt` file. | Field | What it does | |-------|-------------| | **Site Name** | Rendered as the `# H1` heading | | **Site Tagline** | Rendered as the `> blockquote` line below the heading | | **Extended Site Description** | A short paragraph below the tagline describing what your site is about | The plugin pre-fills Site Name and Tagline from your WordPress *Settings → General* values. Edit them here without changing your site settings. --- ## Homepage & About Page Controls how the homepage and "about" page are handled - these pages often contain navigation or CMS-injected boilerplate that doesn't read well in Markdown. **Homepage handling** - choose one of: - **Read & include** - read the homepage content and include the converted Markdown body, just like any other page. - **Summary only** - include a brief one-line entry in the index without a body. - **Skip** - omit the homepage from the output entirely. **About page** - the plugin auto-detects a page called "About" or "About Us". Use the dropdown to pin a different page if your about page has an unusual title. --- ## Content to Include Choose which content types are scanned and which items are excluded. **Post types** - toggle each type on or off: - Blog Posts - Pages - WooCommerce Products (visible when WooCommerce is active) - Any registered custom post types **Max Items per Content Type** - limits how many entries per type are included in the output (default: 200). Useful on large sites to keep file size manageable. **Exclude specific pages** - a checkbox list of individual pages to skip. Common candidates are auto-populated: Cart, Checkout, Login, Thank You, and similar utility pages. _[Screenshot: The Content to Include settings: checkboxes for Blog Posts, Pages, and WooCommerce Products with published counts, the Max Items per Content Type field, the exclusion picker with WooCommerce utility pages locked as auto-excluded, and the Extraction Method dropdown]_ --- ## Content Options Fine-tune what's extracted from each page. | Setting | Default | Notes | |---------|---------|-------| | **Max Words per Page** | 0 (unlimited) | Set a number to truncate each page's body at that word count | | **Include images** | Off | Adds `![alt](url)` lines for images found in the page content | | **Include customer reviews** | Off | WooCommerce only; requires WooCommerce to be active | | **Include related/upsell products** | Off | WooCommerce only | | **Footer note** | - | A short line of text appended to every generated file | --- ## Integrations **Add pointer to robots.txt** - when enabled, the plugin appends a `# llms.txt` comment block to your `robots.txt` file pointing AI crawlers to `/llms.txt` and `/llms-full.txt`. This helps AI assistants that start from `robots.txt` discover your structured content files. **Import tools** - third-party import plugins such as WP All Import can trigger regeneration when a bulk import completes. Add a small snippet to your theme or a site-specific plugin that fires `do_action( 'llmstxt_regenerate' )` on the import hook. See [Regeneration triggers →](https://projectllmstxt.com/docs/hooks#regeneration-triggers) for the full list of actions and [WP All Import examples →](https://projectllmstxt.com/docs/hooks#wp-all-import). --- ## Notifications **Email on failure** - if generation fails or encounters errors, an email is sent to the notification address. **Notification email** - defaults to the WordPress admin email. Change it here without affecting the site-wide admin address. --- ## Advanced Settings Click the **Advanced** disclosure to expand: **Extraction Method** - controls how the main body of each page is read (this only affects `{{content}}`, not mapped fields): - **Auto** (default) - reads your published content the way it appears to visitors, including blocks, shortcodes, and page-builder layouts. If a page comes back empty, it automatically loads the full page and pulls just the main content. Best for most sites. - **Post content only** - uses just the content saved in your editor, with blocks and shortcodes applied. Fastest option, but can miss anything your theme or plugins add outside the editor. Pick this if scraping causes errors or timeouts on your host. - **Full-page scrape** - loads each page like a browser, then keeps the main content and removes the header, footer, menus, and sidebars. Pick this if part of your page body is missing, for example a section your theme renders outside the editor or a builder like Elementor that stores its layout separately. It is slower, because it requests every page one by one. **Custom Content Selector** - a CSS selector (e.g. `.entry-content`, `main article`) that tells the scraper exactly which part of the page HTML to extract. Use this if the default Readability-style algorithm picks up unwanted sidebars, headers, or widget areas. Leave blank to use the automatic selector. **Custom Field Mapping** (Pro) - pull extra data into each content type's Markdown output. Enter a comma-separated list of meta key names (e.g. `_yoast_wpseo_metadesc, rating`). These become available as `{{meta_keyname}}` variables in Templates. ACF fields are detected automatically and exposed as `{{acf_fieldname}}` variables. Free users can view this panel; configuring field mapping requires Pro. **File Delivery Mode** - controls how the output files are served: - **Physical file** (default) - the plugin writes static files to the WordPress root directory. Fast, no WordPress overhead on each request. - **Live Endpoint** - files are served dynamically by WordPress rewrite rules. Required if the root directory is not writable. A green/red indicator shows whether the root directory is currently writable. --- ## Individual `.md` Files (Pro) When enabled, the plugin writes a Markdown file for every post, page, and product at `/llms/slug.md`. For example, a post at `/blog/my-post` gets a file at `/llms/blog/my-post.md`. **Per-type serving mode override** - override the site-wide File Delivery Mode for each content type separately. The settings panel shows a recommendation badge based on content count: - Sites with fewer than 500 products or 2,000 posts → Physical file recommended. - Larger sites → Live Endpoint recommended to avoid generating thousands of static files. --- ## Auto-Regeneration (Pro) When enabled, the plugin automatically regenerates the output files whenever a post, page, or product is published or updated. A 5-minute debounce prevents rapid successive saves from triggering multiple back-to-back regeneration runs. Free users see a Pro upgrade prompt here. Manual regeneration from the Generate tab is always available regardless of plan. --- ## Post Editor Integration (Pro) Controls which post types show the **Project LLMs.txt: AI Preview** meta box in the post editor. Check each type you want to monitor per-page without visiting the plugin dashboard. See [Templates →](https://projectllmstxt.com/docs/templates) for details on per-page Markdown overrides in the post editor. --- # Templates **URL:** https://projectllmstxt.com/docs/templates **Section:** Documentation > How the Templates tab works: template kinds, {{variable}} substitution, {{#conditional}} blocks, and available variables per content type. --- The **Templates** tab controls how each content type is formatted in the generated Markdown output. Templates use a simple `{{variable}}` syntax - no coding required. --- ## Template kinds Each content type maps to one of three template kinds: | Kind | Applies to | |------|-----------| | **site** | The top-level `llms.txt` index - the overall structure and section headings | | **post** | Posts, pages, WooCommerce products, and custom post types | | **term** | WooCommerce product categories and custom taxonomies | The site template controls the skeleton of the whole file. Post and term templates control the per-item blocks that get assembled inside it. --- ## Free vs Pro **Free users** see read-only default templates for each content type. The defaults are well-structured and cover the common variables for each type - most sites don't need to change them. **Pro users** (Pro) can edit and save a custom template per content type. A **Reset to default** button is always available to restore the original. Pro users also get a live preview: select a sample item from the dropdown and the rendered output updates as you type. _[Screenshot: The Templates tab editing the Pages template: click-to-insert variable chips for standard and ACF fields, the template source with {{variable}} tokens, a sample-item preview pane, and the Available Variables reference table below]_ --- ## Variable substitution Write `{{variable_name}}` anywhere in a template. The plugin replaces it with the field value at generation time. ### Variables available in all post templates | Variable | Output | |----------|--------| | `{{title}}` | The post/page title | | `{{url}}` | The canonical URL | | `{{content}}` | The full Markdown body | | `{{excerpt}}` | The post excerpt (or auto-generated first paragraph) | | `{{published_date}}` | Publication date | | `{{modified_date}}` | Last-modified date | | `{{featured_image}}` | `![alt](url)` for the featured image | ### Additional variables for posts | Variable | Output | |----------|--------| | `{{author}}` | Display name of the post author | | `{{categories}}` | Comma-separated list of categories (linked) | | `{{tags}}` | Comma-separated list of tags (linked) | ### Additional variables for pages | Variable | Output | |----------|--------| | `{{parent_page}}` | Link to the parent page, if any | ### Variables for WooCommerce products | Variable | Output | |----------|--------| | `{{sku}}` | Product SKU | | `{{price}}` | Current price (regular or sale) | | `{{regular_price}}` | Regular price | | `{{sale_price}}` | Sale price (empty if not on sale) | | `{{stock_status}}` | "In stock" / "Out of stock" / "On backorder" | | `{{stock_quantity}}` | Numeric stock count (if managed) | | `{{short_description}}` | The WooCommerce short description field | | `{{variations_section}}` | Formatted list of product variations with per-variation pricing | | `{{reviews_section}}` | Customer reviews with star ratings (requires *Include customer reviews* in Settings) | | `{{related_section}}` | Related and upsell products (requires *Include related/upsell products* in Settings) | | `{{weight}}` | Product weight with unit | | `{{dimensions}}` | Product dimensions with unit | ### Variables for the site index template | Variable | Output | |----------|--------| | `{{site_name}}` | Your site name | | `{{site_tagline}}` | Your site tagline | | `{{site_description}}` | The extended site description from Settings | | `{{site_url}}` | Your site URL | | `{{pages_list}}` | Auto-generated list of page entries | | `{{posts_list}}` | Auto-generated list of post entries | | `{{products_list}}` | Auto-generated list of product entries | | `{{legal_list}}` | Auto-generated list of legal/utility pages | | `{{generated_date}}` | Timestamp of the last generation run | ### Variables for taxonomy templates (term kind) | Variable | Output | |----------|--------| | `{{title}}` | Taxonomy term name | | `{{url}}` | Term archive URL | | `{{taxonomy}}` | Taxonomy slug (e.g. `product_cat`) | | `{{description}}` | Term description | | `{{count}}` | Number of posts/products in this term | --- ## Conditional blocks Use `{{#variable}}...{{/variable}}` to show a block of text only when the variable is non-empty. This prevents stray headings or labels when a field has no value. **Example:** Only show the SKU line when a product has a SKU set: ``` {{#sku}}**SKU:** {{sku}} {{/sku}} ``` **Example:** Show a variations section only for variable products: ``` {{#variations_section}} ## Variations {{variations_section}} {{/variations_section}} ``` Conditionals can wrap any amount of text, including other variables. --- ## Custom meta fields (Pro) Any meta key listed under **Settings → Advanced → Custom Field Mapping** becomes available as `{{meta_keyname}}` in templates. For example, adding `rating` to the field mapping list lets you use `{{meta_rating}}` in post templates. Custom field mapping (together with ACF fields below) is a Pro feature. --- ## ACF fields (Pro) If Advanced Custom Fields (ACF) is active, use `{{acf_fieldname}}` to pull in any ACF field value by its field name. Conditional blocks work with ACF fields too: ``` {{#acf_summary}}**Summary:** {{acf_summary}} {{/acf_summary}} ``` --- ## Bulk regeneration (Pro) After editing a template, click **Regenerate all** in the Templates tab to re-run generation for every item that uses the changed template. Free users can trigger a full regeneration from the Generate tab at any time. --- ## Per-page Markdown overrides (Pro) When Post Editor Integration is enabled in [Settings →](https://projectllmstxt.com/docs/configuration), an **AI Preview** meta box appears in the WordPress post editor. From there you can: - Preview the auto-generated Markdown for that specific post. - Write a manual override that takes priority over the template output and persists through future regenerations. - Reset to auto-generated output at any time. Free users can preview any page's Markdown from the Generate tab's content list; editing and saving per-page overrides requires Pro. --- # Troubleshooting **URL:** https://projectllmstxt.com/docs/troubleshooting **Section:** Documentation > Fixes for common issues: empty output, scrape fallbacks, file permission errors, stale content, and missing .md files. --- --- ## Generation produces empty or partial output **Symptom:** The Generate button completes but `llms.txt` is empty, or most entries are missing. **Checking the generation log:** Open **LLMs.txt → Settings** and expand the **Last Generation Log** section at the bottom - it auto-expands when errors are present. Each entry that failed or produced a warning is listed with a reason. **Likely causes to check:** - The content type you expect is not toggled on in **Settings → Content to Include**. - All pages in that type are in the excluded pages list. - Max Items per Content Type is set to a low number (e.g. `1`). - The page has no published content (draft, private, or password-protected posts are skipped). - Pages marked noindex or nofollow in your SEO plugin are excluded by design. --- ## Full-page scrape falls back to published content **What this means:** By default the generator reads your published content (blocks, shortcodes, and page-builder output run through WordPress's content filters). If you set **Extraction Method** to **Full-page scrape** under **Settings → Content Extraction**, the generator instead loads each page over an internal HTTP request. When that request fails, it falls back to reading your published content. Blocks and shortcodes still come through on the fallback, because they expand through the same content filters. What the fallback can miss is anything that only exists in the rendered page and not in `post_content` - for example ACF values printed by your theme, or a section your theme or a hook-based builder (such as Elementor) injects outside the editor. To capture ACF and custom fields reliably, use Pro field mapping rather than the scrape. **Common causes of scrape failure:** - The site is behind HTTP authentication, a staging login wall, or a maintenance-mode plugin. - The server blocks loopback requests (requests from the server to itself). - The site URL in **Settings → General** does not match the actual URL the server resolves (e.g. HTTP vs HTTPS mismatch). **How to confirm:** Look for scrape-failure warnings in the Generation Log noting a fall back to published content. **Fix:** If you rely on Full-page scrape, ensure `yoursite.com` is publicly reachable during generation, or whitelist the server's own IP in any access-control layer. If you don't need the scrape, leave Extraction Method on **Auto**, which reads published content directly. On a permanently private staging environment, consider the WP-CLI command on a publicly accessible clone: ```bash wp llmstxt generate ``` --- ## File permission error - cannot write `llms.txt` **Symptom:** Generation completes but no file appears at `/llms.txt`, or an error in the log says the file could not be written. **Cause:** The plugin writes static files to the WordPress root directory. That directory must be writable by the web server user (typically `www-data` or `nobody`). **Check:** Go to **LLMs.txt → Settings → Advanced Settings**. The File Delivery Mode panel shows a green *Writable* or red *Not writable* indicator for the root directory. **Fixes:** 1. **Fix permissions** - set the root directory to writable by the web server user: `chmod 755 /path/to/wordpress` (or ask your host). 2. **Switch to Live Endpoint mode** - this serves files via WordPress rewrite rules without writing anything to disk. Go to **Settings → Advanced → File Delivery Mode** and select **Live Endpoint**. --- ## Output is stale after publishing new content **Symptom:** You published a new post but it doesn't appear in `llms.txt`. **Free plan:** Output is only updated when you manually click **Generate** or **Regenerate** on the Generate tab. There is no automatic update on free. **Pro plan** (Pro): Enable **Auto-Regeneration** under **Settings → Auto-Regeneration**. Once on, the plugin regenerates automatically whenever a post, page, or product is published or updated. A 5-minute debounce prevents rapid saves from stacking multiple jobs. **WP-CLI:** Trigger a fresh generation from the command line at any time - useful in deploy scripts or cron jobs: ```bash wp llmstxt generate ``` **Bulk imports (WP All Import, etc.):** Imports often bypass normal publish hooks, so auto-regeneration may not run. Hook `pmxi_after_xml_import` and fire `do_action( 'llmstxt_regenerate' )` when the import finishes. See [After any import completes →](https://projectllmstxt.com/docs/hooks#after-any-import-completes) for a copy-paste example. --- ## Individual `.md` file not found at `/llms/slug` **Symptom:** You expect a file at e.g. `/llms/blog/my-post` but get a 404. **Causes and fixes:** 1. **Pro required** - Individual `.md` files require a Pro license. The toggle is visible on free plans but does nothing without Pro. [Upgrade →](https://projectllmstxt.com/pricing) 2. **Toggle not enabled** - Go to **Settings → Individual `.md` Files** and ensure the toggle is on. 3. **No regeneration after enabling** - Enabling the toggle does not immediately write files. Run a full regeneration from the Generate tab. 4. **File Delivery Mode mismatch** - If the global or per-type mode is set to **Physical file** but the root directory is not writable (see above), no files are written. Either fix permissions or switch to Live Endpoint mode. --- ## Running on Nginx Everything works on Nginx. One detail worth knowing: individual `.md` files (Pro) are stored in `wp-content/llmstxt-md/` and served through WordPress at `/llms/slug.md`. On Apache, an `.htaccess` file blocks direct access to the storage folder. Nginx ignores `.htaccess`, so the stored files are also reachable at their direct `wp-content` path. The content there is the same public content served at `/llms/*.md`, so nothing private is exposed - but if you want the storage path blocked too, add a small `location` rule to your Nginx config: ``` location ^~ /wp-content/llmstxt-md/ { deny all; } ``` --- ## Where to get help Check the [Generation Log](#generation-produces-empty-or-partial-output) first - it's the fastest way to diagnose most issues. If you're still stuck, you have two ways to reach us: - **[Contact us directly](https://projectllmstxt.com/contact)** if you'd rather reach the developer one-on-one. We read every message and usually reply within one business day. - **Open a support thread on [WordPress.org](https://wordpress.org/support/plugin/project-llmstxt/)** with your log output included. This one is public, so other users hitting the same issue can find the fix too. --- # Hooks & filters **URL:** https://projectllmstxt.com/docs/hooks **Section:** Documentation > PHP filters and actions for customising Project LLMs.txt in code - template overrides, export visibility, SEO noindex checks, per-post file routing, ACF rendering, regeneration triggers, WP All Import integration, and post-generation hooks. --- Every `llmstxt_*` hook is a stable extension point. Drop code into a theme's `functions.php`, a must-use plugin, or a site-specific plugin - the plugin picks it up without any configuration changes. --- ## Filters ### `llmstxt_template_llmstxt` Filters the site-index template string before generation runs. Use this to restructure the top-level `llms.txt` layout in code rather than through the admin UI. | Parameter | Type | Description | |-----------|------|-------------| | `$template` | `string` | The full Mustache template for the site index | **Returns:** `string` - the modified template. **Example:** Add a custom `## Podcasts` section to the index when a `podcast` CPT is registered. ```php add_filter( 'llmstxt_template_llmstxt', function ( $template ) { if ( ! post_type_exists( 'podcast' ) ) { return $template; } $section = "\n## Podcasts\n{{podcasts_list}}\n"; // Insert before the closing footer line return str_replace( '---', $section . '---', $template ); } ); ``` --- ### `llmstxt_template_{type}` Filters the per-item template for a specific content type. The `{type}` portion is replaced with the content type slug when the hook fires. | Parameter | Type | Description | |-----------|------|-------------| | `$template` | `string` | The Mustache template for this content type | | `$post` | `WP_Post` | The post object being rendered (not available for term types) | **Returns:** `string` - the modified template. **Valid `{type}` values:** | Hook name | Applies to | |-----------|-----------| | `llmstxt_template_post` | Blog posts | | `llmstxt_template_page` | Pages | | `llmstxt_template_product` | WooCommerce products | | `llmstxt_template_product_cat` | WooCommerce product categories | | `llmstxt_template_cpt_default` | All other public custom post types | | `llmstxt_template_tax_default` | All other public custom taxonomies | **Example 1:** Append a custom `_review_score` meta field to every post entry. ```php add_filter( 'llmstxt_template_post', function ( $template, $post ) { $score = get_post_meta( $post->ID, '_review_score', true ); if ( $score ) { $template .= "\n**Review score:** {$score}/10\n"; } return $template; }, 10, 2 ); ``` **Example 2:** Add warranty information to products in a specific category, using a conditional block so it only appears when the field is non-empty. ```php add_filter( 'llmstxt_template_product', function ( $template, $post ) { if ( ! has_term( 'electronics', 'product_cat', $post->ID ) ) { return $template; } $warranty_block = "\n{{#meta_warranty_years}}**Warranty:** {{meta_warranty_years}} years{{/meta_warranty_years}}\n"; return $template . $warranty_block; }, 10, 2 ); ``` > `meta_warranty_years` must be listed under **Settings → Advanced → Custom Field Mapping** (a Pro feature) for the variable to resolve. --- ## Export visibility Public `llms.txt` and `.md` output only includes posts that pass export visibility checks. Before any filter runs, the plugin enforces publish status, password protection, and scheduled-future dates. Posts marked **noindex** in a supported SEO plugin are excluded automatically. Built-in support covers: - Yoast SEO - Rank Math - SEOPress - All in One SEO (AIOSEO) - Slim SEO If SEO meta is missing or ambiguous, the post is **included** by default - the plugin does not over-exclude. Use the filters below to add support for other SEO plugins, override a noindex decision, or apply custom editorial rules. ### `llmstxt_seo_noindex_check` Runs after built-in SEO plugin checks. Use this to extend noindex detection or override a result before the final export gate. | Parameter | Type | Description | |-----------|------|-------------| | `$is_noindex` | `bool` | `true` when any built-in SEO check flagged the post as noindex | | `$post` | `WP_Post` | The post being evaluated | **Returns:** `bool` - `true` to treat the post as noindex (exclude from public output), `false` to allow export. **When to use:** - Add support for an SEO plugin not in the built-in list - Override a false positive (force-include a noindexed post in llms.txt) - Apply a custom editorial exclusion rule via post meta **Example 1 - add The SEO Framework support:** The site runs [The SEO Framework](https://theseoframework.com/) (not in the built-in list). Its noindex flag is stored in `_genesis_noindex`: ```php add_filter( 'llmstxt_seo_noindex_check', function ( bool $is_noindex, WP_Post $post ): bool { if ( $is_noindex ) { return true; } if ( function_exists( 'the_seo_framework' ) ) { $tsf_noindex = get_post_meta( $post->ID, '_genesis_noindex', true ); if ( '1' === $tsf_noindex ) { return true; } } return false; }, 10, 2 ); ``` **Example 2 - force-include a strategic landing page:** A PPC landing page is set to noindex in Yoast (to keep it out of Google), but the marketing team still wants AI assistants to discover it via llms.txt. Return `false` for that specific post: ```php add_filter( 'llmstxt_seo_noindex_check', function ( bool $is_noindex, WP_Post $post ): bool { // Post ID 482: /spring-promo - noindex in Yoast, but include in AI output. if ( 482 === $post->ID ) { return false; } return $is_noindex; }, 10, 2 ); ``` > This filter runs **before** `llmstxt_post_is_publicly_exportable`. Returning `false` here does not bypass publish status, password protection, or scheduled-future checks - those are always enforced. --- ### `llmstxt_post_is_publicly_exportable` Final gate for whether a post may appear in public `llms.txt` / `.md` output. Runs after all built-in checks and `llmstxt_seo_noindex_check`. | Parameter | Type | Description | |-----------|------|-------------| | `$exportable` | `bool` | Default `true` when all prior checks passed | | `$post` | `WP_Post` | The post being evaluated | **Returns:** `bool` - `false` to exclude the post from public output. **When to use:** Custom exclusion rules that are not SEO-related - membership tiers, editorial flags, CPT-specific policies. **Example - exclude posts flagged by editorial workflow:** Editors mark sponsor content or thin pages with a custom `_exclude_from_llms` meta field: ```php add_filter( 'llmstxt_post_is_publicly_exportable', function ( bool $exportable, WP_Post $post ): bool { if ( get_post_meta( $post->ID, '_exclude_from_llms', true ) ) { return false; } return $exportable; }, 10, 2 ); ``` > This filter only runs when the post has already passed publish, password, future-date, and SEO noindex checks. It cannot resurrect drafts or password-protected posts. --- ### `llmstxt_post_file_mode` (Pro) Controls whether an individual `.md` file is written to disk or served as a live WordPress endpoint, decided per-post. Overrides the site-wide and per-type setting from the Settings tab. | Parameter | Type | Description | |-----------|------|-------------| | `$mode` | `string` | Current mode: `'physical'` or `'endpoint'` | | `$post_id` | `int` | The post being evaluated | | `$type` | `string` | Content type slug (e.g. `'post'`, `'product'`) | **Returns:** `string` - `'physical'` or `'endpoint'`. **Example 1 - category-based routing:** Serve products in the `sale` category as live endpoints (so price changes are always current), write everything else to disk. ```php add_filter( 'llmstxt_post_file_mode', function ( $mode, $post_id, $type ) { if ( 'product' === $type && has_term( 'sale', 'product_cat', $post_id ) ) { return 'endpoint'; } return $mode; }, 10, 3 ); ``` **Example 2 - opt-in via post meta:** Let editors flag individual posts as live-endpoint by setting a `_llmstxt_live` custom field to `1`. ```php add_filter( 'llmstxt_post_file_mode', function ( $mode, $post_id, $type ) { if ( get_post_meta( $post_id, '_llmstxt_live', true ) ) { return 'endpoint'; } return $mode; }, 10, 3 ); ``` **Example 3 - recency-based routing:** Write posts older than 30 days to disk; serve recently updated content as live endpoints so edits appear immediately without a regeneration run. ```php add_filter( 'llmstxt_post_file_mode', function ( $mode, $post_id, $type ) { $modified = get_post_modified_time( 'U', true, $post_id ); if ( $modified && ( time() - $modified ) < ( 30 * DAY_IN_SECONDS ) ) { return 'endpoint'; } return $mode; }, 10, 3 ); ``` --- ### `llmstxt_acf_repeater_output` (Pro) Filters the Markdown string produced when rendering an ACF repeater field referenced via `{{acf_fieldname}}` in a template. Requires ACF (free or Pro) to be active. | Parameter | Type | Description | |-----------|------|-------------| | `$output` | `string` | The default Markdown output for the repeater | | `$rows` | `array` | All row data from the repeater field | | `$sub_fields` | `array` | ACF sub-field definitions | | `$field_name` | `string` | The ACF field name (e.g. `'faq_items'`) | **Returns:** `string` - the replacement Markdown. **Example:** Render an `faq_items` repeater (with `question` and `answer` sub-fields) as a proper Q&A section instead of a flat list. ```php add_filter( 'llmstxt_acf_repeater_output', function ( $output, $rows, $sub_fields, $field_name ) { if ( 'faq_items' !== $field_name || empty( $rows ) ) { return $output; } $md = "## Frequently Asked Questions\n\n"; foreach ( $rows as $row ) { $q = esc_html( $row['question'] ?? '' ); $a = esc_html( $row['answer'] ?? '' ); $md .= "**Q: {$q}**\n\n{$a}\n\n"; } return $md; }, 10, 4 ); ``` --- ### `llmstxt_acf_flexible_content_output` (Pro) Filters the Markdown string produced when rendering an ACF flexible content field referenced via `{{acf_fieldname}}` in a template. Requires ACF Pro to be active. | Parameter | Type | Description | |-----------|------|-------------| | `$output` | `string` | The default Markdown output for the flexible content field | | `$layouts_value` | `array` | The resolved layout data (layout name + field values) | | `$layouts_config` | `array` | ACF layout configuration definitions | | `$field_name` | `string` | The ACF field name (e.g. `'page_sections'`) | **Returns:** `string` - the replacement Markdown. **Example:** Apply per-layout Markdown formatting for a `page_sections` flexible content field - headings for `hero` layouts, blockquotes for `pullquote` layouts. ```php add_filter( 'llmstxt_acf_flexible_content_output', function ( $output, $layouts_value, $layouts_config, $field_name ) { if ( 'page_sections' !== $field_name ) { return $output; } $md = ''; foreach ( $layouts_value as $layout ) { switch ( $layout['acf_fc_layout'] ) { case 'hero': $md .= "# {$layout['heading']}\n\n{$layout['body']}\n\n"; break; case 'pullquote': $md .= "> {$layout['quote']}\n> - {$layout['attribution']}\n\n"; break; default: $md .= "{$layout['text']}\n\n"; } } return $md ?: $output; }, 10, 4 ); ``` --- ## Actions Project LLMs.txt exposes two kinds of actions: - **Regeneration triggers** (`llmstxt_regenerate*`) - fire these from import tools, custom scripts, or other plugins to start regeneration. - **Post-generation callbacks** (`llmstxt_scheduled_regeneration`) - hook these to run work after regeneration completes. --- ### Regeneration triggers Fire any of these actions with `do_action()` to trigger regeneration from code. They respect the same debounce and lock logic as auto-regeneration - if generation is already in progress, the request queues gracefully via WP Cron rather than erroring. | Action | Regenerates | Tier | |--------|-------------|------| | `llmstxt_regenerate` | `llms.txt` + `llms-full.txt` | Free | | `llmstxt_regenerate_index` | `llms.txt` only | Free | | `llmstxt_regenerate_full` | `llms-full.txt` only | Free | | `llmstxt_regenerate_md` | All individual `.md` files | Pro (no-op on free) | | `llmstxt_regenerate_post` | Single post (`$post_id`) | Free | --- ### `llmstxt_regenerate` Regenerates both `llms.txt` and `llms-full.txt`. No arguments are passed. **Example:** Trigger a full regeneration from a custom deploy script. ```php do_action( 'llmstxt_regenerate' ); ``` --- ### `llmstxt_regenerate_index` Regenerates `llms.txt` only. No arguments are passed. **Example:** Rebuild the site index without re-scraping full page content. ```php do_action( 'llmstxt_regenerate_index' ); ``` --- ### `llmstxt_regenerate_full` Regenerates `llms-full.txt` only. No arguments are passed. **Example:** Refresh the full-content file after a template change. ```php do_action( 'llmstxt_regenerate_full' ); ``` --- ### `llmstxt_regenerate_md` (Pro) Regenerates all individual `.md` files from cached post content. No arguments are passed. On the free tier this is a silent no-op. **Example:** Rewrite physical `.md` files without rebuilding the index files. ```php do_action( 'llmstxt_regenerate_md' ); ``` --- ### `llmstxt_regenerate_post` Regenerates a single post by ID. Validates that `$post_id` is a positive integer and that the post exists; silently no-ops otherwise. | Parameter | Type | Description | |-----------|------|-------------| | `$post_id` | `int` | The WordPress post ID to regenerate | **Example:** Regenerate one post after a programmatic update. ```php do_action( 'llmstxt_regenerate_post', 42 ); ``` > `llmstxt_regenerate_post` uses a per-post lock. If that post is already being generated, the request is queued via WP Cron instead of running immediately. --- ### WP All Import WP All Import (and similar bulk import tools) often bypass normal WordPress publish hooks, so auto-regeneration may not fire. Hook `pmxi_after_xml_import` and fire a regeneration action when the import finishes. `llmstxt_regenerate` rebuilds both `llms.txt` and `llms-full.txt`. Swap in `llmstxt_regenerate_index`, `llmstxt_regenerate_full`, `llmstxt_regenerate_md`, or `llmstxt_regenerate_post` if you only need part of the output updated. #### After any import completes ```php // Regenerate llms.txt after any WP All Import run completes add_action( 'pmxi_after_xml_import', function( $import_id, $import ) { do_action( 'llmstxt_regenerate' ); }, 10, 2 ); ``` #### After a specific import completes ```php // Regenerate llms.txt after specific WP All Import run completes function after_xml_import( $import_id, $import ) { // Only run if import ID is 5. if ($import_id == 5) { do_action( 'llmstxt_regenerate' ); } } add_action( 'pmxi_after_xml_import', 'after_xml_import', 10, 2 ); ``` --- ### `llmstxt_scheduled_regeneration` (Pro) Fires after the debounced background regeneration completes - 5 minutes after a publish, update, or delete triggered it. No arguments are passed. Hook into this to run any post-generation work: purge CDN caches, notify external services, log regeneration events, or ping a URL so downstream systems know fresh content is available. **Example:** Purge a Cloudflare cache zone after the files are regenerated. ```php add_action( 'llmstxt_scheduled_regeneration', function () { $zone_id = defined( 'CF_ZONE_ID' ) ? CF_ZONE_ID : ''; $api_token = defined( 'CF_API_TOKEN' ) ? CF_API_TOKEN : ''; if ( ! $zone_id || ! $api_token ) { return; } wp_remote_post( "https://api.cloudflare.com/client/v4/zones/{$zone_id}/purge_cache", [ 'headers' => [ 'Authorization' => "Bearer {$api_token}", 'Content-Type' => 'application/json', ], 'body' => wp_json_encode( [ 'files' => [ home_url( '/llms.txt' ), home_url( '/llms-full.txt' ), ], ] ), ] ); } ); ``` > Define `CF_ZONE_ID` and `CF_API_TOKEN` as constants in `wp-config.php` to keep credentials out of the database. --- # llms.txt for WooCommerce: turning products into AI-ready files **Author:** Project LLMs.txt **Published:** August 6, 2026 **URL:** https://projectllmstxt.com/blog/llms-txt-for-woocommerce **Section:** Blog > How to export your WooCommerce catalog as Markdown AI can read: turning on products, tuning extraction for your theme, and what price, stock, variation, and review data ends up in the file. --- When a user asks an AI assistant about a product on your store, it has to read your product page the same way it reads everything else: by fetching the HTML and trying to work out what all that code means. There are several problems with this. The price might be split across three nested spans with a currency symbol in its own element. The variation selector is a dropdown populated by JavaScript, so the per-option prices may not exist in the markup at all until something clicks it. Reviews are paginated. Stock status is a CSS class. Somewhere in there is the actual product description, wrapped in tab markup, next to a related-products carousel that looks structurally identical to it. An assistant can often get the product name right and the price roughly right. Past that it starts guessing. An `llms.txt` file solves this by stating all the product information in a format that is easy for AI to understand. Here is how to produce one using Project LLMs.txt, a free WordPress plugin that builds these files from the catalog you already have. ## Turning products on Install [Project LLMs.txt](https://wordpress.org/plugins/project-llmstxt/) from WordPress.org and activate it. WooCommerce products are supported in the free version, with no separate add-on. Something to note: products are off by default. A fresh install exports Posts and Pages only, so if you generate without changing anything, your catalog will not be in the file. Open **Settings → Content Types**, tick **Products**, then go to the Generate tab and click **Generate Now**. Then verify, and see the result for yourself. Open `yoursite.com/llms.txt`, find the `## Products` heading, and check that a product you know well is listed with the right price. If the section is missing entirely, Products did not get enabled. If products are listed but a description looks thin, skip ahead to tuning below. If you have not set up the plugin at all yet, [the general walkthrough is here](https://projectllmstxt.com/blog/make-wordpress-site-readable-by-ai). ## What a product looks like in the output Every published product gets rendered from a product-specific Markdown template. Not a generic page dump with a price bolted on, but a structure built around what a product is. The output looks like this: ```markdown # Harbor Blend, Whole Bean **URL:** https://example.com/product/harbor-blend/ **SKU:** HB-1000 **Price:** $16.00-$42.00 **Availability:** In stock (34 available) **Categories:** [Coffee](https://example.com/product-category/coffee/), [Whole Bean](https://example.com/product-category/whole-bean/) **Tags:** medium roast, blend, house favorite ## Description A balanced everyday blend with notes of cocoa and toasted almond. [full product description continues here in Markdown] ``` Several things there are doing more work than they look like they are. **Price handles the awkward cases.** A simple product shows its price. A product on sale shows the original struck through followed by the sale price, so the assistant can tell the difference between a discount and a price change. A variable product has no price of its own in WooCommerce, so instead of exporting an empty field it shows the range across its variations, and that same range appears wherever the product is listed elsewhere in the file. The index and the detail entry always agree. **Stock status is a sentence, not buried in HTML.** "In stock (34 available)" when you are managing stock levels, "In stock" when you are not, and "Out of stock" when you are out of stock. No inference required. **Categories link back.** Each category is a real Markdown link to its archive, so an assistant reading about one product has a path to the rest of that category. ## Variations, priced individually This is the part that raw HTML handles worst. If your product comes in three sizes at three prices, an assistant reading the page usually sees one number and has no reliable way to attach the others to their options. In the export it becomes a list: ```markdown ## Options & Variations **Size:** 250g, 500g, 1kg **Grind:** Whole bean, Filter, Espresso - Size: 250g | Grind: Whole bean - **$16.00** - Size: 250g | Grind: Filter - **$16.00** - Size: 500g | Grind: Whole bean - **$28.00** - Size: 1kg | Grind: Whole bean - **$42.00** _(out of stock)_ ``` The attribute summary comes first, so a reader gets the shape of the options immediately. Then specific combinations with their own prices, and an out-of-stock marker where it applies. Up to ten variations are listed in full, with a count of any remaining, which keeps a product with sixty combinations from swallowing the file. ## Reviews and social proof If a product has approved reviews, they come through as their own section: ```markdown ## Customer Reviews **Average rating:** 4.6/5 (23 reviews) > 5/5 **Dana R.** (July 12, 2026) > Third bag. The cocoa note is real and it holds up in a moka pot. ``` The average and the count sit at the top, then the five most recent reviews, each trimmed so a long review does not dominate. One small deliberate choice: ratings are written as "4.6/5" rather than drawn with star characters. Star glyphs turn into garbage when a web server hands out a `.txt` file without declaring a character set, and a number parses more reliably anyway. ## Related, upsell, and cross-sell products Your merchandising relationships are already in WooCommerce, and they carry real meaning that gets lost when they are rendered as an anonymous carousel. Upsells become a **You Might Also Like** section. Cross-sells become **Frequently Bought Together**. If you have set neither, WooCommerce's own related-products logic fills in a **Related Products** section instead. Each entry is a linked product name with its price, capped at five, and only visible products are listed. The labels matter more than they might seem. An assistant answering "what should I get with this?" is reading a section that says these are bought together, rather than five product cards in a row that could mean anything. ## Tuning it for your store Two settings are worth a look before you call it done. **Extraction method, if your descriptions look incomplete.** Under **Settings → Content Extraction** there are three modes. Auto is the default and reads your published product content, including blocks and shortcodes. It falls back to loading the full page only when it finds nothing at all. That fallback is the catch. If your theme or a page builder renders part of the product description outside the editor, Auto gets *something*, decides it succeeded, and stops. You end up with a description that is present but missing half its content, which is harder to notice than an empty one. If a product in your file reads shorter than the product page does, switch to **Full-page scrape**, which loads the page the way a browser would and keeps the main content. It is slower, because it requests every page one at a time, and it reads the HTML your server sends, so anything a script draws in after the page loads stays out of reach. Worth knowing: this only affects the description body. Price, SKU, stock, variations, categories, and reviews are read from WooCommerce directly rather than parsed out of your HTML, which is why they stay correct no matter which extraction mode you pick or how your theme renders the page. The variation pricing that a scraper would never find in a JavaScript dropdown is simply asked for. **Catalog size, if you have more than 200 products.** The index lists up to 200 items per content type by default. That covers most sites, but on a 500-product store the remaining 300 are not exported. Check **Max Items per Content Type** in Settings and raise it to cover your catalog, or decide deliberately that the top 200 is what you want in the file. The rest are quick calls: **Reviews and related products are toggles.** Both on by default. Turn them off for a leaner file, or if your review content is not something you want redistributed. **Images are a toggle too.** On by default, which includes the featured image as a Markdown image reference. **Utility pages are excluded automatically.** When WooCommerce is active, Cart, Checkout, and My Account are left out without you asking since they are checkout mechanics and not content. **Individual products can be excluded.** Use the exclusion picker in Settings to exclude specific products you do not want AI to read. To do it programmatically, for example excluding an entire category or everything below a price, the `llmstxt_exclude_ids` filter takes the final list of excluded IDs and lets you add to it. ## The freshness problem, which is bigger for stores For a blog, a stale export is a mild annoyance. A post is missing, or a page says something you rewrote last month. For a store it is worse, because the numbers are the content. Prices change. Sales start and end. Stock runs out. Products get discontinued. Each one of those makes your export wrong in a specific, checkable way, and a machine-readable file confidently stating a price you no longer charge is worse than not publishing one at all. Two things keep the files current. Automatic regeneration rebuilds them whenever content is published or saved, which is a Pro feature. [Public regeneration hooks](https://projectllmstxt.com/docs/hooks#regeneration-triggers) let any script or importer trigger a rebuild. They are free, and they are how a nightly feed sync or a bulk price update keeps the files in step. If your catalog changes a few times a year, clicking Generate yourself works fine. If it changes often, set it up to run on its own so it is one less thing to remember. ## Is it worth doing? Nobody can promise you that an AI assistant will recommend your product because you published a Markdown file. The [state of llms.txt adoption](https://projectllmstxt.com/blog/llms-txt-adoption-2026) is early, and we have written at length about not overselling it. What you can say for sure is smaller than that, and it still matters. When an AI tool does read your store, whether it went looking for the file or simply landed on your domain, it gets your prices, your variations, and your stock status stated plainly instead of inferred from HTML. Being described accurately is not a growth strategy. It is just the floor, and most stores are currently below it. *[Project LLMs.txt](https://projectllmstxt.com) generates `llms.txt` and `llms-full.txt` from your WordPress content. WooCommerce support, including everything described above, is in the [free version on WordPress.org](https://wordpress.org/plugins/project-llmstxt/).* --- # How to make your WordPress site readable by AI **Author:** Project LLMs.txt **Published:** August 4, 2026 **URL:** https://projectllmstxt.com/blog/make-wordpress-site-readable-by-ai **Section:** Blog > A step-by-step guide to publishing llms.txt and llms-full.txt on WordPress: what the files contain, how to generate them, how to verify they are live, and what to check afterward. --- Your website is written for people. Navigation menus, cookie banners, sidebars, related-post widgets, a footer with four columns of links. A human reader skips past all of it without noticing. An AI assistant fetching the same page has to work out which part of that markup is the article and which part is furniture, and it does not always guess correctly. Making your site "readable by AI" means publishing a version of your content with the furniture removed. That is what `llms.txt` does, and on WordPress it takes about two minutes to set up. This post walks through the whole thing: what you are actually publishing, how to generate it, how to confirm it worked, and the handful of settings worth a second look. If you have not met the format yet, start with [what llms.txt is and who reads it](https://projectllmstxt.com/blog/what-is-llms-txt). This post assumes you have decided to publish one. ## What "AI-readable" means in concrete terms It means two files at the root of your domain. `yoursite.com/llms.txt` is an index. Your site name, a one-line description, then a structured list of your pages, posts, and products, each with a link and a short summary. An assistant that fetches this file gets an accurate map of your site in a single request. `yoursite.com/llms-full.txt` is the same index with the full text of every page inlined underneath it, converted to Markdown. One fetch, complete content, no HTML to parse. Both are plain Markdown. Here is roughly what the top of an `llms.txt` looks like: ```markdown # Bright Harbor Coffee > Small-batch roasting in Portland since 2011 ## Pages - [About](https://example.com/about): Who we are and how we source our beans - [Wholesale](https://example.com/wholesale): Pricing and terms for cafes and offices ## Posts - [How we choose a farm](https://example.com/blog/choosing-a-farm): Our sourcing criteria, explained ``` Nothing exotic. That readability is the entire point. ## Step 1: install the plugin Search for **Project LLMs.txt** under **Plugins → Add New**, install, and activate. It is free on WordPress.org. Two requirements worth confirming before you start. You need WordPress 6.4 or higher and PHP 8.1 or higher, which covers most reasonably current hosting. If you want physical files written to your site root, PHP also needs write permission to that directory. Most hosts allow this. If yours does not, there is a setting for that case and we will come back to it. After activation, a **Project LLMs.txt** item appears in your admin sidebar. ## Step 2: tell AI how to introduce your site Open the plugin. On first run the Generate tab shows a short setup card rather than the usual dashboard, and step one on that card is the only part that needs your judgment. **Site name and tagline** are pre-filled from your WordPress settings. They become the heading and the summary line at the top of your `llms.txt`. If your tagline is still "Just another WordPress site," fix it here, because that sentence is the first thing an AI assistant reads about you. **Extended site description** is an optional paragraph underneath. This is your one chance to state plainly what your site is, who it serves, and what makes it different. Two or three sentences is plenty. There is a live preview beside the fields showing the top of your `llms.txt` updating as you type. Step two is a scan of your site, listing each content type it found with an item count. Read it. If something you expected is not on the list, that is the moment to notice. Posts and pages are included by default, and if you run WooCommerce or have custom post types holding real content, you can add them under **Settings → Content Types** before generating. Step three is a preview of the files you are about to get. Nothing to do there. ## Step 3: click Generate Now Click **Generate Now** at the bottom of the card. The plugin walks your published content, reads each item, converts the HTML to Markdown, and assembles the two files. On a small site this finishes in seconds. On a large catalog it takes a little longer and shows a progress bar. What is happening under the hood is the interesting part. For each page, the plugin reads your published content directly, including block output, shortcodes, and page-builder markup. For content your theme renders outside the editor, it can scrape the rendered page instead and use a Readability-style algorithm to find the main content zone, the same general approach browsers use for reader mode. Then it converts what it found to Markdown and drops it into the template for that content type. You do not have to configure any of that. The default extraction mode is set to auto and handles both cases. ## Step 4: verify the files are live Open `yoursite.com/llms.txt` in a new tab. You should see your site name, your description, and your content listed out. Do the same for `yoursite.com/llms-full.txt`. The plugin header gets a **View llms.txt** button once a file exists, and the Generate tab shows a file panel with each file's size and when it was last built. Read the output rather than glancing at it. This is the version of your site an AI assistant will work from, so it is worth checking that your important pages are present, the descriptions read sensibly, and nothing obviously internal has leaked in. One thing that surprises people: if you open the file directly in a browser and see garbled accented characters, the file is almost certainly fine. Some web servers serve `.txt` files without declaring a character set. The file is UTF-8, and AI tools read it correctly. If it bothers you, ask your host to add `AddDefaultCharset UTF-8`, or switch the plugin to Live Endpoint mode, which always declares the charset. ## Step 5: the settings actually worth revisiting Once you have a file you are happy with, four settings deserve a look. **File mode.** Physical files are written to your web root and served directly by your web server, which is the fastest option and the default. Live Endpoint mode serves the same content dynamically through WordPress rewrite rules instead. Use it if your root directory is not writable, or if you are on a host with a read-only filesystem. **Exclusions.** Some pages have no business in a machine-readable summary of your site. Thank-you pages, internal landing pages, anything gated. The exclusion picker in Settings lets you remove them. If WooCommerce is active, the plugin already excludes Cart, Checkout, and My Account automatically, since those are checkout mechanics rather than content. **Your SEO plugin's noindex settings are honored.** If a page is marked noindex or nofollow in Yoast, Rank Math, SEOPress, AIOSEO, or Slim SEO, it is left out of the AI files too. Your existing exclusions carry over instead of quietly leaking through a new surface. **The robots.txt pointer.** On by default, this appends a short block to your `robots.txt` advertising the two files: ``` # AI Assistants User-agent: * Allow: /llms.txt Allow: /llms-full.txt ``` It is a signpost, not a requirement. Nothing breaks without it. See [llms.txt vs robots.txt vs sitemap.xml](https://projectllmstxt.com/blog/llms-txt-vs-robots-txt-vs-sitemap) for how the three files relate. ## What to do next **If you run a store,** the WooCommerce output is where this gets substantially more useful. Products are exported with structured price, SKU, stock status, variation pricing, reviews, and related products rather than as a wall of theme markup. That is worth its own walkthrough: [llms.txt for WooCommerce](https://projectllmstxt.com/blog/llms-txt-for-woocommerce). **If you want to see one page's Markdown,** the Generate tab lists every item with a preview, so you can check exactly what a given page turned into before you worry about the whole file. Editing that output by hand, or changing the templates the plugin renders from, is available in Pro. **If you manage more than one site,** there is a WP-CLI command set. `wp llmstxt generate` and `wp llmstxt status` cover most of what a deploy script or a cron job needs. **And whatever you run, plan for the file going stale.** This is the part people miss. The moment you publish a post, change a price, or update a policy page, your `llms.txt` describes a site that no longer exists. A confidently wrong machine-readable file is worse than none at all. You can regenerate manually whenever you make changes, which is genuinely fine for a site that rarely moves. For sites that change weekly or daily, automatic regeneration on publish is the Pro feature that exists for exactly this problem. That is the whole setup. Install, confirm your site info, click Generate, read the output. Everything after that is refinement. *[Project LLMs.txt](https://projectllmstxt.com) generates `llms.txt` and `llms-full.txt` from the content you have already published, with first-class WooCommerce support and WP-CLI commands. The free version is on WordPress.org.* --- # The real state of llms.txt adoption in 2026 **Author:** Project LLMs.txt **Published:** July 29, 2026 **URL:** https://projectllmstxt.com/blog/llms-txt-adoption-2026 **Section:** Blog > An honest status check on llms.txt: what the server-log data shows, what Google has said on the record, who genuinely reads the file today, and whether it is worth publishing one. --- There is a version of this post that would be easier to write. It would open with a chart showing `llms.txt` adoption climbing, quote a couple of encouraging statements, and land on "get ahead of the curve." We sell a plugin that generates these files, so that post would be in our interest. The problem is that the data does not support it, and you can find the data in about ten minutes. So here is the version that holds up: what the evidence actually shows in 2026, what remains genuinely true in favor of publishing one, and how to decide whether you are in the group that should bother. This post assumes you know roughly what the file is. If you do not, start with [What is llms.txt?](https://projectllmstxt.com/blog/what-is-llms-txt) and come back. ## The headline finding: publication is up, reading is not Two numbers tell most of the story. Publication is growing quickly. An [Ahrefs study of roughly 137,000 domains](https://ahrefs.com/blog/llmstxt-study/), published in June 2026, found `llms.txt` adoption had risen 8.8 times year over year. A separate [SE Ranking analysis of 300,000 domains](https://seranking.com/blog/llms-txt/) put adoption at about 10%. Whatever your sampling method, a meaningful and growing slice of the web now publishes one. Reading has not followed. In the same Ahrefs server-log data, **97% of `llms.txt` files received zero requests from AI crawlers** during the study month. Of the requests that did arrive, AI retrieval bots accounted for around 1.1%. The bulk came from SEO audit tools at roughly 22%, unidentified bots at about 15%, and general web crawlers at about 13%. In other words, the thing most likely to fetch your `llms.txt` today is somebody's SEO scanner. A separate analysis reached the same conclusion from a different angle: across more than 500 million AI bot visits monitored over a 90-day window, only around 400 targeted an `llms.txt` file directly. GPTBot, ClaudeBot, PerplexityBot, and Google-Extended overwhelmingly fetch HTML instead. The gap between those two numbers is the whole story. Publishing has outrun reading by a wide margin, and that is the honest state of things in 2026. ## What Google has said, on the record Google has been unusually direct about this, which removes any need to speculate. Google's AI optimization guidance, updated on May 15, 2026, tells site owners: "You don't need to create new machine readable files, AI text files, markup, or Markdown to appear in Google Search (including its generative AI capabilities), as Google Search itself doesn't use them." That covers AI Overviews and AI Mode as well as classic results, because those features draw from the same Search index. John Mueller of Google [compared `llms.txt` to the old keywords meta tag](https://www.searchenginejournal.com/google-says-llms-txt-is-purely-speculative-for-now/577576/): a file that bots do not request and services do not use. When asked in May 2026 why some Google developer properties publish one anyway, he explained that an internal content system had added support and some teams simply had not removed it, not that Search consumes it. If your goal is Google visibility, in any of its forms, this file does nothing for you. Any copy suggesting otherwise, including any copy from us, would be wrong. The files that do serve search engines are your sitemap and your `robots.txt`, and [those are separate jobs entirely](https://projectllmstxt.com/blog/llms-txt-vs-robots-txt-vs-sitemap). ## Does it affect AI citations? This is the question most people are really asking, and the answer available today is no measurable effect. The SE Ranking work across 300,000 domains looked specifically at whether publishing an `llms.txt` correlated with how often a domain gets cited by large language models. Both statistical analysis and machine learning found no relationship. Having the file did not make a domain more likely to be cited. That is not proof it can never help. It is a finding about the current state of a young convention, and correlational studies have limits. But it is the best evidence anyone has, and it points one direction: if you are publishing an `llms.txt` specifically to get cited more often by ChatGPT, Claude, Perplexity, Gemini, and other AI assistants, you are buying something the evidence does not currently support. ## Where it is genuinely used Now the other side, which is real and gets flattened in the skeptical coverage. **Developer tooling reads it.** The convention started in developer circles and works there. Documentation-heavy, API-first companies like Anthropic, Stripe, and Cloudflare publish one because their audience works inside AI coding assistants that fetch documentation, and a clean Markdown index is far more useful to those tools than a JavaScript-rendered docs site. If your product has developer docs, this is a present-tense benefit. **Ecommerce platforms have committed to it.** This is the shift that changed the picture in 2026. Shopify added native storefront routes for `/llms.txt` and `/agents.md`, generated automatically for stores, as part of its agentic commerce push. Wix generates one automatically for eligible sites, alongside structured data and its site MCP server. Neither company did that on a whim. They did it because they expect AI shopping agents to browse and buy, and they want their merchants readable when it happens. That is a different kind of signal than a crawler statistic. It is two large platforms making a bet with engineering budget behind it. **Agents that act on a site benefit from it.** When an AI tool needs to answer "which of these has the longest battery life?" or complete a purchase on someone's behalf, it has to understand your catalog first. Parsing rendered HTML is slow, lossy, and easy to get wrong. A clean file is the cheaper path. This use case is early, but it is the one the platform investments are aimed at. ## Where it is not used To be equally clear about the boundaries: - **Google Search does not use it.** Stated plainly, repeatedly, in official guidance. - **No major AI company has publicly committed to consuming it** as a ranking or citation signal in production. - **Most `llms.txt` files are never fetched by anything.** 97% saw zero requests in the study month. - **Reports that specific consumer assistants read it** should be treated as unconfirmed signals rather than guarantees. Behavior changes and none of it is contractual. ## So who should publish one? The useful question is not "does llms.txt work," it is "does the cost justify the option value for my site." Cost is the deciding variable, because the benefits are speculative but small effort makes them worth having anyway. **Publish one if you run an online store.** Your platform competitors on Shopify and Wix already ship one automatically. If agent-driven shopping grows even modestly, you want your catalog readable on the same terms as theirs rather than retrofitting under pressure. WordPress and WooCommerce do not generate one for you, which is the whole gap. **Publish one if you have developer documentation or an API.** This is the case with a real, current audience. Your users are inside coding assistants right now. **Publish one if it is genuinely automatic.** If a file generates and updates itself, the calculus is easy. A few minutes of setup buys you a clean machine-readable version of your site and a position on an emerging convention. That is cheap insurance in the plainest sense. **You can comfortably wait if** your site is small and static, you have no store and no docs, and creating the file means writing and maintaining Markdown by hand. Hand-maintaining a file that almost nothing reads is a poor use of an afternoon, and a stale file describing your site inaccurately is worse than no file. Nothing bad happens to you for not having one. ## The honest bull case Strip out the hype and three arguments survive. **It is cheap insurance on a plausible trend.** The direction of travel is more agents reading more sites more often. Whether `llms.txt` specifically is the format that wins is not settled, but the cost of being ready is close to zero when it is automated, and the cost of scrambling later is not. **It gives you editorial control over the machine-readable version of you.** When a tool has to reconstruct your meaning from rendered HTML, the result is whatever it manages to salvage. When you publish the file yourself, you decide what is in it and how it reads. That is worth something independent of how many bots currently fetch it. **Platform behavior is a stronger signal than crawler logs.** The 97% number describes today. Shopify and Wix shipping automatic generation describes what two large companies expect tomorrow. Both are true at once, and the second is the one that would change the first. None of that adds up to "publish this and get found by AI." It adds up to something more modest and more defensible: this is a low-cost, low-risk piece of hygiene with real upside if adoption broadens, and no downside if it does not. ## The short version Publication of `llms.txt` is up sharply. Reading is not: 97% of files got zero requests in the most thorough study available, Google says outright that Search does not use it, and no correlation with AI citations has been found across 300,000 domains. At the same time, developer tooling genuinely reads it, and Shopify and Wix now generate one automatically for stores, which is a real bet by real platforms. Publish one if it costs you almost nothing, especially if you run a store or ship documentation. Do not publish one expecting rankings or citations. Anyone promising those is ahead of the facts. *[Project LLMs.txt](https://projectllmstxt.com) generates and updates your `llms.txt` and `llms-full.txt` from your existing WordPress content, WooCommerce included, so the cost side of this decision stays near zero. It is free to install.* **Sources:** [Ahrefs, "We Analyzed 137K Sites: 97% of llms.txt Files Never Get Read"](https://ahrefs.com/blog/llmstxt-study/); [SE Ranking, "LLMs.txt: Why Brands Rely On It and Why It Doesn't Work"](https://seranking.com/blog/llms-txt/); [Search Engine Journal on Google's position](https://www.searchenginejournal.com/google-says-llms-txt-is-purely-speculative-for-now/577576/); [Wix on agentic commerce](https://www.wix.com/blog/agentic-commerce-on-wix). --- # llms.txt vs robots.txt vs sitemap.xml: what is the difference? **Author:** Project LLMs.txt **Published:** July 28, 2026 **URL:** https://projectllmstxt.com/blog/llms-txt-vs-robots-txt-vs-sitemap **Section:** Blog > Three files sit at the root of your site and they do three different jobs. A clear comparison of robots.txt, sitemap.xml, and llms.txt, and which ones your WordPress site actually needs. --- If you already maintain a `robots.txt` and an XML sitemap, `llms.txt` can feel like one more file to babysit for unclear reasons. It is a fair reaction. The names look similar, they all live at the root of your domain, and plenty of articles blur them together. They are not competing formats. Each one talks to a different audience about a different thing, and none of them replaces another. Here is the clean version. ## The short answer `robots.txt` controls crawler access. `sitemap.xml` lists your URLs for search indexing. `llms.txt` presents your content in readable Markdown for AI tools. They serve different audiences and do not conflict, so a site can publish all three. | | robots.txt | sitemap.xml | llms.txt | |---|---|---|---| | **Format** | Plain text directives | XML | Markdown | | **Purpose** | Permission: what crawlers may fetch | Discovery: which URLs exist | Presentation: what your content says | | **Audience** | Search and AI crawlers | Search engines | AI assistants, agents, and tooling | | **Contains** | Allow and Disallow rules | URLs, last-modified dates, priorities | Titles, links, descriptions, and (in `llms-full.txt`) full page text | | **Read by Google Search** | Yes | Yes | No | | **Standard status** | Long-established convention | Formal protocol (sitemaps.org) | Community convention, proposed 2024 | | **Typical size** | A few lines | Every indexable URL | Curated: your important pages | The one-line mental model: `robots.txt` says what a bot may do, `sitemap.xml` says where things are, and `llms.txt` says what things mean. ## What robots.txt does `robots.txt` is the oldest of the three and the simplest in intent. It sits at `yourdomain.com/robots.txt` and lists rules telling automated crawlers which parts of your site they should not fetch. ``` User-agent: * Disallow: /wp-admin/ Allow: /wp-admin/admin-ajax.php Sitemap: https://example.com/sitemap.xml ``` Two things are worth being precise about, because both are commonly misunderstood. First, it is advisory, not enforcement. Well-behaved crawlers respect it. Anything else can ignore it entirely. If you need content to be genuinely inaccessible, `robots.txt` is not the tool. Use authentication. Second, `Disallow` blocks crawling, not indexing. A URL you disallow can still appear in search results if other sites link to it, because Google knows the URL exists without having fetched it. To keep a page out of the index, let it be crawled and serve a `noindex` directive instead. Increasingly, `robots.txt` is also where site owners set rules for AI crawlers specifically, with agents like `GPTBot`, `ClaudeBot`, `PerplexityBot`, and `Google-Extended` given their own blocks. That is still the same job it always did: access control, now with a wider cast of bots. ## What sitemap.xml does An XML sitemap is a machine-readable list of the URLs on your site that you want search engines to know about, usually with a last-modified date and sometimes a change frequency or priority hint. ```xml https://example.com/guides/pour-over/ 2026-07-01 ``` Its purpose is discovery, and only discovery. A sitemap helps a search engine find pages it might otherwise miss, particularly on large sites, sites with weak internal linking, or new sites with few inbound links. It does not describe your content, it does not rank you, and being in a sitemap is not a promise of being indexed. Google treats it as a hint. WordPress has generated a basic sitemap at `/wp-sitemap.xml` since version 5.5, and SEO plugins like Yoast, Rank Math, and SEO Press replace it with a richer one. If you run any of those, you already have this covered and do not need to think about it. ## What llms.txt does `llms.txt` is the newest of the three, proposed in 2024 and documented at [llmstxt.org](https://llmstxt.org). It is a Markdown file at `yourdomain.com/llms.txt` that gives AI tools a curated, readable version of your site. ```markdown # Acme Coffee Roasters > Small-batch coffee roaster in Portland. ## Products - [Single-origin beans](https://acme.example/beans): Rotating selection, roasted weekly. - [Subscriptions](https://acme.example/subscribe): Monthly bean deliveries. ``` The difference from the other two files is the one that matters. `robots.txt` and `sitemap.xml` are both about your URLs. Neither one carries a word of your actual content. A crawler that reads both still has to fetch each page and dig your meaning out of rendered HTML, past the navigation, the cookie banner, the related-posts widget, and the layout markup. `llms.txt` skips that step. The index file carries titles, links, and short descriptions. Its companion, `llms-full.txt`, carries the full text of your pages converted to clean Markdown, so a tool can get your actual content in a single fetch instead of crawling and parsing dozens of pages. That is the honest distinction: those two files describe where your content is, this one describes what your content says. For a full walkthrough of the format and who reads it today, see [What is llms.txt?](https://projectllmstxt.com/blog/what-is-llms-txt). ## Do they conflict? No, and it is worth understanding why not, because the question comes up constantly. They cannot conflict because they do not overlap in function. `robots.txt` grants or withholds permission. `sitemap.xml` supplies a URL inventory. `llms.txt` supplies content. Nothing in one contradicts anything in another. Publishing an `llms.txt` does not change how Google crawls you, does not affect your sitemap, and does not alter your `robots.txt` rules. The one place they touch is a friendly one. `robots.txt` is a common place to advertise other machine-readable files, which is exactly why the `Sitemap:` line lives there. The same idea works for your AI files: ``` # AI Assistants User-agent: * Allow: /llms.txt Allow: /llms-full.txt ``` That block is a signpost, not a requirement. Nothing breaks without it, and no crawler is obligated to act on it, but it costs nothing and it makes your intent explicit to anything reading your root files. A related question: does `llms.txt` conflict with your SEO settings? It should not. If a page is set to `noindex` in Yoast, Rank Math, or SEO Press, a well-built generator will leave that page out of your AI files too, so your exclusions stay consistent across surfaces rather than leaking through a side door. That behavior is worth checking in whatever tool you use. ## Does llms.txt replace robots.txt or my sitemap? No, on both counts, and anyone suggesting otherwise has the relationship backwards. Your sitemap feeds Google, Bing, and other search engines. Google has stated plainly that its Search systems, including AI Overviews and AI Mode, do not use `llms.txt` at all. Dropping your sitemap in favor of an `llms.txt` would trade a file that demonstrably works for search for a file that has no effect on it. Your `robots.txt` is the only place you set crawler permissions. `llms.txt` has no access-control semantics whatsoever. It cannot block anything, and publishing one does not grant anyone permission they did not already have. Think of it as additive. You keep the two files that serve search engines, and you add a third that serves a different set of readers. ## Which ones does your WordPress site need? **robots.txt: yes, and you probably already have one.** WordPress serves a virtual `robots.txt` automatically, and SEO plugins extend it. The only reason to think about it is if you want to set specific rules for AI crawlers, or if a physical `robots.txt` file exists in your web root, in which case WordPress stops generating the virtual one and that physical file is what gets served. **sitemap.xml: yes, and you almost certainly already have one.** WordPress core generates one, and your SEO plugin likely replaces it with something better. Nothing to do. **llms.txt: worth publishing, with clear eyes about why.** It will not help your Google rankings. What it does is give AI tools an accurate, controlled version of your content instead of leaving them to guess from your HTML, and it puts you ahead of a convention that ecommerce platforms have already started shipping by default. For an honest look at how much it is actually being read today, see [the real state of llms.txt adoption](https://projectllmstxt.com/blog/llms-txt-adoption-2026). The practical difference between the three is maintenance. Your sitemap updates itself. Your `robots.txt` rarely changes. An `llms.txt` written by hand goes stale the moment you publish a post or change a price, and a stale file describing your site wrongly is worse than no file at all. That is the part worth automating. ## The short version Three files, three jobs, no overlap. `robots.txt` sets crawler permissions. `sitemap.xml` lists your URLs for search engines. `llms.txt` hands AI tools your content in a readable form. Keep the first two exactly as they are, add the third if you want a clean machine-readable version of your site, and do not let anyone tell you one replaces another. *[Project LLMs.txt](https://projectllmstxt.com) is a WordPress plugin that generates your `llms.txt` and `llms-full.txt` automatically, adds the robots.txt pointer for you, and respects your existing SEO noindex settings. It is free to install.* --- # What is llms.txt? The complete guide for site owners **Author:** Project LLMs.txt **Published:** July 25, 2026 **Updated:** July 30, 2026 **URL:** https://projectllmstxt.com/blog/what-is-llms-txt **Section:** Blog > A plain-English guide to the llms.txt standard: what the file is, what it looks like, who reads it today, and whether your site needs one in 2026. --- If you run a website, you have probably added a `robots.txt` file at some point, or at least know that one exists. It sits at the root of your domain and tells search engine crawlers where they can and cannot go. `llms.txt` is a newer idea built on the same instinct, aimed at a different audience: instead of guiding search crawlers, it hands AI tools a clean, readable summary of your site. This guide explains what `llms.txt` actually is, what the file looks like, who reads it today, and whether it is worth publishing one in 2026. It is written to be genuinely complete, including the parts that are inconvenient for anyone selling a plugin. If you leave with a clear head about what this file does and does not do, it has done its job. ## What is llms.txt? The one-sentence answer `llms.txt` is a Markdown file at the root of your website (`yourdomain.com/llms.txt`) that gives large language models a curated, plain-text map of your most important content. The analogy to `robots.txt` is useful but only goes so far. `robots.txt` is a set of access rules: it tells crawlers what they may fetch. `llms.txt` is the opposite posture. It is not about restriction, it is about presentation. It says, in effect, "here is my site, described cleanly, so an AI tool does not have to wade through navigation menus, cookie banners, and layout markup to understand what I offer." The standard was proposed by Jeremy Howard of Answer.AI in 2024. It is published and documented at [llmstxt.org](https://llmstxt.org). Importantly, it is a community convention, not an official standard from the W3C, the IETF, or any formal standards body. That matters for setting expectations, and we will come back to it. ## What does an llms.txt file look like? Part of the appeal is how simple the format is. It is just Markdown, following a light structure. A minimal `llms.txt` looks like this: ```markdown # Acme Coffee Roasters > Small-batch coffee roaster in Portland. We sell single-origin beans, > subscriptions, and brewing equipment, and publish brewing guides. ## Products - [Single-origin beans](https://acme.example/beans): Rotating selection of single-origin coffees, roasted weekly. - [Subscriptions](https://acme.example/subscribe): Monthly bean deliveries. ## Guides - [Brewing guides](https://acme.example/guides): How to brew pour-over, French press, and espresso at home. ## About - [Our story](https://acme.example/about): Who we are and how we roast. ``` The structure is deliberately readable by a human and a machine at the same time. An H1 with the site name, an optional blockquote summary, then H2 sections that group links, each link followed by a short description of what it points to. There is no schema to validate against and no required fields beyond the title. If you can write a Markdown list, you can write an `llms.txt`. ## llms.txt vs llms-full.txt: what is the difference? You will often see a second file mentioned alongside it: `llms-full.txt`. The difference is scope. `llms.txt` is the index: titles, links, and one-line descriptions. It is a table of contents. `llms-full.txt` is the same structure with the actual content of each page inlined directly into the file. Rather than linking out to your brewing guide, `llms-full.txt` contains the full text of that guide, converted to clean Markdown, right there in the document. Why have both? An AI tool that just needs to understand your site's shape can read the compact index. A tool that wants the substance without making dozens of follow-up requests can read the full file in one fetch. The index is fast and cheap; the full file is complete. Publishing both covers both cases. For a large site, `llms-full.txt` can get big, so it is common to include your most important pages there rather than every URL. The index can be broader. ## Who reads llms.txt today? This is the question that matters, and it is where a lot of marketing copy quietly overstates things. Here is the honest picture as of 2026. **AI tools that read a site before acting on it use it.** This is the real, live use case, and it is more relevant to a normal store or blog than it first sounds. The clearest example for you is a shopping or research agent: an AI tool that browses a store to answer "which of these wallets is the lightest?" or pulls up an article to summarize it. Rather than crawl your cluttered HTML, it can fetch your `llms.txt` and get a clean version of your content. This is not hypothetical for stores. Shopify built its entire agent-shopping push around exactly this behavior, which is why Shopify stores now automatically generate an `llms.txt` file for every store. **Autonomous agents that act on someone's behalf use it.** As agent-style features spread across AI assistants, a clean map of your site's structure saves an agent from parsing your rendered HTML before it books, buys, or answers. This surface gets more useful as those features spread, not less. **Some in-product AI assistants are reported to fetch it.** There are credible reports that assistants like Perplexity and Claude reference `llms.txt` in their retrieval workflows. Treat these as encouraging signals rather than guarantees; the companies have not all made firm public commitments, and behavior can change. ## Does llms.txt help SEO or Google rankings? **Google Search does not use it.** This is not speculation. In June 2025, Google's John Mueller said publicly that no AI system was using `llms.txt` at that time. Google then went further: in a June 2026 update to its AI-optimization guidance, it stated plainly that `llms.txt` has no effect, positive or negative, on Search rankings or on AI Overviews. If your goal is Google ranking, this file does nothing for you. **The big consumer assistants do not use it for ranking or citations.** No major AI company (Google, OpenAI, Anthropic, Meta, Mistral) has publicly committed to consuming `llms.txt` in production as a ranking or citation signal. There is no measurable evidence that publishing one gets you cited more often by ChatGPT, Claude, Perplexity, Gemini, and other AI assistants in their consumer answers. **And adoption on the reading side is genuinely low.** An Ahrefs study of roughly 137,000 sites in 2026 found that about 97% of `llms.txt` files never received a single AI request. Files are being published far faster than they are being read. You will also see `llms.txt` marketed under labels like GEO (generative engine optimization) or AEO (answer engine optimization). The goal those terms describe is real: as more people start their research inside an AI assistant rather than a search box, being easy for those systems to read and quote genuinely matters. But `llms.txt` is not a proven lever for it, and no study to date has found a correlation between publishing one and being cited more often. Anyone selling the file as an AI search ranking tactic is ahead of the evidence. None of this means the file is useless. It means you should publish one for the right reasons. ## Which sites already publish an llms.txt? The standard started in developer circles. Documentation-heavy, API-first companies like Anthropic, Stripe, and Cloudflare were early to publish an `llms.txt`, because their audience lives in AI coding tools that read these files. That is real, but if you run a store or a blog, it is also easy to shrug off as "not my world." So here is the part that is your world. It has spread to ecommerce, and it has spread fast. As of May 2026, **Shopify generates an `llms.txt` automatically for stores on its platform**, as part of its push into agent-driven shopping. **Wix** does the same for its premium ecommerce plans. That means millions of ordinary online stores now ship one without the owner lifting a finger. These are not developer tools. They are the shops you actually buy from. You can open real examples right now: - **Ridge** ([ridge.com/llms.txt](https://ridge.com/llms.txt)), the minimalist wallet brand, publishes a clean, detailed index of its collections, pricing, materials, shipping, and return policy, exactly the kind of thing a shopper might ask an AI assistant about. - **Allbirds** ([allbirds.com/llms.txt](https://www.allbirds.com/llms.txt)), the shoe brand, publishes one aimed at shopping agents that browse and buy on a customer's behalf. Both of those are Shopify stores, which is the point. If you sell on Shopify or Wix, you already have an `llms.txt` whether you thought about it or not. Here is the honest catch, and it is exactly why this matters for you: **WordPress and WooCommerce do not generate one for you.** There is no native `llms.txt` in WordPress core or in WooCommerce. So a WooCommerce store, which might have a far better catalog than a random Shopify shop, is currently the one showing up to AI tools as raw, cluttered HTML while its Shopify competitors hand over a clean, structured file automatically. That gap is the reason a plugin exists. So the two facts sit together honestly. Reading adoption across the whole web is still low, and the platforms your competitors use are already shipping this by default. If your read of the trend is that machine-readable stores become normal, you want a clean one published now, not a scramble later once it is expected. ## Why publish an llms.txt anyway? Three reasons hold up. **It puts you ahead of an emerging standard.** The companies you would benchmark yourself against are already publishing. The sites that already speak the format win the moment adoption broadens, and you are not left retrofitting your whole catalog under pressure. Publishing now is a position, not a chore. **It is genuinely useful to agents and tooling right now.** If any part of your audience uses AI shopping agents, research agents, or coding tools that fetch content, a clean `llms.txt` helps them today. For online stores, content businesses, documentation-heavy sites, and developer products alike, this is a present-tense benefit, not a bet on the future. **It gives you a clean, controlled representation of your site.** Rather than letting a tool guess at your content from cluttered HTML, full of navigation, cookie banners, and layout markup, you hand it an accurate, curated version and decide what matters. That control is the whole point, and it is worth getting right rather than approximating by hand. What you should not do is publish one expecting a ranking boost or guaranteed citations. That promise is not backed by evidence today, and anyone who tells you otherwise is selling ahead of the facts. The honest value is real, but it is about being machine-readable and being early, not about gaming search. ## How to create an llms.txt file on WordPress You have two paths. By hand, you write the Markdown yourself and upload the file to your site's root so it is served at `yourdomain.com/llms.txt`. This is fine for a small, static site, and it is a good way to learn the format. The catch is maintenance: every time your content changes, the file drifts out of date, and a stale `llms.txt` misrepresents your site. Automatically, a plugin reads your existing pages, posts, and products, converts them to clean Markdown, and writes both `llms.txt` and `llms-full.txt` for you. On WordPress that is the far more practical route, especially once you have more than a handful of pages or a store to describe. Our own [Project LLMs.txt](https://projectllmstxt.com) plugin does exactly this: install it, click Generate, and your files are live in a couple of minutes, WooCommerce products included. ## Frequently asked questions ### Is llms.txt an official web standard? No. It is a community convention, proposed by Jeremy Howard of Answer.AI in 2024 and documented at llmstxt.org. No standards body has adopted it, and no AI company is obliged to read it. ### Does llms.txt improve my Google rankings? No. Google has stated that the file has no effect on Search rankings or on AI Overviews, in either direction. Publish it for the tools that do read it, not for Google. ### Do I need both llms.txt and llms-full.txt? Not strictly, but publishing both covers more situations. The index is small and cheap for a tool to fetch, while the full file spares it from making dozens of follow-up requests to read your actual content. ### Does WordPress create an llms.txt automatically? No. Neither WordPress core nor WooCommerce generates one. Shopify does, and Wix does on its premium ecommerce plans, which is why WordPress stores are currently the ones handing AI tools raw HTML while their competitors hand over clean Markdown. ### Where does the llms.txt file go? At the root of your domain, served at `yourdomain.com/llms.txt`, the same place `robots.txt` lives. Tools look there and nowhere else, so a copy in a subdirectory will not be found. ### Will llms.txt conflict with my robots.txt or sitemap.xml? No. The three files do different jobs and none of them overrides another. `robots.txt` controls crawler access, `sitemap.xml` lists your URLs for search engines, and `llms.txt` describes your content for AI tools. ### How often should I update it? Whenever your content changes in a way that would make the file wrong. A stale `llms.txt` actively misrepresents your site, which is arguably worse than not having one, so the file is only as valuable as it is current. ## llms.txt in summary `llms.txt` is a simple Markdown file that describes your site cleanly for AI tools. It is used today by AI shopping and research agents, coding assistants, and other AI tooling, and it is now generated automatically by platforms like Shopify and Wix. It is not used by Google Search, and there is no evidence it improves your visibility in consumer AI answers. Adoption on the reading side is still early. Publish one because it helps the tools that already read it, because it gives you a clean and controlled version of your site, and because the platforms your competitors use are already doing it for them. Do not publish one expecting it to change your Google rankings. Within those honest bounds, it is worth doing, and worth doing properly. If you are still sorting out how this file relates to the ones you already have, see [llms.txt vs robots.txt vs sitemap.xml](https://projectllmstxt.com/blog/llms-txt-vs-robots-txt-vs-sitemap). For an honest look at how much it is actually being read, see [the real state of llms.txt adoption in 2026](https://projectllmstxt.com/blog/llms-txt-adoption-2026). *[Project LLMs.txt](https://projectllmstxt.com) is a WordPress plugin that generates your `llms.txt` and `llms-full.txt` automatically, WooCommerce included. It is free to install and takes about two minutes to set up.*