Title: RowanWeb Markdown for AI – .md Pages &amp; llms.txt
Author: Ryabinin Vitalii
Published: <strong>September 26, 2026</strong>
Last modified: September 27, 2026

---

Search plugins

![](https://ps.w.org/rowanweb-markdown-for-ai/assets/banner-772x250.png?rev=3714192)

![](https://ps.w.org/rowanweb-markdown-for-ai/assets/icon.svg?rev=3714192)

# RowanWeb Markdown for AI – .md Pages & llms.txt

 By [Ryabinin Vitalii](https://profiles.wordpress.org/ryabininvitaliy/)

[Download](https://downloads.wordpress.org/plugin/rowanweb-markdown-for-ai.1.2.0.zip)

 * [Details](https://wordpress.org/plugins/rowanweb-markdown-for-ai/#description)
 * [Reviews](https://wordpress.org/plugins/rowanweb-markdown-for-ai/#reviews)
 *  [Installation](https://wordpress.org/plugins/rowanweb-markdown-for-ai/#installation)
 * [Development](https://wordpress.org/plugins/rowanweb-markdown-for-ai/#developers)

 [Support](https://wordpress.org/support/plugin/rowanweb-markdown-for-ai/)

## Description

AI assistants and RAG systems increasingly fetch site content directly, but they
have to work through your theme’s HTML markup to do it — extra tokens, extra noise,
and a real chance of misreading the actual content. This plugin gives them a clean
alternative:

 * **`{permalink}.md`** — a markdown version of every public page, generated from
   the same rendered content your visitors see (post_content, blocks, shortcodes)
   and converted with a real HTMLMarkdown parser, not a regex stripper. Headings,
   tables, links and images keep their structure.
 * **`/llms.txt`** — a dynamic index of public pages grouped by content type, with
   a short description for each. Every entry links both to the normal HTML page (
   so an AI citing your site points at a page a human can actually read) and to 
   its `.md` version (for efficient re-fetching).
 * **`/llms-full.txt`** _(optional, generated on demand)_ — a single file with the
   full markdown content of your most recent posts per content type, for tools that
   want more than the short index. Generated with one click on the Diagnostics tab;
   after content changes, an admin notice reminds you to regenerate it.
 * **Deep custom-field support** — if Advanced Custom Fields is active, the plugin
   automatically finds and renders every ACF field used on a page (any type, any
   nesting — repeaters, flexible content, groups) without any per-site configuration.
 * **Privacy-safe by default** — password-protected posts, drafts, and anything 
   flagged noindex by your SEO plugin are never served as markdown. Per-post exclusion
   is also available from the editor sidebar.
 * **Plays well with other SEO plugins** — if Yoast SEO or Rank Math already generates
   its own `llms.txt`, this plugin automatically steps aside instead of racing for
   the same URL.
 * **Pre-warmed, not lazy** — markdown is rebuilt the moment you save a post, so
   the first crawler to arrive never waits on a cold cache. A bulk warm-up button
   covers existing content after activation.
 * **Bot activity log** — see which AI crawlers actually visit your `.md`/`llms.
   txt` URLs, how often, and which exact pages, right in the Activity tab.
 * **Multilingual-aware (Polylang)** — on a multilingual site, `llms.txt` and `llms-
   full.txt` split into one section per language instead of mixing everything into
   a single list under one heading; custom-field labels are automatically translated
   to match each page’s own language.

#### A note on scope

This plugin is entirely about AI/LLM crawlers — it does not touch your normal SEO(
Google, Bing, etc.), which your existing SEO plugin continues to handle exactly 
as before.

### Pro version

RowanWeb Markdown for AI Pro is a separate, paid version. Everything described above
works fully in this free plugin; Pro adds extra tools for busier sites:

 * **Cloudflare cache purge** — extends your existing Cloudflare plugin’s cache 
   purge (or purges directly via your own API token if none is active) to also cover`.
   md` pages, `llms.txt`, and `llms-full.txt` whenever a post is saved.
 * **Automatic llms-full.txt regeneration** — the file rebuilds itself in the background
   shortly after relevant content is saved (bulk edits collapse into a single rebuild),
   so it never needs a manual click.
 * **Weekly AI-crawler list updates** — picks up newly launched AI crawlers from
   ai.robots.txt every week instead of waiting for the next plugin release. A plain
   download of a public file (no site data is sent), and it can be switched off.
 * **Configurable llms-full.txt size** — raise the default of 50 most-recent items
   per content type, or remove the limit entirely.
 * **Configurable hit-log retention + CSV export** — choose your own retention window(
   the default is 90 days) and export the log as CSV.
 * **Rate limiting** — throttle a recognized bot making too many `.md`/`llms.txt`
   requests per minute from one IP.
 * **Suspicious-activity detection** — flags requests probing for credentials or
   cloud metadata under a spoofed AI-bot User-Agent, listed separately from genuine
   crawler traffic.
 * **Extra Activity reports** — filter “Recent hits” by URL, plus “Hits per day”
   and “Top pages” (most-requested URLs with a per-bot breakdown).

### External services

This plugin connects to the following third-party services. Nothing else is sent
anywhere.

#### DeepL API (optional custom-field label translation)

If Advanced Custom Fields is active and you enter your own DeepL API key in Settings,
the plugin uses the DeepL API (`api-free.deepl.com` or `api.deepl.com`, depending
on your key) to translate custom-field labels (for example “Price” or “Specifications”)
into your site’s language, for the section headings in `.md` and `llms-full.txt`
output.

 * When: only after you add a DeepL API key — when you click “Translate field labels”
   on the Actions tab, or while a post is being saved / the cache is warmed / `llms-
   full.txt` is generated and a label hasn’t been translated yet. Never during a
   visitor’s or crawler’s request.
 * What is sent: the field label texts, the target language (and the source language,
   if you set one), and your API key. Post content is never sent. Translations are
   cached, so each label is sent only once.
 * Without an API key, nothing is ever sent to DeepL.
 * DeepL [Terms and Conditions](https://www.deepl.com/pro-license) and [Privacy Policy](https://www.deepl.com/privacy).

#### Freemius (optional opt-in, licensing and updates of the Pro version)

The plugin includes the Freemius SDK, which handles the separate Pro version’s licensing
and updates. In this free version, Freemius only shows an optional opt-in screen
after activation.

 * When: only if you choose to opt in (or activate a Pro license).
 * What is sent: your site URL, WordPress and PHP versions, plugin version, site
   language, and the admin’s name and email address, plus plugin activation/deactivation/
   uninstall events. If you skip the opt-in, nothing is sent.
 * Freemius [Terms of Service](https://freemius.com/terms/), [Privacy Policy](https://freemius.com/privacy/)
   and [details on what is collected](https://freemius.com/wordpress/usage-tracking/).

### Support

Questions, bug reports or feature requests: the plugin’s support forum on WordPress.
org, or https://rowan-web.ru/

## Screenshots

[⌊Diagnostics tab: llms.txt status, which SEO plugin (if any) is already handling
it, and system info.⌉⌊Diagnostics tab: llms.txt status, which SEO plugin (if any)
is already handling it, and system info.⌉[

Diagnostics tab: llms.txt status, which SEO plugin (if any) is already handling 
it, and system info.

[⌊Activity tab: bot hit stats and the most recent requests, filterable by bot.⌉⌊
Activity tab: bot hit stats and the most recent requests, filterable by bot.⌉[

Activity tab: bot hit stats and the most recent requests, filterable by bot.

[⌊Actions tab: label translation, cache warm-up, and llms-full.txt generation.⌉⌊
Actions tab: label translation, cache warm-up, and llms-full.txt generation.⌉[

Actions tab: label translation, cache warm-up, and llms-full.txt generation.

[⌊Settings tab: choosing which content types are included and other one-time setup.⌉⌊
Settings tab: choosing which content types are included and other one-time setup
.⌉[

Settings tab: choosing which content types are included and other one-time setup.

## Installation

 1. Upload the `rowanweb-markdown-for-ai` folder to `/wp-content/plugins/`, or install
    the ZIP via Plugins  Add New  Upload.
 2. Activate the plugin.
 3. Go to **Settings  RowanWeb Markdown for AI** and pick which content types should
    be included (posts, pages, and any custom post types you use).
 4. That’s it — `{any public URL}.md` and `/llms.txt` are live immediately.

## FAQ

### How do I check that the markdown version works?

Open any page on your site and add `.md` to the end of the address (remove a trailing
slash first, if there is one) — you should get plain markdown text instead of the
normal page.

### Does it work with Advanced Custom Fields (ACF)?

Yes, with no setup. If ACF (free or Pro) is active, every field used on a page is
added to its `.md` version and to `llms-full.txt` automatically, under its own heading.
Supported field types include text, textarea, WYSIWYG, number, email, URL, link,
select, checkbox, radio, true/false, image, gallery, post object, relationship, 
table, and nested group, repeater and flexible content fields. Field labels can 
optionally be translated into your site’s language with your own DeepL API key (
see “External services”). If the automatic output misses something on a particular
page, you can replace that page’s markdown by hand in the post editor.

### Why doesn’t /llms.txt open, or it shows content I didn’t expect?

If your SEO plugin (Yoast SEO or Rank Math) already has its own `llms.txt` generation
enabled, this plugin intentionally stays silent to avoid a conflict — the Diagnostics
tab shows which plugin is currently serving it.

### Where does the list of known AI crawlers come from?

It’s a snapshot of the community-maintained [ai.robots.txt](https://github.com/ai-robots-txt/ai.robots.txt)
catalog (MIT License), bundled with the plugin and refreshed with each plugin release.
Nothing is downloaded at runtime.

### Does this affect my normal search engine SEO?

No. Google, Bing, and other conventional search engines are untouched — this plugin
only adds AI/LLM-specific endpoints alongside your existing setup.

### Does the plugin send any of my content anywhere?

No. Page content is only ever served in response to a normal HTTP request, exactly
like any other page on your site. The plugin makes no outgoing connections on its
own. The only exceptions are listed under “External services” below, and both are
off until you turn them on: the DeepL translation of custom-field labels (only if
you add your own DeepL API key) and the Freemius opt-in.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“RowanWeb Markdown for AI – .md Pages & llms.txt” is open source software. The following
people have contributed to this plugin.

Contributors

 *   [ Ryabinin Vitalii ](https://profiles.wordpress.org/ryabininvitaliy/)
 *   [ Freemius ](https://profiles.wordpress.org/freemius/)

[Translate “RowanWeb Markdown for AI – .md Pages & llms.txt” into your language.](https://translate.wordpress.org/projects/wp-plugins/rowanweb-markdown-for-ai)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/rowanweb-markdown-for-ai/),
check out the [SVN repository](https://plugins.svn.wordpress.org/rowanweb-markdown-for-ai/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/rowanweb-markdown-for-ai/)
by [RSS](https://plugins.trac.wordpress.org/log/rowanweb-markdown-for-ai/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.2.0

 * `llms-full.txt` is now stored in the uploads folder (`wp-content/uploads/rowanweb-
   markdown-for-ai/`) instead of the site root, and served at `/llms-full.txt` through
   WordPress. Requests to it now show up in the Activity tab.
 * The list of known AI crawlers is now bundled with the plugin; the free version
   no longer downloads it from GitHub.
 * Detection of a physical `llms.txt` left by another plugin now also works when
   WordPress is installed in a subdirectory.

#### 1.1.2

 * Automatic background regeneration of `llms-full.txt` is now part of Pro. The 
   free plugin generates it with the button on the Diagnostics tab and shows a reminder
   notice when content has changed since the last generation.
 * Pro: the “llms-full.txt may be out of date” notice no longer appears, since the
   file is regenerated automatically.

#### 1.1.1

 * Renamed to “RowanWeb Markdown for AI” (new slug: `rowanweb-markdown-for-ai`).
 * Settings-page CSS and JavaScript are now proper enqueued files instead of inline
   blocks.
 * Stricter sanitization of request headers stored in the bot activity log.
 * The readme now documents every external service the plugin connects to.

#### 1.0.5

 * Activating the plugin now redirects straight to its Settings page (skipped for
   bulk/network activation and WP-CLI, so it never hijacks an unrelated screen).
 * Added the missing Russian translation for the 1.0.4 “View as Markdown” badge 
   toggle strings.

#### 1.0.4

 * Added a Settings toggle to hide the floating “View as Markdown” badge for site
   visitors. AI/search crawlers are unaffected either way — they discover the `.
   md` version through the page’s `<link rel="alternate">` tag and robots.txt, not
   through this badge.

#### 1.0.3

 * Fixed the two scoped `X-Robots-Tag` headers on `.md` pages overwriting each other(
   PHP’s `header()` replaces a same-named header by default) — only the `bingbot`
   rule was ever actually being sent. Both now use `$replace = false` so Google 
   and Bing each get their own rule.

#### 1.0.2

 * The `.md` `X-Robots-Tag` header is now scoped to `googlebot:`/`bingbot:` instead
   of a bare `noindex`, so Google/Bing search still drop the page while AI crawlers
   that build their own retrieval index (OAI-SearchBot, PerplexityBot, and similar)
   see no restriction.

#### 1.0.1

 * `.md` pages now send `X-Robots-Tag: noindex, follow` and a canonical `Link` header
   pointing at the original HTML page, so the markdown twin doesn’t end up duplicated
   in Google/Bing’s search index while staying fully fetchable by AI crawlers.

#### 1.0.0

 * Initial public release: `.md` markdown pages, dynamic `llms.txt`, an optional
   full-content `llms-full.txt` dump, deep ACF field rendering, privacy controls,
   bot activity logging, multilingual (Polylang) support, and a Pro tier (Cloudflare
   cache purge, higher llms-full.txt limits, configurable hit-log retention with
   CSV export, rate limiting, suspicious-activity detection, and deeper Activity-
   tab reporting).

## Meta

 *  Version **1.2.0**
 *  Last updated **3 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.4 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 8.0 or higher **
 * Tags
 * [AI Crawlers](https://wordpress.org/plugins/tags/ai-crawlers/)[ai seo](https://wordpress.org/plugins/tags/ai-seo/)
   [geo](https://wordpress.org/plugins/tags/geo/)[llms.txt](https://wordpress.org/plugins/tags/llms-txt/)
   [markdown](https://wordpress.org/plugins/tags/markdown/)
 *  [Advanced View](https://wordpress.org/plugins/rowanweb-markdown-for-ai/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/rowanweb-markdown-for-ai/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/rowanweb-markdown-for-ai/reviews/)

## Contributors

 *   [ Ryabinin Vitalii ](https://profiles.wordpress.org/ryabininvitaliy/)
 *   [ Freemius ](https://profiles.wordpress.org/freemius/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/rowanweb-markdown-for-ai/)