{"id":288837,"date":"2026-03-15T12:22:17","date_gmt":"2026-03-15T12:22:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/serve-markdown\/"},"modified":"2026-03-15T12:22:05","modified_gmt":"2026-03-15T12:22:05","slug":"serve-md","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/serve-md\/","author":67767,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0","stable_tag":"1.0","tested":"6.9.4","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"Serve Markdown","header_author":"Azey","header_description":"Serve Markdown versions of your content for AI agents and crawlers. Features content negotiation, .md URLs, auto-discovery, crawler logging, and full admin controls.","assets_banners_color":"181d36","last_updated":"2026-03-15 12:22:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/ajaykj\/serve-markdown","header_author_uri":"https:\/\/profiles.wordpress.org\/akumarjain\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":168,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0":{"tag":"1.0","author":"akumarjain","date":"2026-03-15 12:22:05"}},"upgrade_notice":{"1.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3483080,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3483080,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3483080,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3483080,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3483080,"resolution":"1","location":"assets","locale":""},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3483080,"resolution":"2","location":"assets","locale":""},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3483080,"resolution":"3","location":"assets","locale":""},"screenshot-4.jpg":{"filename":"screenshot-4.jpg","revision":3483080,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"General settings tab \u2014 toggle features and select post types.","2":"Frontmatter settings \u2014 control metadata fields and add custom fields.","3":"Exclusions \u2014 block categories, tags, or individual posts.","4":"Crawler log \u2014 see which AI bots are reading your content."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2353,257149,12928,4608,186],"plugin_category":[55],"plugin_contributors":[257785],"plugin_business_model":[],"class_list":["post-288837","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-content-negotiation","plugin_tags-crawlers","plugin_tags-markdown","plugin_tags-seo","plugin_category-seo-and-marketing","plugin_contributors-akumarjain","plugin_committers-akumarjain"],"banners":{"banner":"https:\/\/ps.w.org\/serve-md\/assets\/banner-772x250.jpg?rev=3483080","banner_2x":"https:\/\/ps.w.org\/serve-md\/assets\/banner-1544x500.jpg?rev=3483080","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/serve-md\/assets\/icon-128x128.png?rev=3483080","icon_2x":"https:\/\/ps.w.org\/serve-md\/assets\/icon-256x256.png?rev=3483080","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/serve-md\/assets\/screenshot-1.jpg?rev=3483080","caption":"General settings tab \u2014 toggle features and select post types."},{"src":"https:\/\/ps.w.org\/serve-md\/assets\/screenshot-2.jpg?rev=3483080","caption":"Frontmatter settings \u2014 control metadata fields and add custom fields."},{"src":"https:\/\/ps.w.org\/serve-md\/assets\/screenshot-3.jpg?rev=3483080","caption":"Exclusions \u2014 block categories, tags, or individual posts."},{"src":"https:\/\/ps.w.org\/serve-md\/assets\/screenshot-4.jpg?rev=3483080","caption":"Crawler log \u2014 see which AI bots are reading your content."}],"raw_content":"<!--section=description-->\n<p>AI agents from ChatGPT, Claude, Perplexity, and others read your content to generate answers \u2014 but they parse through HTML, JavaScript, and navigation just to reach it. Serve Markdown gives them a direct path: clean Markdown with structured metadata. When a crawler requests it \u2014 via an <code>Accept: text\/markdown<\/code> header or a <code>.md<\/code> URL \u2014 your site responds instantly. No noise, no guesswork.<\/p>\n\n<h4>How It Works<\/h4>\n\n<p>Serve Markdown adds three capabilities to your WordPress site:<\/p>\n\n<p><strong>1. Content Negotiation<\/strong>\nWhen an AI crawler sends <code>Accept: text\/markdown<\/code>, your site returns Markdown instead of HTML \u2014 no URL changes needed.<\/p>\n\n<p><strong>2. .md URL Suffix<\/strong>\nAppend <code>.md<\/code> to any post or page URL (e.g. <code>example.com\/my-article.md<\/code>) to get the Markdown version directly.<\/p>\n\n<p><strong>3. Markdown Auto-Discovery<\/strong>\nEvery page includes a <code>&lt;link rel=\"alternate\" type=\"text\/markdown\"&gt;<\/code> tag in the HTML head so crawlers can find your Markdown automatically.<\/p>\n\n<h4>What the Markdown Output Looks Like<\/h4>\n\n<p>Every Markdown response includes YAML frontmatter with structured metadata followed by your post content. Here is a real example:<\/p>\n\n<pre>\n---\nurl: 'https:\/\/akumarjain.com\/textexpander-year-in-review-2025\/'\ntitle: TextExpander Year in Review 2025\nauthor:\n  name: Ajay\n  url: 'https:\/\/akumarjain.com\/author\/akumarjain\/'\ndate: '2026-01-05T09:05:00+05:30'\nmodified: '2026-01-10T14:30:06+05:30'\ntype: post\ncategories:\n  - 2025\n  - Year in Review\ntags:\n  - '#ToolsIUse'\n  - Productivity\n  - Remote Work\nimage: 'https:\/\/akumarjain.com\/wp-content\/uploads\/text-expander-year-in-review-2025.webp'\npublished: true\n---\n\n# TextExpander Year in Review 2025\n\nIn my daily work, I need to type the same words and phrases repeatedly...\n<\/pre>\n\n<h4>Features<\/h4>\n\n<p><strong>Content Serving<\/strong><\/p>\n\n<ul>\n<li>Content negotiation via <code>Accept: text\/markdown<\/code> header<\/li>\n<li><code>.md<\/code> URL suffix on any post or page<\/li>\n<li>Auto-discovery <code>&lt;link rel=\"alternate\"&gt;<\/code> tag in page head<\/li>\n<li>Each feature can be toggled independently<\/li>\n<li>Choose which post types are exposed (posts, pages, custom post types)<\/li>\n<\/ul>\n\n<p><strong>Frontmatter and Metadata<\/strong><\/p>\n\n<ul>\n<li>YAML frontmatter with title, author, date, categories, tags, featured image, and more<\/li>\n<li>Toggle individual metadata fields on or off<\/li>\n<li>Add custom static key-value pairs (e.g., <code>license<\/code>, <code>language<\/code>)<\/li>\n<li>Map WordPress custom fields (post meta) into the frontmatter<\/li>\n<\/ul>\n\n<p><strong>Access Control<\/strong><\/p>\n\n<ul>\n<li>Per-post opt-out via a sidebar checkbox in the editor<\/li>\n<li>Exclude entire categories from Markdown serving<\/li>\n<li>Exclude entire tags from Markdown serving<\/li>\n<li>Only published posts are served \u2014 drafts and private posts are never exposed<\/li>\n<\/ul>\n\n<p><strong>Crawler Insights<\/strong><\/p>\n\n<ul>\n<li>Request log showing every Markdown request with timestamp, URL, bot name, and method<\/li>\n<li>Automatic bot detection: ClaudeBot, GPTBot, ChatGPT, OAI-SearchBot, PerplexityBot, Googlebot, Bingbot, Cohere, Meta AI, Bytespider, Applebot, and more<\/li>\n<li>Stats dashboard: total requests, requests today, unique bots<\/li>\n<li>Filter log by individual bot<\/li>\n<li>Configurable retention period with automatic pruning<\/li>\n<li>One-click log clearing<\/li>\n<\/ul>\n\n<p><strong>Editor Integration<\/strong><\/p>\n\n<ul>\n<li>\"Preview Markdown\" button in the post editor sidebar<\/li>\n<li>\"View Markdown\" link in the Posts and Pages list table<\/li>\n<li>Meta box shows on all enabled post types<\/li>\n<\/ul>\n\n<h4>Performance<\/h4>\n\n<p>Markdown conversion only runs when specifically requested \u2014 regular visitors see the same HTML pages they always have. The crawler log uses a lightweight custom table with three safeguards against unbounded growth: time-based retention, a row count cap, and a table size cap.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The crawler log stores IP addresses and user-agent strings from Markdown requests. This data stays in your WordPress database and is never sent to external services. You can disable logging entirely, configure a retention period, or clear the log at any time from the settings page.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>serve-md<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Go to <strong>Settings &gt; Serve Markdown<\/strong> to configure.<\/li>\n<li>Visit any published post URL with <code>.md<\/code> appended to verify it works.<\/li>\n<\/ol>\n\n<p>No additional server configuration is required. The plugin works with all standard WordPress permalink structures.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20to%20configure%20anything%3F\"><h3>Do I need to configure anything?<\/h3><\/dt>\n<dd><p>The plugin works out of the box with sensible defaults: posts and pages are served as Markdown with all metadata fields enabled and crawler logging turned on. Visit <strong>Settings &gt; Serve Markdown<\/strong> to customize.<\/p><\/dd>\n<dt id=\"will%20this%20affect%20my%20site%20speed%3F\"><h3>Will this affect my site speed?<\/h3><\/dt>\n<dd><p>No. Markdown is generated on demand only when explicitly requested. Normal page loads are completely unaffected, and the crawler log insert adds negligible latency \u2014 or disable logging entirely from settings.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20custom%20post%20types%3F\"><h3>Does it work with custom post types?<\/h3><\/dt>\n<dd><p>Yes. Any public post type registered on your site will appear as a checkbox on the General settings tab.<\/p><\/dd>\n<dt id=\"can%20i%20exclude%20specific%20posts%3F\"><h3>Can I exclude specific posts?<\/h3><\/dt>\n<dd><p>Yes, in two ways. You can check \"Disable Markdown for this post\" in the editor sidebar for individual posts. You can also exclude entire categories or tags from the Exclusions settings tab.<\/p><\/dd>\n<dt id=\"what%20metadata%20is%20included%3F\"><h3>What metadata is included?<\/h3><\/dt>\n<dd><p>By default: URL, title, author name and URL, publish date, last modified date, post type, excerpt, categories, tags, featured image URL, and published status. Each field can be toggled off individually. You can also add custom static fields and map WordPress custom fields.<\/p><\/dd>\n<dt id=\"what%20ai%20crawlers%20are%20detected%3F\"><h3>What AI crawlers are detected?<\/h3><\/dt>\n<dd><p>ClaudeBot (Anthropic), GPTBot and OAI-SearchBot (OpenAI), ChatGPT-User, Google-Extended (Google AI), PerplexityBot, Bingbot, Cohere, Meta AI, Bytespider (ByteDance), Applebot, CCBot (Common Crawl), YouBot, and a catch-all for unrecognized bots.<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20caching%20plugins%3F\"><h3>Is this compatible with caching plugins?<\/h3><\/dt>\n<dd><p>Yes. Serve Markdown sets the <code>DONOTCACHEPAGE<\/code> constant when serving Markdown responses, which is respected by WP Super Cache, W3 Total Cache, WP Rocket, and most other caching plugins.<\/p><\/dd>\n<dt id=\"does%20this%20work%20on%20wordpress.com%3F\"><h3>Does this work on WordPress.com?<\/h3><\/dt>\n<dd><p>Yes. The plugin uses <code>WPINC<\/code> for environment detection instead of <code>ABSPATH<\/code>, making it compatible with WordPress.com Business plans, WordPress VIP, Pantheon, and other managed hosting platforms.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Serve Markdown versions of your posts and pages to AI agents and crawlers. Content negotiation, .md URLs, auto-discovery, and crawler logging.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/288837","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=288837"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/akumarjain"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=288837"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=288837"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=288837"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=288837"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=288837"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=288837"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}