PlugPress

How Waggle Makes Your Site AI-Readable: llms.txt and Markdown Pages

Machine files are plain-text versions of your site written for software rather than browsers. Waggle publishes three kinds: /llms.txt, a map of your content; a Markdown version of every page at its URL plus .md; and an optional /pricing.md for agents comparing products. All of it is served from your own site in PHP — no CDN, no edge service, no third party.

They all live on one screen: AI → Machine files, as four cards — AI-readable Markdown, Site summary for AI (that’s llms.txt), Complete site index for AI (llms-full.txt) and Your pricing, in AI’s words (pricing.md). That screen is the single owner of the machine channel, which is why you won’t find Markdown toggles scattered through the SEO settings.

Waggle's Machine files screen showing the AI-readable Markdown, site summary, complete site index and pricing cards

What is llms.txt and should I use it?

/llms.txt is a plain-text index of your site — a title, a short description, and a list of your important pages with links. /llms-full.txt is the same format with the page cap removed, so it lists everything.

Here’s the honest position: llms.txt is discoverability hygiene, not a proven ranking or citation driver. No major AI company has committed to consuming it. Google’s John Mueller compared it to the long-dead keywords meta tag — “this is what a site-owner claims their site is about” — and added the part you can check yourself:

AFAIK none of the AI services have said they’re using LLMs.TXT (and you can tell when you look at your server logs that they don’t even check for it).

You can verify that claim against your own data: AI → Visibility shows your most crawled URLs, and on most sites llms.txt does not appear in them at all.

Waggle publishes it anyway because it costs nothing, it is trivially useful to any agent you point at it directly, and if the convention does get adopted you’re already there.

What it should never be sold as is a traffic channel. If a tool tells you llms.txt will get you cited, be sceptical.

What are the .md versions of my pages?

Append .md to any page URL and you get clean Markdown — the same content with the navigation, sidebars, scripts and styling stripped out:

curl -s https://example.com/about.md | head -5

You’ll see YAML front matter with the title, canonical URL and publish date, then the body as Markdown. The same content is also served at the normal URL if a client requests it with Accept: text/markdown.

This is genuinely useful for agents that fetch one page and want its text without parsing HTML chrome. It is not how bulk crawlers find you — they follow your sitemap, which lists your normal HTML URLs by design. For the full explanation of which discovery signals exist and why crawlers don’t use them, see how AI bots find your Markdown pages.

How do I stop a page publishing a .md version?

There are three levels of control, from broadest to narrowest. They stack — any one of them switching off is enough to stop the .md.

1. Site-wide

AI → Machine files has the master switch for AI-readable Markdown. Off means no page on the site publishes a .md version.

2. Per post type

The same screen has per-type toggles. You might publish Markdown for posts and pages but not for a private custom post type. Types you’ve set to noindex render disabled here, since hiding something from search engines and publishing a machine copy of it are contradictory.

3. Per page — one at a time, or in bulk

In the editor: open the Waggle panel, expand Indexing, and switch on Hide the Markdown version. See the Waggle panel in the editor.

In bulk, from the posts list: this is usually what you want. The posts and pages list has a Markdown column showing each item’s state, and two bulk actions — Hide Markdown version and Publish Markdown version. Select any number of items, choose the action, apply. It’s the fastest way to exclude a batch without opening each post.

The Pages list with Waggle's Markdown column, showing a .md link for a published page and a dash for a draft

The Markdown column tells you three different things:

  • .md — a live link to the published Markdown version.
  • Hidden — you’ve excluded it.
  • — the post’s own state prevents it. Drafts and password-protected posts never publish Markdown; hover for the reason.

That distinction matters: “Hidden” is your decision, “—” isn’t, and confusing the two sends you hunting for a setting that isn’t the cause.

What happens immediately after hiding a page?

Its .md URL starts returning 404, the Accept: text/markdown negotiation stops serving Markdown at the normal URL, the <link rel="alternate"> tag disappears from the HTML, and llms.txt regenerates.

One thing that surprises people: the page does not leave llms.txt. It stays listed, but its link changes from the .md URL to the normal page URL. That’s deliberate — the page is still part of your content map, it just no longer offers a Markdown variant.

What is pricing.md for?

/pricing.md is an opt-in, hand-written Markdown file describing your pricing, aimed at agents comparing products on a buyer’s behalf. Unlike your pricing page it has no JavaScript, no layout and no login wall, so it’s trivially parseable.

It is off by default and serves only when it has content. On AI → Machine files, switch on Your pricing, in AI’s words, write the content in the Your plans and prices box, and save. Until both are true, the URL returns 404.

Keep it short and factual — plan names, prices, what’s included, currency. It’s a data sheet, not a landing page.

Why is a file on my server overriding Waggle’s version?

If a physical llms.txt or sitemap.xml exists in your web root, your web server hands that file to visitors before WordPress ever runs. Waggle’s dynamic version never gets a chance, and the file stays frozen at whatever it said the day it was created.

Waggle detects this and warns you on the Machine files screen. You can confirm it yourself from the response headers:

curl -sI https://example.com/llms.txt | grep -i "content-type|last-modified"

Waggle’s dynamic route sends text/plain; charset=UTF-8 and no fixed last-modified. A static file sends text/plain with no charset, plus a last-modified date and an ETag. The fix is to delete the file over FTP or SSH — no plugin setting can override it. Full detail in troubleshooting machine files.

FAQ

Will Markdown versions hurt my SEO with duplicate content?

No. Every .md response sends X-Robots-Tag: noindex and a canonical Link header pointing at the HTML page, and .md URLs are deliberately kept out of your XML sitemap. If you’re seeing .md pages indexed, you’re on a version before that fix — see Google is indexing your .md pages.

Why does /blog.md exist when my blog isn’t a page?

Any published item of an enabled post type gets a .md variant, including ones you may not think of as pages. Use the per-page toggle or the bulk action to exclude it.

Do AI crawlers actually read the .md versions?

Mostly not, and Waggle’s own bot log will show you the share. Crawlers follow sitemaps and send ordinary Accept headers. The Markdown channel is for agents you point at a URL directly and for MCP clients — see how AI bots find your Markdown pages.

Does hiding Markdown affect search engines?

Not at all. The .md variant is already noindex, so removing it changes nothing about how your HTML page is indexed or ranked.

Can an agent fetch a page’s Markdown directly?

Yes — waggle/get-page-markdown returns it through the WordPress Abilities API, and it respects the same opt-outs described above.

Key sources