LLMs.txt Curator

Description

LLMs.txt Curator gives you control over what your website tells AI systems and other machines about itself.

It finds the public content on your site, publishes it to llms.txt and llms-full.txt, and then lets you curate that representation: review what was found, write descriptions, arrange the order machines read, mark what matters most, and ask Curator why any individual page is or is not included.

Version 2.0 is a rebuild around that idea. Every page, custom URL and fact is a Resource with its own editorial state and a recorded origin, so Curator can always answer three questions: what am I publishing, where did it come from, and why.

What 2.0 gives you

  • Automatic discovery, human curation. Curator finds your public content and publishes it straight away, marked as found automatically rather than reviewed. You promote what you have checked, exclude what you do not want, and nothing waits on you to be represented.
  • Your llms.txt. Arrange sections and pages with exactly what machines receive shown beside you as you work, in readable form or as the Markdown that gets published. Drag if you like; every move is also a button.
  • Why? Open any resource and see the decisions behind it, separated into what Curator observed about the page and what you decided, ending with the exact line it contributes to the file.
  • Representation coverage. Not a score. Curator tells you whether it can account for every resource it found: represented, excluded by you, unavailable to visitors, or not yet checked. The goal is zero unexplained.
  • Unpublished changes. When your curation differs from the published file, Curator says so, shows what changed including the old and new wording, and publishes when you are ready.
  • Check what visitors receive. After publishing, Curator looks at your public file and tells you plainly whether visitors get the new version, or whether a cache or an old file is serving an older copy.
  • Markdown pages (optional). Switch on to offer each page in your llms.txt as Markdown at its address plus index.md, for example /about/index.md, following the llms.txt proposal. Off by default.
  • Suggested descriptions, honestly labelled. Curator can fill empty descriptions from what the page already publishes (schema, SEO meta, excerpt, Open Graph, page content) and tells you which one it used. A suggestion stays marked as a suggestion until you accept or edit it. Curator does not write text for you.
  • Site details. Describe the organisation behind the site once, and Curator publishes it above the first section. Where WordPress or your SEO plugin says something different, Curator shows you both and publishes your choice.
  • Facts and custom URLs. Publish a short factual statement that does not deserve its own page, or a URL Curator did not find on its own. Curator stores and represents a URL; it never fetches it.

Safe by default

  • Both files are generated as a logged-out visitor, so nothing appears that the public cannot already read.
  • Drafts, private pages, password-protected pages, membership-restricted pages and noindex pages are left out, and Curator explains each exclusion.
  • An llms.txt this plugin did not create is never overwritten.
  • No AI ranking claims, no scores, no data sent anywhere. The only requests Curator makes are to your own site, to check what visitors receive.

What llms.txt is, and what it isn’t (June 2026)

Being straight with you matters more than overselling. Google Search ignores llms.txt: it will not help or harm your Google rankings, and Google confirmed in June 2026 that it is fine to maintain the file for other systems that do read it. So this plugin is not an AI ranking” tool.

Where the file genuinely earns its place: on-site navigation for agents already on your site, the surfaces that actually read it (such as Perplexity and coding agents), and passing Chrome’s Agentic Browsing audit. The honest, useful question is not does this rank me” but which AI bots are actually reading my file”, and this plugin answers it from your own server logs.

What makes this different

Most llms.txt plugins treat the file as a static output. LLMs.txt Curator treats it as a living asset:

  • Description coverage: Curator shows how many published resources have a description and which still need one. It is a count, not a score.
  • Suggested descriptions: fills empty descriptions from what the page already publishes (schema, SEO meta, excerpt, Open Graph, page content), names the source it used, and leaves each one marked as a suggestion until you accept or edit it. Never overwrites what you wrote.
  • Change detection: the header tells you when your curation differs from the published file, and Publish brings it up to date.
  • Per-Page Title Override: set a different title for each page specifically for AI consumption, without touching your on-site SEO.
  • Safety checks: Curator will not publish a file with missing or duplicated pages or broken formatting. Includes an on-demand format check with plain-English results.
  • AI Crawler Analytics: see which bots visited in the last 7 days, with a visual bar chart. OpenAI, Anthropic, Perplexity, Google: know who is actually reading your file.

Core features

  • Visual composition: arrange sections and pages in Your llms.txt, with the resulting file shown beside you; each section becomes an ## heading per the spec
  • llms-full.txt generation: the companion file with full Markdown content for each curated page
  • Five SEO plugin integrations: Rank Math, Yoast SEO, All in One SEO, SEOPress, The SEO Framework
  • Schema-aware descriptions: uses structured data before falling back through the description chain
  • When to publish: Instant (about 30 seconds after a change), Daily, Weekly, or only when you click Publish
  • WooCommerce support: SKU, price, stock, categories, dimensions; respects product visibility
  • WordPress Multisite: network-activate across all sites; each site manages its own independent llms.txt; a network screen to publish each site or all of them
  • Pre-built templates: Business, E-commerce, SaaS, Blog, Local Business
  • Show the whole file: read the exact file before you publish, in readable form or as Markdown
  • Markdown pages: optional per-page Markdown for everything in your llms.txt, with excluded and non-public pages returning not found
  • Import / export: move your configuration between sites as JSON
  • WP-CLI: wp llms-txt regenerate, wp llms-txt status, wp llms-txt crawler-log
  • REST API: POST /wp-json/llms-txt/v1/regenerate, GET /wp-json/llms-txt/v1/status, plus the llms-txt/v2 resource endpoints the workspace itself uses
  • Atomic file writes: temp file rename; no half-written files served to bots
  • ETag/304 caching: proper HTTP headers for CDN revalidation
  • Subdirectory / Bedrock support: correctly finds the site root on non-standard installs
  • Robots.txt reference: automatically adds a spec-compliant comment

Description Suggestions in detail

When pages lack descriptions, AI systems get less context. The suggestion engine fills the gap automatically:

  1. Schema markup (Rank Math, custom _schema_json)
  2. SEO plugin meta description
  3. WordPress excerpt
  4. Open Graph description (_og_description / og_description)
  5. First 160 characters of post content

Already-set descriptions are never touched. Pages that can’t be filled automatically are listed for manual review.

Description coverage

Curator shows how many published resources have a description and which still need one, and the generated file carries the same figures in its coverage report.

Every generated llms.txt ends with a short coverage report containing counts only:

Description coverage: 94%
Pages included: 48
Pages with descriptions: 45
Pages missing descriptions: 3

The list of pages that still need a description is never published in the file. You’ll find it in the admin, under Suggest Descriptions and Validate.

AI Crawler Analytics

Track 12 known bots: GPTBot, ChatGPT-User, ClaudeBot, PerplexityBot, Google-Extended, Applebot-Extended, Meta-ExternalAgent, Bytespider, CCBot, Cohere, DeepSeek, Amazonbot.

The 7-day analytics card shows a visual bar chart of recent activity. All-time totals are kept separately. IP addresses are anonymised before storage: last octet zeroed for IPv4, last 80 bits for IPv6. No data leaves your server.

Safety Mode

Before generation, the validator checks:

  • Pages missing or unpublished
  • Duplicate URLs across sections
  • Members-only pages (always left out)
  • Noindex pages (left out of both files by default)
  • Items whose content type is not ticked
  • Canonical mismatches
  • Password-protected pages (always left out)
  • Thin content (< 100 words, no meta, no excerpt)
  • File size > 50 KB
  • Too many pages (> 80)

When safety checks are on, errors stop the file being published and the results are shown immediately. Warnings are shown but don’t block. Everything is explained in plain English.

When to publish

  • Instant: about 30 seconds after any page is published or trashed (default)
  • Daily: once a day, via a WP-Cron recurring event
  • Weekly: once a week
  • Manual only: only when you click Publish

How to get started

  1. Install and activate. Curator finds your public pages and publishes them straight away.
  2. In Your llms.txt, arrange your sections and remove anything you do not want. Aim for the pages that best represent your site.
  3. In Review, decide on anything Curator flags, such as page-builder templates carried over from an earlier setup.
  4. Click Suggest descriptions from your pages, then accept or edit each suggestion.
  5. Click Publish, then Check what visitors receive to confirm the public file is current.
  6. Optional, in Settings: llms-full.txt, Markdown pages, and the AI crawler log.

WooCommerce integration

When WooCommerce is active, the plugin automatically includes SKU, price, and stock status in llms.txt descriptions, and full product details in llms-full.txt. Products with hidden” visibility are excluded, and you can optionally exclude out-of-stock products.

Developer hooks

  • llmscu_capability filter: override the required capability (default: manage_options)
  • llmscu_post_limit filter: scanner post limit per type (default: 500)
  • llmscu_full_word_limit filter: per-page word cap in llms-full.txt (default: unlimited)
  • llmscu_full_max_bytes filter: size ceiling for llms-full.txt in bytes (default: 5 MB, minimum 256 KB)
  • llmscu_max_sections / llmscu_max_entries filters: limits for saved or imported settings (defaults: 200 sections, 5,000 entries)
  • llmscu_is_restricted filter: mark a post as members-only so it is left out of both files (function ( bool $restricted, int $post_id ))
  • llmscu_backup_dir filter: where replaced files are backed up (default: uploads/llms-txt-curator-backups; point it outside the web root if your host allows)
  • llmscu_regenerated action: fires after each successful regeneration with the content string

Screenshots

Installation

  1. Upload the llms-txt-curator folder to /wp-content/plugins/.
  2. Activate through the ‘Plugins’ menu.
  3. Go to Settings -> LLMs.txt Curator to begin curating.

Or install directly from the WordPress plugin repository by searching for LLMs.txt Curator”.

FAQ

What is llms.txt?

llms.txt is a proposed standard (llmstxt.org) that provides AI systems with a curated, Markdown-formatted overview of a website’s most important content. A strategic selection of the pages you want AI to know about, not a sitemap.

What is llms-full.txt?

A widely used companion to llms.txt, rather than part of the llms.txt proposal itself. While llms.txt contains links and short descriptions, llms-full.txt contains the full Markdown content of each page. Optional: enable it in Settings when ready.

Do I need both files?

No. llms.txt alone is sufficient. llms-full.txt is useful if you want AI systems to have immediate access to your full content without additional crawling.

What does Description Suggestions do?

Scans every curated page and fills missing descriptions using a five-step fallback chain: schema markup -> SEO meta -> excerpt -> Open Graph -> page content. Pages with descriptions already set are never touched.

What is description coverage?

A percentage showing how many listed pages have descriptions. The admin shows which pages still need one. The bottom of your generated llms.txt carries the same figure as Description coverage”, with counts only and no page list.

What does Title Override do?

Lets you set a different title for a page in your llms.txt output without changing it on your site. Useful when your WordPress title includes your site name but you want AI to see a cleaner, more descriptive title.

What does Safety Mode do?

Runs validation before every generation. If errors are found, generation is blocked and results shown immediately. Prevents broken or malformed files going live.

Which SEO plugins are supported?

Rank Math, Yoast SEO, All in One SEO, SEOPress, and The SEO Framework.

Which AI bots does the crawler log detect?

GPTBot (OpenAI), ChatGPT-User, ClaudeBot (Anthropic), PerplexityBot, Google-Extended, Applebot-Extended, Meta-ExternalAgent, Bytespider (ByteDance), CCBot (Common Crawl), Cohere, DeepSeek, and Amazonbot.

What if my host blocks file writes?

The plugin has a rewrite rule fallback that serves both files via WordPress. Choose between Direct file”, Rewrite rule only”, or Both” (recommended) in Settings.

Does this work on multisite?

Yes. Activate network-wide from Network Admin > Plugins, or activate per-site on individual sub-sites.

Each site manages its own independent llms.txt; there is no shared network file. The Network Admin overview page (Network Admin > Settings > LLMs.txt Curator) shows every site’s generation status and lets you regenerate any site, or all sites at once, without leaving the network admin.

The main site writes a physical file. Sub-sites, on both subdirectory networks (example.com/site1) and subdomain networks (site1.example.com), share the main site’s document root, so they serve llms.txt via WordPress rewrite rule from the database instead. This is correct and functionally identical.

WP-CLI works per-site using the standard --url= flag: wp llms-txt regenerate --url=https://site1.example.com

Which pages are left out of the files?

Password-protected pages are always left out, and so are pages your membership plugin restricts. Both files are generated as a logged-out visitor, so members-only sections inside a public page are left out too. Pages your SEO plugin marks as noindex are left out while Leave out noindex pages” is ticked (the default). Items whose content type is not ticked under Content Types are left out too, and the validator lists each one so nothing disappears silently.

My SEO plugin also makes llms.txt. What happens?

Rank Math, Yoast SEO and All in One SEO can generate llms.txt too. This plugin never overwrites a physical llms.txt it did not create. If it finds one, the status panel says so and offers Replace existing file”, which writes and checks the new file first, then moves the old one to a protected backup folder in uploads (with a random file name). If anything fails part-way, the original is put back. Switch the llms.txt feature off in one of the two plugins so they do not compete.

Is any data sent externally?

No. Everything stays on your server. No telemetry, no external API calls, no cookies. Crawler IP addresses are anonymised before storage.

Reviews

Сентябрь 16, 2026 2 replies
Excellent plugin with a clean and practical approach to LLMs.txt generation. The plugin is well designed, easy to configure, and provides valuable features for improving AI discoverability. I also appreciate the ongoing development and attention to detail. Highly recommended!
Июль 8, 2026
I became aware of LLMS.txt via PageSpeed Insights/Agentic Browsing. There were quite a few plugins to choose, but LLMs.txt Curator was compatible with my version of Wordpress (7.0) and compatible with The SEO Framework. It passes most online validators including PageSpeed Insights Agentic Browsing. Nice plugin to get started with if you're new to llms.txt.
Read all 4 reviews

Contributors & Developers

“LLMs.txt Curator” is open source software. The following people have contributed to this plugin.

Contributors

Translate “LLMs.txt Curator” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

2.0.0

A rebuild of how Curator works, with the same published content on upgrade.

Your curation is carried over exactly. Your sections, pages, descriptions, title overrides and exclusions are migrated into the new model, and the file regenerates with the same content, in the same order, until you deliberately change something. Two lines do move: Curator’s own comment lines now sit below the heading rather than above it, so the file begins with the H1 the llms.txt proposal asks for.

  • New: the Curator workspace. Three places rather than a row of tabs, with site details, import and export, and settings alongside.
  • New: Review. Everything Curator knows about, with search, filters, bulk actions and an editorial state for each: kept by you, published automatically, or excluded by you.
  • New: Your llms.txt. Arrange sections and resources with the result shown beside you, in readable form or exact Markdown. Drag, or use Move up, Move down, Move to position and Move to section.
  • New: Why? Every resource can explain itself, separating what Curator observed from what you decided, and showing the exact line it contributes.
  • New: representation coverage and Everything accounted for. Curator states whether every resource it found has an explained outcome, and never claims completeness before discovery finishes.
  • New: unpublished changes. When your curation differs from the published file, Curator shows what changed, including previous and current wording, and publishes on request.
  • New: facts, custom URLs and site details, so a site can be represented properly even where a page does not exist for something.
  • New: primary resources. Mark up to ten resources as especially important for understanding your site.
  • New: suggested descriptions are labelled with the source they came from and stay marked as suggestions until you accept or edit them.
  • New: import and export, validated and previewed before anything is written.
  • New: discovery runs in batches and can be paused and resumed. It never reports a site as fully checked when it was interrupted.
  • Change: resources are stored in their own table rather than a single option, so large sites stay fast and every edit writes one row.
  • Change: minimum WordPress version is now 6.2, for the database identifier placeholder used by the new store.
  • New: the workspace shows what machines actually receive for each entry, including text Curator takes from the page when you have not written a description, and says where it came from.
  • New: Curator never reports a publication visitors are not getting. If an older llms.txt cannot be replaced, generation says so and nothing is marked as published; the file’s own date appears in the status panel.
  • New: page-builder templates that visitors cannot open, such as Elementor’s template library, are no longer published when found. Ones carried over from an earlier setup stay published, marked Kept from your earlier setup”, until you decide.
  • Change: Curator has three places: Your llms.txt (arrange your file and see what machines receive, side by side), Review (what needs a decision) and Settings. Nothing is hidden behind a menu.
  • Change: Settings lives inside Curator: publishing and content, site details, the file format check, the AI crawler log, and import and export. Old settings links open the matching section.
  • New: carried-over page-builder templates can be kept as a deliberate decision, recorded in Why?, so Curator stops asking. Excluding them remains one click away.
  • New: optional Markdown pages. When switched on under Settings, each page in your llms.txt is also available as Markdown at its address plus index.md (for example /about/index.md), following the llms.txt proposal. Off by default; excluded and non-public pages return not found.
  • Fix: in llms-full.txt and Markdown pages, text from page builders no longer keeps its HTML indentation, which Markdown readers treated as code blocks.
  • Fix: the Publish automatically when content changes” checkbox was saved but never used. It is gone; When to publish” is the one setting that decides.
  • New: Show the whole file, to read everything machines will receive before you publish.
  • Change: Generate” is now Publish. After publishing, Curator checks the public file itself and says plainly whether visitors get the new version, or whether a cache or an old file is serving an older copy.
  • Change: in Your llms.txt, each page’s actions are named in words under Options, including Remove from llms.txt, and section buttons say they act on the section.
  • Change: the older Preview & Validate and Import / Export tabs give way to Curator’s own, inside Settings.
  • New: Curator checks its own state before publishing. If it finds something it cannot account for, such as a missing resource table after a partial database restore, it refuses to generate, leaves the published file untouched, and shows a diagnostic code rather than publishing an empty file.
  • Fix: llms.txt and llms-full.txt now begin with the H1 naming your site, as the llms.txt proposal asks. Curator’s Generated by” and Last generated” comments used to sit above it, so the first thing in the file was a comment and validators reported the heading as missing. The comments are still there, directly below the heading. Reported by thomasblumer777.
  • Fix: every string in the admin JavaScript is now translatable, and nothing translates before init, so WordPress loads the language pack reliably. Reported by the Persian (fa_IR) translation editor: some interface text could not be translated at all.
  • Fix: sites already running 1.5.2 or later now migrate on update. The migration ran only on older installs, so an upgraded site kept reading its old configuration: the workspace appeared empty and editing was unavailable. Your published file was never affected.
  • Includes every fix from 1.5.3: generation as a logged-out visitor, membership-restricted pages left out of both files, access-controlled blocks removed from fallback descriptions, and the crawler log CSV export hardened against formula injection.

1.5.3

  • Security: both files are now generated as a logged-out visitor. Generation triggered by an administrator was rendering shortcodes and blocks with that administrator’s permissions, so a members-only section inside an otherwise public page could be written into llms-full.txt. The rule is now simple: nothing appears in either file that a logged-out visitor could not read at the public URL.
  • Security: pages restricted by a membership plugin (Paid Memberships Pro, MemberPress, Restrict Content Pro, WooCommerce Memberships) are left out of both files, even though they are published and have no password. The validator lists them, and the new llmscu_is_restricted filter covers any other plugin.
  • Security: the crawler log CSV export is now safe to open in a spreadsheet. A user-agent beginning with =, +, – or @ is prefixed so it cannot run as a formula.
  • Security: access-controlled blocks are removed from post content before it is used as a fallback description, so member-only text cannot appear in an llms.txt description.

1.5.2

  • Fix: SEO plugin template variables such as %seo_description% and %excerpt% (Rank Math), %%excerpt%% (Yoast, SEOPress) and #post_excerpt (All in One SEO) no longer appear in generated files. They are resolved through the SEO plugin where possible, otherwise the next description source is used. Descriptions saved by Suggest Descriptions that contained only a template are refilled on the next run. Thanks to Afshari for the report.
  • Fix: Content Types now controls what is published, not just the page search. Re-scan and first-time setup only scan ticked types, and items of an unticked type are left out of both files (the validator lists them). On upgrade, any type already used in your sections is ticked for you, so your files do not change. Thanks to jg100 for the report.
  • New: Leave out noindex pages” setting, on by default. Pages your SEO plugin marks as noindex are no longer published.
  • New: an existing llms.txt or llms-full.txt that this plugin did not create (hand-made, or from an SEO plugin’s own llms.txt feature) is never overwritten. The status panel says so and offers Replace existing file” (see below).
  • Fix: password-protected posts are no longer published in llms.txt or llms-full.txt, even if they were added to a section before being protected.
  • Fix: llms-full.txt generation no longer flushes a persistent object cache (Redis, Memcached). Only the in-memory runtime cache is cleared between pages.
  • Fix: the noindex” header setting is now honoured consistently. The X-Robots-Tag header is sent for llms.txt served by rewrite rule, and scheduled regeneration no longer re-adds noindex to .htaccess after it has been switched off.
  • Fix: Rewrite-only mode now removes a physical llms.txt or llms-full.txt left by an earlier mode, and a failed file write in Both mode removes the stale copy so the fresh version is served. Only files created by this plugin are ever deleted.
  • Fix: multisite sub-sites on subdirectory networks no longer write a physical llms.txt into the shared document root, where it could replace the main site’s file. They now serve via rewrite rule, as subdomain sub-sites already did.
  • Fix: uninstall now removes files written by 1.5.1 and later (it only recognised the older heading-style signature), and network sub-sites no longer touch the shared files on uninstall.
  • Fix: GET /wp-json/llms-txt/v1/pages now returns section names, page URLs and saved descriptions (previously empty).
  • Fix: URLs with query strings are now written correctly in llms.txt, llms-full.txt and the robots.txt reference. The & character was being HTML-encoded in these plain-text files.
  • New: Replace existing file” is transactional. The new file is written and checked before the original moves, and the original is restored if the swap fails. Backups get a random file name and a deny-all .htaccess.
  • New: one regeneration runs at a time, across Save, Regenerate, REST, WP-CLI, cron and publish hooks. A request that arrives mid-run is queued rather than dropped, and REST returns 409.
  • New: llms-full.txt has a size ceiling (default 5 MB, filter llmscu_full_max_bytes). Pages beyond it stay in llms.txt, the file says how many were left out, and the validator reports it.
  • New: limits on saved and imported settings (sections, entries and text lengths). The import size cap is raised from 256 KB to 2 MB to suit larger sites.
  • Privacy: the public coverage report no longer lists the URLs of pages missing descriptions, and Quality Score” in the file is now Description coverage”.
  • Hardening: llms-full.txt conversion keeps only http, https, mailto and tel links (javascript: and data: are dropped), resolves relative links, escapes link and alt text, strips comments and embedded SVG or iframes, and no longer empties a page if a pattern hits the PCRE limit.
  • Update: WooCommerce product details in llms.txt descriptions are now separated with ” | .
  • Update: admin and readme copy tidied, the only plugin” claims removed, and the translation template rebuilt in full.

1.5.1

  • Fix: generated llms.txt and llms-full.txt now contain exactly one H1 (the site name), per the llms.txt spec. The attribution and last generated” lines are now HTML comments instead of Markdown H1 headings, and the Coverage Report footer is now an H2. This clears the more than one H1 title” warning reported by third-party llms.txt validators.
  • Compat: files written by earlier versions are still recognised as plugin-owned after upgrade. Ownership detection now matches the invariant signature text in both the new comment form and the legacy heading form. The corrected file is written on the next regeneration (save settings, click Regenerate, or wait for the scheduled run).

1.5.0

  • New: Content Signals (contentsignals.org): declare ai-train / search / ai-input preferences in your robots.txt, separating you may read me” from you may train on me”. Opt-in, so an existing install never has a stance set silently; when enabled, all three default to yes.
  • New: Link: rel=”describedby” response header, pointing agents at your llms.txt before they parse HTML (RFC 8288 registered rel). Default on, front-end only, respects subdirectory installs.
  • Update: repositioned around Google’s June 2026 guidance, clarifying that Google Search ignores llms.txt (no ranking help or harm) and that the file’s value is on-site agent navigation, the surfaces that read it (Perplexity, coding agents), and Chrome’s Agentic Browsing audit.
  • Update: AI Crawler Analytics surfaced as the primary value.
  • Compat: Tested up to WordPress 7.0. Minimum PHP remains 7.4.

1.4.6

  • Maintenance: explicit PHPCS ignore annotations for JSON blob input lines. Tested up to WordPress 6.9. No functional changes.

1.4.5

  • Fix: sanitize_all_settings() now validates that sections, post_types, descriptions, and title_overrides are arrays before passing them to helper functions or array_map(). Previously used ?? array() fallbacks which guard against null but not wrong types from malformed JSON, risking a TypeError on PHP 8+.
  • Fix: sanitize_sections() now validates pages is an array before iterating it.
  • Fix: sanitize_descriptions() and sanitize_title_overrides() now skip non-string values.
  • Fix: post_types output wrapped in array_values( array_filter() ) to strip any empty keys produced by sanitize_key().

1.4.4

  • Fix: ajax_preview() now passes POST data through sanitize_all_settings() before use, consistent with ajax_save_settings(). Previously used wp_parse_args() without sanitization.

1.4.0

  • New: 30-day AI crawler activity chart: a stacked bar chart showing daily visits per bot, auto-compressed to weekly buckets for readability.
  • New: Last AI crawler visit” banner at the top of the Crawler tab, showing a live X minutes/hours/days ago” timestamp at a glance.
  • New: First Seen / Last Seen columns in the all-time bot summary table.
  • New: Export CSV button: downloads the full crawler log as a CSV file for use in client reports.
  • New: Daily aggregate storage (90-day rolling window): daily visit counts are now stored separately from the raw log, enabling the timeline chart without scanning every log entry.
  • New: REST API endpoint GET /wp-json/llms-txt/v1/crawler-stats: returns all-time, 7-day, 30-day, daily, and per-bot first/last seen data.
  • New: REST API endpoint GET /wp-json/llms-txt/v1/pages: returns all curated sections and pages as JSON, useful for external dashboards.
  • Improvement: All-time bot table now includes Last 7 Days column alongside All-Time for quick comparison.

1.3.5

  • Fix: All PHP declarations, stored data keys, and WordPress registrations updated to use the distinct llmscu_ / LLMSCU_ prefix throughout, replacing the generic llms_txt_ / LLMS_Txt_ prefix. No data migration required; existing stored options are unaffected.
  • Fix: Readme comparative claims removed per WordPress plugin guidelines.

1.3.3

  • Fix: Reverted v1.3.2 RewriteRule approach which caused llms.txt 404 on some hosts. Replaced with a safe + mod_headers .htaccess block that sets Content-Type charset and X-Robots-Tag without touching WordPress rewrite rules.

1.3.2

  • Fix: UTF-8 encoding bug causing em dashes and other multibyte characters to render as — in browsers and AI crawlers. Physical llms.txt file is now always routed through WordPress via .htaccess rules so the correct Content-Type: text/plain; charset=utf-8 header is always sent.
  • New: X-Robots-Tag: noindex header option, preventing Google indexing llms.txt as a page in search results. Enabled by default; toggle in Settings tab under Search Indexing.

1.3.1

  • Security: X-Content-Type-Options: nosniff header added when serving llms.txt and llms-full.txt.
  • Security: Import JSON payload capped at 256 KB and rejected before decode with a plain-English error.
  • Security: Import schema sanity check: requires at least 2 expected top-level keys before accepting a configuration file.
  • Robustness: 2 MB file size guard before file_get_contents(), falling through to DB option if the physical file exceeds the cap.
  • Performance: no_found_rows, update_post_meta_cache => false, update_post_term_cache => false added to all get_posts() queries.
  • New: Site Diagnostics panel on the Preview & Validate tab, showing computed root, writable status, delivery mode, file/DB state, rewrite health, last live test result, and environment versions.
  • New: Last verified” status bar row, persisted after every live test so it survives page reloads.
  • New: Reachability health banner, shown above tabs when the last live test failed; includes one-click Fix: Flush Rewrite Rules” button that reruns the test automatically.
  • Fix: Multisite uninstall loop changed from a fixed 500-site cap to a paginated do/while loop (100 per page), handling networks of any size.
  • Fix: @package docblock corrected from LLMS_Txt_Manager to LLMS_Txt_Curator across all PHP files.
  • Fix: load_plugin_textdomain() added, so the plugin is translation-ready.

1.3.0

  • New: Multisite support (Chunks A to E, complete). Plugin header Network: true, network activation, per-site isolation, file path safety, network admin overview, and cron verification all done.
  • New: Network Admin overview page (Network Admin > Settings > LLMs.txt Curator) with summary strip, per-site status table, per-site Regenerate button, and Regenerate All Sites bulk action. Table updates live via AJAX without a page reload.
  • New: File mode column in network table: Physical” (subdirectory) or Rewrite” (subdomain/domain-mapped) with tooltip.
  • New: Regen schedule shown per-site in the network table.
  • New: Network Settings action link in the Network Admin plugins list.
  • New: llms_txt_is_network_activated() helper function.
  • New: llms_txt_file_write_safe() helper, preventing subdomain sub-sites from overwriting the main site’s physical llms.txt. Those sites serve via rewrite rule instead.
  • New: next_regen key in get_file_status(): formatted next scheduled regeneration time (daily/weekly/instant debounce) for the current site.
  • Improvement: maybe_schedule_recurring_regen() now returns early on is_network_admin(), preventing the main site’s cron schedule being unnecessarily re-synced on every network admin page load.
  • Improvement: All four cron methods updated with explicit multisite docblocks confirming per-site safety.
  • Improvement: WP-CLI handler docblock updated with --url= guidance for per-site usage on multisite networks.
  • Improvement: delete_file() in the generator guarded against subdomain sub-sites deleting a shared file.
  • Improvement: Activation hook accepts $network_wide; deactivation clears cron events across all sites.
  • Improvement: Uninstall iterates all sites; cleans up options, transients, cron, and files per-site.
  • Improvement: LLMS_Txt_Admin guarded from instantiating in network admin context.
  • Improvement: get_file_status() returns is_network_activated, is_subdomain_network, file_write_safe, network_overview_url, and next_regen.
  • Improvement: Validator surfaces info message on subdomain sub-sites confirming rewrite serving is intentional.
  • Improvement: Admin status panel and multisite notice contextually correct per site type.
  • Confirmed (docblocked): WP-Cron, option storage, transients, nonces, and capability checks are all natively per-site in multisite. No switch_to_blog() wrapping required in any cron path.
  • Removed: wp_die() block that previously blocked activation on non-main sites.

1.2.2

  • New: AI Crawler Analytics 7-day bot activity bar chart on the Crawler Log tab, showing visit counts per bot. Refreshes without a page reload.
  • Improvement: Crawler Log tab restructured analytics card at top, all-time summary below, full visit log at the bottom.
  • Update: readme.txt updated to reflect all features added in v1.2.x.
  • Update: Stable tag updated to 1.2.2.

1.2.1

  • New: Scheduled Regeneration choose between Instant, Daily, Weekly, or Manual update modes. Daily/Weekly use proper WP-Cron recurring events with next-run time displayed in the UI.
  • New: Safety Mode toggle to block generation on validation errors, with an on-demand validation card showing errors, warnings, and a plain-English stats summary.

1.2.0

  • New: Description Suggestions one-click fills missing descriptions using a five-step fallback chain. Never overwrites manually-set descriptions.
  • New: Quality Score footer every generated file includes a Coverage Report showing quality score %, pages with descriptions, and pages needing attention.
  • New: Change Detection admin banner alerts when curated pages have been updated since last generation, with direct Regenerate Now action.
  • New: Per-page Title Override set an AI-optimised title for any page without touching on-site SEO.
  • Improvement: OpenGraph description added as step 4 in the description fallback chain.

1.1.0

  • New: llms-full.txt generation full Markdown content for each curated page, per the llmstxt.org spec.
  • New: AI crawler detection logs visits from 12 known AI bots with anonymised IPs.
  • New: WooCommerce integration product data (SKU, price, stock, categories, dimensions) automatically included.
  • New: AI Crawler Log tab with summary stats and detailed visit log.
  • New: WP-CLI commands: status, crawler-log, crawler-clear.
  • New: REST API status endpoint.
  • New: robots.txt reference and rewrite rule for llms-full.txt.

1.0.4

  • Initial public release. Drag-and-drop curation, validation engine, SEO plugin integration, schema-aware descriptions, pre-built templates, auto-regeneration, live preview, import/export, WP-CLI, REST API, atomic file writes, ETag caching.