{"id":294466,"date":"2026-04-12T14:49:58","date_gmt":"2026-04-12T14:49:58","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mvp-docs\/"},"modified":"2026-04-16T16:14:14","modified_gmt":"2026-04-16T16:14:14","slug":"mvp-docs","status":"publish","type":"plugin","link":"https:\/\/vec.wordpress.org\/plugins\/mvp-docs\/","author":194143,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.1.0","stable_tag":"1.1.0","tested":"6.9.4","requires":"6.7","requires_php":"8.0","requires_plugins":null,"header_name":"MVP Docs","header_author":"cartpauj","header_description":"A minimum viable documentation plugin. Lightweight docs CPT with categories, markdown import, and just enough settings to be useful.","assets_banners_color":"d5dae1","last_updated":"2026-04-16 16:14:14","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/cartpauj\/mvp-docs","header_author_uri":"https:\/\/github.com\/cartpauj","rating":0,"author_block_rating":0,"active_installs":0,"downloads":67,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.7":{"tag":"1.0.7","author":"cartpauj","date":"2026-04-12 14:49:29"},"1.1.0":{"tag":"1.1.0","author":"cartpauj","date":"2026-04-16 16:14:14"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3508272,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3508272,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3508272,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3508272,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.7","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3508272,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3508272,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3508272,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3508272,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3508272,"resolution":"5","location":"assets","locale":""},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3508272,"resolution":"6","location":"assets","locale":""},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3508272,"resolution":"7","location":"assets","locale":""},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3508272,"resolution":"8","location":"assets","locale":""}},"screenshots":{"1":"Docs archive page with category cards and search bar","2":"Search results page","3":"Single doc with breadcrumbs","4":"Settings \u2014 Design tab","5":"Settings \u2014 Category Order (drag and drop)","6":"Settings \u2014 Permalinks","7":"Settings \u2014 Import \/ Export","8":"Markdown import in the block editor sidebar"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2353,10611,6941,14090,4608],"plugin_category":[],"plugin_contributors":[79576],"plugin_business_model":[],"class_list":["post-294466","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-docs","plugin_tags-documentation","plugin_tags-knowledge-base","plugin_tags-markdown","plugin_contributors-cartpauj","plugin_committers-cartpauj"],"banners":{"banner":"https:\/\/ps.w.org\/mvp-docs\/assets\/banner-772x250.png?rev=3508272","banner_2x":"https:\/\/ps.w.org\/mvp-docs\/assets\/banner-1544x500.png?rev=3508272","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/mvp-docs\/assets\/icon-128x128.png?rev=3508272","icon_2x":"https:\/\/ps.w.org\/mvp-docs\/assets\/icon-256x256.png?rev=3508272","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mvp-docs\/assets\/screenshot-1.png?rev=3508272","caption":"Docs archive page with category cards and search bar"},{"src":"https:\/\/ps.w.org\/mvp-docs\/assets\/screenshot-2.png?rev=3508272","caption":"Search results page"},{"src":"https:\/\/ps.w.org\/mvp-docs\/assets\/screenshot-3.png?rev=3508272","caption":"Single doc with breadcrumbs"},{"src":"https:\/\/ps.w.org\/mvp-docs\/assets\/screenshot-4.png?rev=3508272","caption":"Settings \u2014 Design tab"},{"src":"https:\/\/ps.w.org\/mvp-docs\/assets\/screenshot-5.png?rev=3508272","caption":"Settings \u2014 Category Order (drag and drop)"},{"src":"https:\/\/ps.w.org\/mvp-docs\/assets\/screenshot-6.png?rev=3508272","caption":"Settings \u2014 Permalinks"},{"src":"https:\/\/ps.w.org\/mvp-docs\/assets\/screenshot-7.png?rev=3508272","caption":"Settings \u2014 Import \/ Export"},{"src":"https:\/\/ps.w.org\/mvp-docs\/assets\/screenshot-8.png?rev=3508272","caption":"Markdown import in the block editor sidebar"}],"raw_content":"<!--section=description-->\n<p>MVP Docs adds a simple documentation system to your WordPress site. It creates a Docs custom post type with categories, a clean archive page, and a markdown import tool \u2014 nothing more.<\/p>\n\n<p><strong>Why MVP Docs?<\/strong><\/p>\n\n<p>AI tools like Claude and ChatGPT are excellent at generating documentation in Markdown format. MVP Docs was built to take advantage of that \u2014 paste your AI-generated <code>.md<\/code> files straight into WordPress with a single click. No copy-pasting HTML, no reformatting, no fussing with blocks. Just import and publish.<\/p>\n\n<p>Beyond the AI workflow, most documentation plugins are overbuilt. They add custom page builders, proprietary editors, dozens of database tables, and megabytes of JavaScript. MVP Docs takes the opposite approach:<\/p>\n\n<ul>\n<li>Uses the native WordPress block editor<\/li>\n<li>Works with any theme (block themes and classic themes)<\/li>\n<li>Stores content as standard WordPress posts<\/li>\n<li>Loads zero scripts or styles outside of doc pages<\/li>\n<li>No lock-in \u2014 your content is just posts and taxonomies<\/li>\n<li>No external dependencies \u2014 everything ships with the plugin<\/li>\n<\/ul>\n\n<p><strong>Features<\/strong><\/p>\n\n<ul>\n<li><strong>Docs post type<\/strong> with archive at <code>\/docs\/<\/code><\/li>\n<li><strong>Doc Categories<\/strong> for organizing content<\/li>\n<li><strong>Search<\/strong> \u2014 AJAX-powered typeahead dropdown on the archive and category pages, with a dedicated search results page at <code>\/docs\/search\/<\/code><\/li>\n<li><strong>Markdown import<\/strong> \u2014 upload a <code>.md<\/code> file and it converts to native Gutenberg blocks (tables, code blocks, lists, and all GFM features)<\/li>\n<li><strong>Import \/ Export<\/strong> \u2014 export docs, categories, and settings as a JSON file; import on another site<\/li>\n<li><strong>Archive page<\/strong> \u2014 docs grouped by category in a card grid<\/li>\n<li><strong>Category archives<\/strong> \u2014 full list of docs in a category with search bar<\/li>\n<li><strong>Search results page<\/strong> \u2014 dedicated page with breadcrumbs and themed card layout<\/li>\n<li><strong>Breadcrumbs<\/strong> on single doc pages<\/li>\n<li><strong>Settings<\/strong> \u2014 archive layout (columns, border radius, docs per category), colors, page titles, sort order, custom slugs, category ordering via drag-and-drop<\/li>\n<li><strong>Block theme support<\/strong> \u2014 registers proper block templates for single docs, archives, category pages, and search<\/li>\n<li><strong>Classic theme support<\/strong> \u2014 falls back to PHP templates with <code>get_header()<\/code>\/<code>get_footer()<\/code><\/li>\n<li><strong>WP-CLI<\/strong> \u2014 full command-line coverage so an AI agent or shell script can configure and populate a docs site without ever opening wp-admin<\/li>\n<\/ul>\n\n<p><strong>Markdown Import \u2014 Built for AI-Generated Docs<\/strong><\/p>\n\n<p>AI tools produce clean, well-structured Markdown. MVP Docs lets you import those <code>.md<\/code> files directly into the block editor with one click. The sidebar includes an \"Import from Markdown\" button \u2014 upload a file and it gets parsed client-side with full GitHub Flavored Markdown support (via marked.js), then converted into native Gutenberg blocks. The first <code># Heading<\/code> becomes the post title automatically.<\/p>\n\n<p>Use your favorite AI to generate docs, how-to guides, or knowledge base articles in Markdown, then import them into WordPress without any reformatting.<\/p>\n\n<p>Supported: headings, bold, italic, links, images, tables, fenced code blocks with syntax hints, task lists, strikethrough, blockquotes, horizontal rules, ordered and unordered lists.<\/p>\n\n<p><strong>Import \/ Export<\/strong><\/p>\n\n<p>Go to Docs &gt; Settings &gt; Import \/ Export to:<\/p>\n\n<ul>\n<li><strong>Export<\/strong> docs, categories, and\/or settings as a single JSON file<\/li>\n<li><strong>Import<\/strong> a previously exported file to restore or migrate content between sites<\/li>\n<\/ul>\n\n<p>Existing docs with the same title are skipped during import to avoid duplicates. Categories are created automatically if they don't exist.<\/p>\n\n<p><strong>WP-CLI<\/strong><\/p>\n\n<p>Every admin action has a command-line equivalent, so a docs site can be stood up and populated entirely from a shell script or AI agent. Run <code>wp mvp-docs &lt;command&gt; --help<\/code> for full details on any command below.<\/p>\n\n<p><em>Content<\/em><\/p>\n\n<pre><code>wp mvp-docs import-md &lt;file&gt;\n<\/code><\/pre>\n\n<p>Import a Markdown file as a doc. Output is byte-identical to the sidebar Markdown importer \u2014 same blocks, same title extraction from the first <code>#<\/code> heading.<\/p>\n\n<pre><code>wp mvp-docs import-raw &lt;file&gt;\n<\/code><\/pre>\n\n<p>Import a raw HTML file as a doc. Block-commented HTML is preserved as-is; plain HTML renders as a Classic block in the editor.<\/p>\n\n<p>Both import commands accept:\n* <code>--title=&lt;text&gt;<\/code> \u2014 override the extracted title\n* <code>--slug=&lt;slug&gt;<\/code> \u2014 explicit post slug\n* <code>--excerpt=&lt;text&gt;<\/code> \u2014 short description shown on category\/search pages\n* <code>--category=&lt;slug&gt;<\/code> \u2014 assign to this category (created if missing)\n* <code>--sort-order=&lt;n&gt;<\/code> \u2014 in-category sort priority (lower appears first)\n* <code>--status=&lt;publish|draft|private&gt;<\/code> \u2014 post status (default: publish)\n* <code>--dry-run<\/code> \u2014 print the generated markup instead of creating a post<\/p>\n\n<p><em>Backup and migration<\/em><\/p>\n\n<pre><code>wp mvp-docs export [--docs] [--settings] [--output=&lt;file&gt;] [--pretty]\n<\/code><\/pre>\n\n<p>Dump docs, categories, settings, and category order to a single JSON bundle. Omitting both flags exports everything. Pipe to stdout or write to a file.<\/p>\n\n<pre><code>wp mvp-docs import &lt;file&gt;\n<\/code><\/pre>\n\n<p>Restore a JSON bundle. Docs are deduplicated by title, so running the same import twice is safe.<\/p>\n\n<p><em>Structure<\/em><\/p>\n\n<pre><code>wp mvp-docs reorder-categories &lt;slug-or-id&gt;...\n<\/code><\/pre>\n\n<p>Set the display order of categories. Accepts term IDs or slugs.<\/p>\n\n<p><em>Settings<\/em><\/p>\n\n<pre><code>wp mvp-docs settings list [--format=table|json|yaml|csv]\n<\/code><\/pre>\n\n<p>Show every setting with its current value, description, and allowed form \u2014 self-documenting so you never have to read the source to discover what's configurable.<\/p>\n\n<pre><code>wp mvp-docs settings get &lt;key&gt;\n<\/code><\/pre>\n\n<p>Print a single setting's value.<\/p>\n\n<pre><code>wp mvp-docs settings set &lt;key=value&gt;...\n<\/code><\/pre>\n\n<p>Update one or more settings. Values run through the same sanitizer as the admin UI; if a value is rejected (e.g. <code>columns=7<\/code> when the allowed range is 1\u20134), a warning names the allowed form and shows the actual saved value. Changing <code>docs_slug<\/code> or <code>category_slug<\/code> auto-flushes rewrite rules.<\/p>\n\n<p><em>Quick start for AI agents<\/em><\/p>\n\n<pre><code>wp plugin activate mvp-docs\nwp mvp-docs settings set docs_slug=kb archive_title=\"Knowledge Base\"\nwp term create mvpd_category \"Getting Started\" --slug=getting-started\nwp mvp-docs reorder-categories getting-started\nwp mvp-docs import-md .\/intro.md --category=getting-started --sort-order=1\nwp mvp-docs export --output=backup.json\n<\/code><\/pre>\n\n<!--section=installation-->\n<ol>\n<li>Go to Plugins &gt; Add New and search for \"MVP Docs\"<\/li>\n<li>Click Install Now, then Activate<\/li>\n<li>Go to Settings &gt; Permalinks and click Save (to register the URL structure)<\/li>\n<li>Start creating docs under the new Docs menu<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20my%20theme%3F\"><h3>Does it work with my theme?<\/h3><\/dt>\n<dd><p>Yes. MVP Docs auto-detects whether you're using a block theme or a classic theme and uses the appropriate template system. The archive styling is minimal and designed to work within your theme's layout.<\/p><\/dd>\n<dt id=\"can%20i%20import%20existing%20markdown%20files%3F\"><h3>Can I import existing markdown files?<\/h3><\/dt>\n<dd><p>Yes. When editing a doc, open the sidebar and click \"Import from Markdown\" under Doc Settings. Select a <code>.md<\/code> file and it will be converted to native Gutenberg blocks.<\/p><\/dd>\n<dt id=\"can%20i%20migrate%20docs%20between%20sites%3F\"><h3>Can I migrate docs between sites?<\/h3><\/dt>\n<dd><p>Yes. Use the Import \/ Export tab under Docs &gt; Settings to export your docs, categories, and settings as a JSON file, then import it on another site.<\/p><\/dd>\n<dt id=\"does%20it%20add%20scripts%20or%20styles%20to%20every%20page%3F\"><h3>Does it add scripts or styles to every page?<\/h3><\/dt>\n<dd><p>No. CSS and JS are only loaded on doc pages \u2014 the archive, category pages, search results, and single docs. Nothing is enqueued globally.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20url%20structure%3F\"><h3>Can I change the URL structure?<\/h3><\/dt>\n<dd><p>Yes. Go to Docs &gt; Settings &gt; Permalinks to change the docs slug and category slug.<\/p><\/dd>\n<dt id=\"can%20i%20script%20setup%20for%20an%20ai%20agent%20or%20ci%20pipeline%3F\"><h3>Can I script setup for an AI agent or CI pipeline?<\/h3><\/dt>\n<dd><p>Yes. MVP Docs ships a complete WP-CLI command set \u2014 activate the plugin, configure settings, create categories, and import Markdown or HTML docs all from a shell script. See the \"WP-CLI\" section above and run <code>wp mvp-docs &lt;command&gt; --help<\/code> for detailed options.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20the%20plugin%3F\"><h3>What happens if I deactivate the plugin?<\/h3><\/dt>\n<dd><p>Your content stays. Docs are standard WordPress posts \u2014 they remain in your database and can be accessed via the admin even without the plugin active.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added full WP-CLI command set (<code>wp mvp-docs import-md|import-raw|export|import|reorder-categories|settings<\/code>) \u2014 configure and populate a docs site without touching wp-admin<\/li>\n<li>Markdown CLI import produces byte-identical output to the sidebar importer<\/li>\n<li><code>wp mvp-docs settings list<\/code> now shows description and allowed-value form for every setting; <code>settings set<\/code> warns when a value is rejected and explains what's allowed<\/li>\n<li>Slug changes via CLI auto-flush rewrite rules<\/li>\n<li>Unified head typography and spacing across archive, category, and single doc views<\/li>\n<li>Added <code>.mvpd-page-header<\/code>, <code>.mvpd-page-title<\/code>, <code>.mvpd-page-subtitle<\/code> classes to header shortcode output so themes can't override plugin spacing<\/li>\n<li>Search button icon now uses <code>--mvpd-card-bg<\/code> for reliable contrast on dark accent colors<\/li>\n<li>Breadcrumbs now use the plugin's link color (with explicit <code>:visited<\/code> handling to beat classic themes)<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>First vs published to WP.org<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fixed a couple of non-translatable strings<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Rename custom post type from mvp_doc to mvpd_doc for unique prefix compliance<\/li>\n<li>Add nonce verification to AJAX search endpoint<\/li>\n<li>Sanitize all input values including validated whitelist fields<\/li>\n<li>Escape inline CSS output with wp_strip_all_tags()<\/li>\n<li>Add input type validation for JSON import data<\/li>\n<li>Fix subtitle settings field stretching full width<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Update readme's<\/li>\n<li>Changed metabox title<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix docs archive not filling full width in classic themes with flex layouts<\/li>\n<li>Fix search input placeholder text overlapping the search icon<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix duplicate plugin\/author URI<\/li>\n<li>Derive MVPD_VERSION from plugin header<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Update author URI<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<\/ul>","raw_excerpt":"A lightweight documentation plugin for WordPress. AI-friendly markdown import, native editor, no bloat.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/294466","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=294466"}],"author":[{"embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/cartpauj"}],"wp:attachment":[{"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=294466"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=294466"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=294466"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=294466"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=294466"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/vec.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=294466"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}