{"id":355167,"date":"2026-08-19T19:16:17","date_gmt":"2026-08-19T19:16:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/markdown-for-agents\/"},"modified":"2026-08-19T19:39:50","modified_gmt":"2026-08-19T19:39:50","slug":"rawi-md","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/rawi-md\/","author":15996372,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.0","stable_tag":"1.2.0","tested":"7.0.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Rawi MD \u2014 Markdown for AI Crawlers","header_author":"Ahmed Abdelhamed","header_description":"Serves a clean Markdown representation of your posts, pages and products to the AI crawlers that ask for it \u2014 through Accept: text\/markdown, a .md URL suffix, or a query string. Built to keep working behind LiteSpeed Cache and WP Rocket.","assets_banners_color":"040e1f","last_updated":"2026-08-19 19:39:50","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/ahmed-abdelhamed.com\/rawi-md","header_author_uri":"https:\/\/ahmed-abdelhamed.com","rating":5,"author_block_rating":0,"active_installs":0,"downloads":46,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.0":{"tag":"1.2.0","author":"elalmy111","date":"2026-08-19 19:39:50"}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3655277,"resolution":"256x256","location":"assets","locale":"","width":1254,"height":1254}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3655277,"resolution":"1544x500","location":"assets","locale":"","width":1983,"height":793}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3655277,"resolution":"1","location":"assets","locale":"","width":1694,"height":813},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3655277,"resolution":"2","location":"assets","locale":"","width":1230,"height":819},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3655277,"resolution":"3","location":"assets","locale":"","width":1369,"height":850},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3655277,"resolution":"4","location":"assets","locale":"","width":1323,"height":835}},"screenshots":{"1":"The reports screen: who requested Markdown, which pages they wanted, and a 30-day activity chart.","2":"Settings: choose post types, frontmatter fields, caching and logging behaviour.","3":"Server rules: detects your caching stack and generates the rules to paste, plus a one-line check.","4":"The Markdown a crawler receives, with YAML frontmatter and the content stripped of theme chrome."}},"plugin_section":[],"plugin_tags":[2353,12928,239487,4608,186],"plugin_category":[55],"plugin_contributors":[276567],"plugin_business_model":[],"class_list":["post-355167","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-crawlers","plugin_tags-llms","plugin_tags-markdown","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-elalmy111","plugin_committers-elalmy111"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/rawi-md\/assets\/icon-256x256.png?rev=3655277","icon_2x":"https:\/\/ps.w.org\/rawi-md\/assets\/icon-256x256.png?rev=3655277","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/rawi-md\/assets\/screenshot-1.png?rev=3655277","caption":"The reports screen: who requested Markdown, which pages they wanted, and a 30-day activity chart."},{"src":"https:\/\/ps.w.org\/rawi-md\/assets\/screenshot-2.png?rev=3655277","caption":"Settings: choose post types, frontmatter fields, caching and logging behaviour."},{"src":"https:\/\/ps.w.org\/rawi-md\/assets\/screenshot-3.png?rev=3655277","caption":"Server rules: detects your caching stack and generates the rules to paste, plus a one-line check."},{"src":"https:\/\/ps.w.org\/rawi-md\/assets\/screenshot-4.png?rev=3655277","caption":"The Markdown a crawler receives, with YAML frontmatter and the content stripped of theme chrome."}],"raw_content":"<!--section=description-->\n<p>People are asking ChatGPT, Claude and Perplexity the questions they used to type into Google. To answer, those tools visit real websites and read them \u2014 including yours.<\/p>\n\n<p>But they read a WordPress page badly. Your content arrives buried in markup, scripts, navigation and cookie banners that mean nothing to a language model, and the model pays for every one of those tokens.<\/p>\n\n<p>This plugin answers <code>Accept: text\/markdown<\/code> with a clean Markdown document at the same URL. Browsers keep getting the normal page. Nothing changes for your visitors, and nothing changes in how you write.<\/p>\n\n<p><strong>The part most plugins get wrong<\/strong><\/p>\n\n<p>Page caches answer requests before WordPress runs. When LiteSpeed or WP Rocket has a stored copy of a page, an agent asking for Markdown gets HTML instead, and the plugin never even loads. This plugin handles that on both sides: it tells the cache plugins to stand down at runtime, and it generates the server-level rules you need to paste in so the cache steps aside before PHP starts.<\/p>\n\n<p><strong>How agents can reach the Markdown<\/strong><\/p>\n\n<ul>\n<li><code>Accept: text\/markdown<\/code> on the normal page URL \u2014 real HTTP content negotiation, the route AI agents actually use<\/li>\n<li>A <code>.md<\/code> suffix on any URL, for agents that do not send the header<\/li>\n<li><code>?format=md<\/code> or <code>?output_format=md<\/code><\/li>\n<\/ul>\n\n<p>The HTML page also advertises the Markdown version through a <code>&lt;link rel=\"alternate\"&gt;<\/code> tag and a <code>Link:<\/code> response header, so an agent can find it without guessing.<\/p>\n\n<p><strong>What you control<\/strong><\/p>\n\n<ul>\n<li>Which post types are served, and which individual pages are excluded<\/li>\n<li>Which theme elements are stripped, by CSS selector<\/li>\n<li>Which YAML frontmatter fields appear<\/li>\n<li>WooCommerce products carry SKU, price, currency, stock status and rating in the frontmatter. Those live in post meta, so a converter working from rendered HTML cannot produce them<\/li>\n<li>A <code>Content-Signal<\/code> header stating how you allow the content to be used<\/li>\n<\/ul>\n\n<p><strong>Reporting<\/strong><\/p>\n\n<p>A dashboard shows which agents requested Markdown, which pages they wanted, and which route they used.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>The plugin records Markdown requests in a table in your own database: timestamp, post ID, URL path, user agent, and a one-way hash of the IP address. Nothing is sent anywhere. IP addresses are never stored in readable form, hashing can be turned off entirely, and entries are deleted after a retention period you set. Uninstalling removes the table.<\/p>\n\n<h3>Languages<\/h3>\n\n<p>The interface ships in English and Arabic. WordPress picks the Arabic strings automatically when the site language is set to Arabic, and the admin screens follow the right-to-left layout.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>rawi-md<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open Settings &gt; Rawi MD and pick your post types.<\/li>\n<li>Open the Server rules tab and apply the rules for your stack.<\/li>\n<li>Run the curl check from that same tab.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20cloaking%3F\"><h3>Is this cloaking?<\/h3><\/dt>\n<dd><p>No. Cloaking means serving different content based on who is asking. This is content negotiation: the client states which format it prefers and the server honours it. The words are the same either way. The plugin never inspects the User-Agent to decide what to send.<\/p>\n\n<p>That said, search engines have not published a definitive position on serving Markdown through content negotiation. The plugin sends <code>noindex<\/code> only on the <code>.md<\/code> and query-string addresses, which are genuine duplicates, and never on your real page URL.<\/p><\/dd>\n<dt id=\"i%20already%20use%20cloudflare%27s%20markdown%20for%20agents.%20do%20i%20need%20this%3F\"><h3>I already use Cloudflare's Markdown for Agents. Do I need this?<\/h3><\/dt>\n<dd><p>Probably not, if your zone is on a Pro plan or above and you are happy with the generic conversion. Running both means converting the same page twice. This plugin is for sites on the Cloudflare free plan, sites not behind Cloudflare, and anyone who wants control over what gets stripped and what metadata is attached.<\/p><\/dd>\n<dt id=\"will%20this%20slow%20my%20site%20down%3F\"><h3>Will this slow my site down?<\/h3><\/dt>\n<dd><p>No. Conversion only runs when a client explicitly asks for Markdown, and the result is cached on disk until the post changes. Normal visitors never touch this code path.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20elementor%3F\"><h3>Does it work with Elementor?<\/h3><\/dt>\n<dd><p>Yes. Elementor renders through the content filters, which is the default source. Bricks and Oxygen replace the whole template, so switch the content source to the full page render for those.<\/p><\/dd>\n<dt id=\"how%20do%20i%20check%20it%20is%20working%3F\"><h3>How do I check it is working?<\/h3><\/dt>\n<dd><p>curl -sI -H \"Accept: text\/markdown\" \"https:\/\/example.com\/your-post\/\"<\/p>\n\n<p>You want <code>content-type: text\/markdown<\/code> and an <code>x-markdown-tokens<\/code> header. If you get <code>text\/html<\/code>, your page cache is answering first \u2014 see the Server rules tab.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Renamed to Rawi MD. The previous name overlapped with an existing third-party feature name.<\/li>\n<li>Every function, class, constant, option, hook and database table now uses the RAWI_ prefix.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Uninstall now removes cached files through WP_Filesystem rather than direct PHP calls.<\/li>\n<li>Every database query passes the table name through a prepared identifier placeholder.<\/li>\n<li>Minimum WordPress raised to 6.2, which is where identifier placeholders arrived.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Full Arabic translation, with a right-to-left admin layout.<\/li>\n<li>Moved to its own top-level menu instead of sitting under Settings.<\/li>\n<li>Rebuilt the Reports screen: headline figures, a 30-day activity chart, and proportional breakdowns by agent, page and route.<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Product frontmatter now carries the main image URL, read from meta so it survives either content source.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Themes that print the title more than once no longer produce repeated H1 headings.<\/li>\n<li>Default removal list now covers WooCommerce price, meta, tabs and related-product blocks.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed a parse error that stopped the plugin activating.<\/li>\n<li>The plugin now stays out of the way, and says so in the admin, when PHP is built without the DOM extension.<\/li>\n<li>Conversion failures fall back to the normal HTML page instead of serving an empty document.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Give ChatGPT, Claude and other AI crawlers a clean Markdown copy of your posts, pages and products. Nothing changes for your visitors.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/355167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=355167"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/elalmy111"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=355167"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=355167"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=355167"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=355167"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=355167"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=355167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}