[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fLXeguYOU5RFEJiEoaOvA6Unn9RfhdPLsvNR0YanKKxE":3},{"slug":4,"display_name":4,"profile_url":5,"plugin_count":6,"total_installs":7,"avg_security_score":8,"avg_patch_time_days":9,"trust_score":10,"computed_at":11,"plugins":12},"gregrandall","https:\u002F\u002Fprofiles.wordpress.org\u002Fgregrandall\u002F",1,0,100,30,94,"2026-05-20T09:02:52.174Z",[13],{"slug":14,"name":15,"version":16,"author":4,"author_profile":5,"description":17,"short_description":18,"active_installs":7,"downloaded":19,"rating":7,"num_ratings":7,"last_updated":20,"tested_up_to":21,"requires_at_least":22,"requires_php":23,"tags":24,"homepage":30,"download_link":31,"security_score":8,"vuln_count":7,"unpatched_count":7,"last_vuln_date":32,"fetched_at":33},"botkibble","Botkibble","1.3.0","\u003Cp>AI agents, LLMs, and crawlers have to wade through navigation bars, sidebars, ads, and comment forms to reach the content they want, and every element costs tokens. \u003Ca href=\"https:\u002F\u002Fblog.cloudflare.com\u002Fmarkdown-for-agents\u002F\" rel=\"nofollow ugc\">Cloudflare measured\u003C\u002Fa> an 80% reduction in token usage when converting a blog post from HTML to Markdown (16,180 tokens down to 3,150).\u003C\u002Fp>\n\u003Cp>Botkibble adds a Markdown endpoint to every published post and page.\u003C\u002Fp>\n\u003Cp>Cloudflare offers \u003Ca href=\"https:\u002F\u002Fdevelopers.cloudflare.com\u002Ffundamentals\u002Freference\u002Fmarkdown-for-agents\u002F\" rel=\"nofollow ugc\">Markdown for Agents\u003C\u002Fa> at the CDN edge on Pro, Business, and Enterprise plans. Botkibble does the same thing (for free) at the origin, so it works on any host.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fgreg-randall\u002Fbotkibble\" rel=\"nofollow ugc\">GitHub Repository\u003C\u002Fa>\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Three ways to request Markdown:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>\u003Ccode>.md\u003C\u002Fcode> suffix\u003C\u002Fstrong>: append \u003Ccode>.md\u003C\u002Fcode> to any post or page URL (e.g. \u003Ccode>example.com\u002Fmy-post.md\u003C\u002Fcode>)\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Query parameter\u003C\u002Fstrong>: add \u003Ccode>?format=markdown\u003C\u002Fcode> to any post or page URL\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Content negotiation\u003C\u002Fstrong>: send \u003Ccode>Accept: text\u002Fmarkdown\u003C\u002Fcode> in the request header\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>What’s in every response:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Structured metadata header with title, date, categories, tags, word count, character count, and estimated token count (in YAML frontmatter format, readable by any AI agent)\u003C\u002Fli>\n\u003Cli>Clean Markdown converted from fully-rendered post HTML (shortcodes run, filters applied)\u003C\u002Fli>\n\u003Cli>\u003Ccode>Content-Type: text\u002Fmarkdown\u003C\u002Fcode> and \u003Ccode>Vary: Accept\u003C\u002Fcode> response headers\u003C\u002Fli>\n\u003Cli>\u003Ccode>Content-Signal\u003C\u002Fcode> header for AI signal declaration — defaults to \u003Ccode>ai-train=no, search=yes, ai-input=yes\u003C\u002Fcode> — see \u003Ca href=\"https:\u002F\u002Fcontentsignals.org\u002F\" rel=\"nofollow ugc\">contentsignals.org\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ccode>X-Markdown-Tokens\u003C\u002Fcode> header with estimated token count\u003C\u002Fli>\n\u003Cli>Discovery via \u003Ccode>\u003Clink rel=\"alternate\">\u003C\u002Fcode> in the HTML head and \u003Ccode>Link\u003C\u002Fcode> HTTP header\u003C\u002Fli>\n\u003Cli>Automatic cache invalidation when a post is updated or deleted\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Performance:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Botkibble writes Markdown to disk on the first request, then serves it as a static file. A built-in Fast-Path serves cached files during WordPress’s \u003Ccode>init\u003C\u002Fcode> hook, before the main database query runs. No extra configuration needed.\u003C\u002Fp>\n\u003Cp>Add a web server rewrite rule and Botkibble bypasses PHP entirely, serving \u003Ccode>.md\u003C\u002Fcode> files the same way a server would serve an image or CSS file:\u003C\u002Fp>\n\u003Cp>  Method\u003Cbr \u002F>\n  Avg. response time\u003C\u002Fp>\n\u003Cp>  Standard HTML\u003Cbr \u002F>\n  0.97s\u003C\u002Fp>\n\u003Cp>  Markdown (cold, first request)\u003Cbr \u002F>\n  0.95s\u003C\u002Fp>\n\u003Cp>  Markdown (cached, PHP Fast-Path)\u003Cbr \u002F>\n  0.87s\u003C\u002Fp>\n\u003Cp>  Markdown (Nginx\u002FApache direct)\u003Cbr \u002F>\n  0.11s\u003C\u002Fp>\n\u003Cp>Serving directly from disk is \u003Cstrong>88% faster\u003C\u002Fstrong> than a full WordPress page load. See the Performance section below for Nginx and Apache configuration.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Security:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Drafts, private posts, and password-protected content return \u003Ccode>403 Forbidden\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Rate limits cache-miss regenerations (20\u002Fmin by default) to mitigate DoS abuse\u003C\u002Fli>\n\u003Cli>\u003Ccode>X-Robots-Tag: noindex\u003C\u002Fcode> keeps Markdown versions out of search results\u003C\u002Fli>\n\u003Cli>\u003Ccode>Link: rel=\"canonical\"\u003C\u002Fcode> points search engines back to the HTML version\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>Cache variants (optional):\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>You can persist alternate cached representations by adding \u003Ccode>?botkibble_variant=slim\u003C\u002Fcode> (or any other variant name).\u003Cbr \u002F>\nVariant caches are stored under:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002Fwp-content\u002Fuploads\u002Fbotkibble\u002F_v\u002F\u003Cvariant>\u002F\u003Cslug>.md\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>What it does NOT do:\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Expose drafts, private posts, or password-protected content\u003C\u002Fli>\n\u003Cli>Serve non-post\u002Fpage content types by default\u003C\u002Fli>\n\u003Cli>Require any configuration. Activate and it works.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Why Markdown?\u003C\u002Fh3>\n\u003Cp>HTML is expensive for AI systems to process. \u003Ca href=\"https:\u002F\u002Fblog.cloudflare.com\u002Fmarkdown-for-agents\u002F\" rel=\"nofollow ugc\">Cloudflare measured\u003C\u002Fa> an 80% reduction in token usage when converting a blog post from HTML to Markdown (16,180 tokens down to 3,150).\u003C\u002Fp>\n\u003Cp>Cloudflare now offers \u003Ca href=\"https:\u002F\u002Fdevelopers.cloudflare.com\u002Ffundamentals\u002Freference\u002Fmarkdown-for-agents\u002F\" rel=\"nofollow ugc\">Markdown for Agents\u003C\u002Fa> at the CDN edge via the \u003Ccode>Accept: text\u002Fmarkdown\u003C\u002Fcode> header, available on Pro, Business, and Enterprise plans.\u003C\u002Fp>\n\u003Cp>This plugin does the same thing at the origin, so it works on any host. It also adds \u003Ccode>.md\u003C\u002Fcode> suffix URLs, \u003Ccode>?format=markdown\u003C\u002Fcode> query parameters, YAML frontmatter, static file caching, and server-level offloading.\u003C\u002Fp>\n\u003Cp>If you use Cloudflare, both share the same \u003Ccode>Accept: text\u002Fmarkdown\u003C\u002Fcode> header, \u003Ccode>Content-Signal\u003C\u002Fcode> headers, and \u003Ccode>X-Markdown-Tokens\u003C\u002Fcode> response headers.\u003C\u002Fp>\n\u003Cp>Cloudflare currently defaults to \u003Ccode>Content-Signal: ai-train=yes, search=yes, ai-input=yes\u003C\u002Fcode> with no way to change it. Botkibble defaults to \u003Ccode>ai-train=no\u003C\u002Fcode> and lets you override the full signal per site via the \u003Ccode>botkibble_content_signal\u003C\u002Fcode> filter.\u003C\u002Fp>\n\u003Ch3>Performance & Static Offloading\u003C\u002Fh3>\n\u003Cp>This plugin supports static file offloading by writing Markdown content to \u003Ccode>\u002Fwp-content\u002Fuploads\u002Fbotkibble\u002F\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Nginx Configuration\u003C\u002Fh3>\n\u003Cp>To bypass PHP entirely and have Nginx serve the files (including variants) directly:\u003C\u002Fp>\n\u003Cpre>\u003Ccode># Variants\nlocation ~* ^\u002F(_v\u002F[^\u002F]+\u002F.+)\\.md$ {\n    default_type text\u002Fmarkdown;\n    try_files \u002Fwp-content\u002Fuploads\u002Fbotkibble\u002F$1.md \u002Findex.php?$args;\n}\n\n# Default\nlocation ~* ^\u002F(.+)\\.md$ {\n    default_type text\u002Fmarkdown;\n    try_files \u002Fwp-content\u002Fuploads\u002Fbotkibble\u002F$1.md \u002Findex.php?$args;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Apache (.htaccess)\u003C\u002Fh3>\n\u003Cp>Add this to your \u003Ccode>.htaccess\u003C\u002Fcode> before the WordPress rules:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>RewriteEngine On\n# Variants\nRewriteCond %{DOCUMENT_ROOT}\u002Fwp-content\u002Fuploads\u002Fbotkibble\u002F_v\u002F$1\u002F$2.md -f\nRewriteRule ^_v\u002F([^\u002F]+)\u002F(.+)\\.md$ \u002Fwp-content\u002Fuploads\u002Fbotkibble\u002F_v\u002F$1\u002F$2.md [L,T=text\u002Fmarkdown]\n\n# Default\nRewriteCond %{DOCUMENT_ROOT}\u002Fwp-content\u002Fuploads\u002Fbotkibble\u002F$1.md -f\nRewriteRule ^(.*)\\.md$ \u002Fwp-content\u002Fuploads\u002Fbotkibble\u002F$1.md [L,T=text\u002Fmarkdown]\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Even without these rules, the plugin uses a “Fast-Path” that serves cached files from PHP before the main database query is executed.\u003C\u002Fp>\n\u003Ch3>Credits\u003C\u002Fh3>\n\u003Cp>We thank Cristi Constantin (https:\u002F\u002Fgithub.com\u002Fcristi-constantin) for contributing cache variants, URL and SEO improvements, and fixing important bugs.\u003C\u002Fp>\n","Serves every published post and page as Markdown for AI agents and crawlers. No configuration, no API keys. Activate and it works.",204,"2026-02-26T21:19:00.000Z","6.9.4","6.0","8.2",[25,26,27,28,29],"agents","ai","api","crawlers","markdown","https:\u002F\u002Fgithub.com\u002Fgreg-randall\u002Fbotkibble","https:\u002F\u002Fdownloads.wordpress.org\u002Fplugin\u002Fbotkibble.1.3.0.zip",null,"2026-04-06T09:54:40.288Z"]