{"id":104201,"date":"2026-07-14T19:20:21","date_gmt":"2026-07-14T19:20:21","guid":{"rendered":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/"},"modified":"2026-07-14T19:20:21","modified_gmt":"2026-07-14T19:20:21","slug":"meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder","status":"publish","type":"post","link":"https:\/\/youzum.net\/fr\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/","title":{"rendered":"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><a href=\"https:\/\/haydenbleasel.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Hayden Bleasel<\/a>, an expert developer from OpenAI, released <strong><a href=\"https:\/\/github.com\/haydenbleasel\/blume\" target=\"_blank\" rel=\"noreferrer noopener\">Blume<\/a><\/strong>, an open-source documentation framework. Blume shipped to npm as version 1.0.3 the same day. It is as simple as Drop Markdown into a folder and ship a docs site. No app boilerplate is written or maintained afterward. The project is MIT-licensed and open sourced. <\/p>\n<h2 class=\"wp-block-heading\"><strong>What is Blume?<\/strong><\/h2>\n<p class=\"wp-block-paragraph\"><strong><a href=\"https:\/\/github.com\/haydenbleasel\/blume\" target=\"_blank\" rel=\"noreferrer noopener\">Blume<\/a><\/strong> is a command-line tool paired with a component library for docs. It reads a folder of Markdown or MDX files. From that folder, it produces a production-grade documentation site. That output ships navigation, search, theming, and Open Graph images. Configuration stays optional and is added one file at a time. The code is a TypeScript monorepo; the published package sits at <code>packages\/blume<\/code>. Blume\u2019s own documentation, under <code>apps\/docs<\/code>, is built with Blume itself. It requires Node.js 22.12 or newer. It runs with Bun, pnpm, npm, or yarn.<\/p>\n<h2 class=\"wp-block-heading\"><strong>How Blume Works<\/strong>?<\/h2>\n<p class=\"wp-block-paragraph\">Under the surface, Blume generates and drives a hidden Astro project. First, the CLI loads <code>blume.config.ts<\/code> and scans your content into a graph. Next, it writes an Astro project into a <code>.blume\/<\/code> directory. Astro then renders every page through a single catch-all route. That route imports Blume\u2019s shipped components, the generated data, and your overrides. On each run, <code>.blume\/<\/code> regenerates, and only changed files are rewritten. As a result, hot reload stays fast during editing. The core theme ships no client framework JavaScript. Consequently, pages score well on Core Web Vitals by default. When you need full control, <code>blume eject<\/code> promotes the runtime into a standalone Astro app. That ejected project still depends on the <code>blume<\/code> package. <\/p>\n<p><!-- Blume Interactive Explainer \u2014 Marktechpost | paste into a WordPress Custom HTML block --><br \/>\n Run blume dev&lt;\/button&gt;<br \/>\n    &lt;button id=&#8221;prevBtn&#8221; disabled&gt;\u2039 Prev&lt;\/button&gt;<br \/>\n    &lt;button id=&#8221;nextBtn&#8221;&gt;Next \u203a&lt;\/button&gt;<br \/>\n    &lt;button id=&#8221;resetBtn&#8221;&gt;\u21ba Reset&lt;\/button&gt;<br \/>\n    &lt;div class=&quot;&rdquo;spacer&rdquo;&quot;&gt;&lt;\/div&gt;<br \/>\n    &lt;label class=&quot;&rdquo;toggle&quot; on&rdquo; id=&quot;&rdquo;aiToggle&rdquo;&quot;&gt;&lt;span class=&quot;&rdquo;dot&rdquo;&quot;&gt;&lt;\/span&gt; Show AI outputs&lt;\/label&gt;<br \/>\n  &lt;\/div&gt;<\/p>\n<p>  &lt;div class=&quot;&rdquo;foot&rdquo;&quot;&gt;<br \/>\n    &lt;span&gt;Blume v1.0.3 &middot; MIT &middot; Node.js 22.12+ &middot; Astro + Vite&lt;\/span&gt;<br \/>\n    &lt;span&gt;Interactive explainer by &lt;a class=&quot;&rdquo;mtp&rdquo;&quot; href=&quot;\/fr\/&rdquo;https:\/\/www.marktechpost.com&rdquo;\/&quot; target=&quot;&rdquo;_blank&rdquo;&quot; rel=&quot;&rdquo;noopener&rdquo;&quot;&gt;Marktechpost&lt;\/a&gt;&lt;\/span&gt;<br \/>\n  &lt;\/div&gt;<br \/>\n&lt;\/div&gt;<\/p>\n<p>&lt;script&gt;<br \/>\n(function () {<br \/>\n  var root = document.getElementById(&#8220;blume-explainer&#8221;);<br \/>\n  var token = root.querySelector(&#8220;#token&#8221;);<br \/>\n  var nodes = root.querySelectorAll(&#8220;.node[data-stage]&#8221;);<br \/>\n  var aiNodes = root.querySelectorAll(&#8220;.ai-node&#8221;);<br \/>\n  var aiBranches = root.querySelectorAll(&#8220;.ai-branch&#8221;);<br \/>\n  var stepLabel = root.querySelector(&#8220;#stepLabel&#8221;);<br \/>\n  var stepTitle = root.querySelector(&#8220;#stepTitle&#8221;);<br \/>\n  var stepText = root.querySelector(&#8220;#stepText&#8221;);<br \/>\n  var termText = root.querySelector(&#8220;#termText&#8221;);<br \/>\n  var runBtn = root.querySelector(&#8220;#runBtn&#8221;);<br \/>\n  var prevBtn = root.querySelector(&#8220;#prevBtn&#8221;);<br \/>\n  var nextBtn = root.querySelector(&#8220;#nextBtn&#8221;);<br \/>\n  var resetBtn = root.querySelector(&#8220;#resetBtn&#8221;);<br \/>\n  var aiToggle = root.querySelector(&#8220;#aiToggle&#8221;);<\/p>\n<p>  \/\/ token positions per stage (cx, cy)<br \/>\n  var pos = [<br \/>\n    [85, 90], [250, 90], [470, 90], [700, 70], [700, 163], [842, 90]<br \/>\n  ];<\/p>\n<p>  var steps = [<br \/>\n    { label: &#8220;Stage 1 \/ 6&#8221;, title: &#8220;A folder of Markdown&#8221;, term: &#8220;docs\/  index.mdx  guide.mdx  api.mdx&#8221;,<br \/>\n      text: &#8220;You start with .md or .mdx files in a folder. There is no starter to clone and no app boilerplate to maintain.&#8221; },<br \/>\n    { label: &#8220;Stage 2 \/ 6&#8221;, title: &#8220;The CLI loads your config&#8221;, term: &#8220;blume dev  \u2713 loaded blume.config.ts&#8221;,<br \/>\n      text: &#8220;blume dev loads blume.config.ts. It reads your content sources, theme tokens, and options, all type-checked by a schema.&#8221; },<br \/>\n    { label: &#8220;Stage 3 \/ 6&#8221;, title: &#8220;Content is scanned into a graph&#8221;, term: &#8220;scanning content \u2026  \u2713 3 pages, nav inferred&#8221;,<br \/>\n      text: &#8220;Blume scans every page into a content graph. Navigation is inferred from your files, so you rarely hand-write it.&#8221; },<br \/>\n    { label: &#8220;Stage 4 \/ 6&#8221;, title: &#8220;A hidden Astro project is generated&#8221;, term: &#8220;writing .blume\/  \u2713 only changed files&#8221;,<br \/>\n      text: &#8220;Blume writes a hidden Astro project into .blume\/. It regenerates each run, rewriting only changed files, so hot reload stays fast.&#8221; },<br \/>\n    { label: &#8220;Stage 5 \/ 6&#8221;, title: &#8220;Astro + Vite render the pages&#8221;, term: &#8220;rendering via catch-all route  \u2713&#8221;,<br \/>\n      text: &#8220;Astro renders every page through one catch-all route. It imports Blume&#8217;s components, the generated data, and any overrides you add.&#8221; },<br \/>\n    { label: &#8220;Stage 6 \/ 6&#8221;, title: &#8220;Static HTML ships to dist\/&#8221;, term: &#8220;blume build  \u2713 dist\/ + search index&#8221;,<br \/>\n      text: &#8220;The build outputs static HTML and a local search index into dist\/. The core theme ships no client framework JS, helping Core Web Vitals.&#8221; }<br \/>\n  ];<\/p>\n<p>  var current = -1;<br \/>\n  var playing = false;<br \/>\n  var playTimer = null;<\/p>\n<p>  function paintNodes(active) {<br \/>\n    nodes.forEach(function (n) {<br \/>\n      var s = parseInt(n.getAttribute(&#8220;data-stage&#8221;), 10);<br \/>\n      var rect = n.querySelector(&#8220;rect&#8221;);<br \/>\n      if (s === active) {<br \/>\n        rect.setAttribute(&#8220;stroke&#8221;, &#8220;#ff7000&#8221;);<br \/>\n        rect.setAttribute(&#8220;stroke-width&#8221;, &#8220;2.5&#8221;);<br \/>\n        rect.setAttribute(&#8220;fill&#8221;, &#8220;#241108&#8221;);<br \/>\n      } else if (s &lt; active) {<br \/>\n        rect.setAttribute(&#8220;stroke&#8221;, &#8220;#7a4a1e&#8221;);<br \/>\n        rect.setAttribute(&#8220;stroke-width&#8221;, &#8220;1.5&#8221;);<br \/>\n        rect.setAttribute(&#8220;fill&#8221;, &#8220;#1a120b&#8221;);<br \/>\n      } else {<br \/>\n        rect.setAttribute(&#8220;stroke&#8221;, &#8220;#33281f&#8221;);<br \/>\n        rect.setAttribute(&#8220;stroke-width&#8221;, &#8220;1.5&#8221;);<br \/>\n        rect.setAttribute(&#8220;fill&#8221;, &#8220;#17120e&#8221;);<br \/>\n      }<br \/>\n    });<br \/>\n  }<\/p>\n<p>  function moveToken(i) {<br \/>\n    if (i &lt; 0) { token.style.opacity = 0; return; }<br \/>\n    token.style.opacity = 1;<br \/>\n    token.style.transition = &#8220;cx .55s cubic-bezier(.4,0,.2,1), cy .55s cubic-bezier(.4,0,.2,1)&#8221;;<br \/>\n    token.setAttribute(&#8220;cx&#8221;, pos[i][0]);<br \/>\n    token.setAttribute(&#8220;cy&#8221;, pos[i][1]);<br \/>\n  }<\/p>\n<p>  function render(i) {<br \/>\n    current = i;<br \/>\n    if (i &lt; 0) {<br \/>\n      stepLabel.textContent = &#8220;Ready&#8221;;<br \/>\n      stepTitle.textContent = &#8220;Press Run to watch the build&#8221;;<br \/>\n      stepText.textContent = &#8220;Blume needs only a folder of Markdown. Everything below is generated for you and thrown away on each run, unless you eject.&#8221;;<br \/>\n      termText.textContent = &#8220;npx blume init&#8221;;<br \/>\n      paintNodes(-1); moveToken(-1);<br \/>\n    } else {<br \/>\n      var s = steps[i];<br \/>\n      stepLabel.textContent = s.label;<br \/>\n      stepTitle.textContent = s.title;<br \/>\n      stepText.textContent = s.text;<br \/>\n      termText.textContent = s.term;<br \/>\n      paintNodes(i); moveToken(i);<br \/>\n    }<br \/>\n    prevBtn.disabled = (i &lt;= 0);<br \/>\n    nextBtn.disabled = (i &gt;= steps.length &#8211; 1);<br \/>\n    reportHeight();<br \/>\n  }<\/p>\n<p>  function next() { if (current &lt; steps.length &#8211; 1) render(current + 1); }<br \/>\n  function prev() { if (current &gt; 0) render(current &#8211; 1); }<\/p>\n<p>  function play() {<br \/>\n    playing = true;<br \/>\n    runBtn.textContent = &#8220;<img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png\" alt=\"\u23f8\" class=\"wp-smiley\" \/> Pause&#8221;;<br \/>\n    if (current &gt;= steps.length &#8211; 1) render(0); else next();<br \/>\n    playTimer = setInterval(function () {<br \/>\n      if (current &gt;= steps.length &#8211; 1) { stop(); return; }<br \/>\n      next();<br \/>\n    }, 1700);<br \/>\n  }<br \/>\n  function stop() {<br \/>\n    playing = false;<br \/>\n    runBtn.textContent = current &gt;= steps.length &#8211; 1 ? &#8220;\u21ba Replay&#8221; : &#8220;<img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/25b6.png\" alt=\"\u25b6\" class=\"wp-smiley\" \/> Run blume dev&#8221;;<br \/>\n    if (playTimer) { clearInterval(playTimer); playTimer = null; }<br \/>\n  }<\/p>\n<p>  runBtn.addEventListener(&#8220;click&#8221;, function () {<br \/>\n    if (playing) { stop(); }<br \/>\n    else { if (current &gt;= steps.length &#8211; 1) render(-1); play(); }<br \/>\n  });<br \/>\n  nextBtn.addEventListener(&#8220;click&#8221;, function () { stop(); next(); });<br \/>\n  prevBtn.addEventListener(&#8220;click&#8221;, function () { stop(); prev(); });<br \/>\n  resetBtn.addEventListener(&#8220;click&#8221;, function () { stop(); render(-1); });<\/p>\n<p>  aiToggle.addEventListener(&#8220;click&#8221;, function () {<br \/>\n    var on = aiToggle.classList.toggle(&#8220;on&#8221;);<br \/>\n    aiNodes.forEach(function (n) {<br \/>\n      n.style.opacity = on ? 1 : 0.18;<br \/>\n      var r = n.querySelector(&#8220;rect&#8221;);<br \/>\n      r.setAttribute(&#8220;stroke&#8221;, on ? &#8220;#7a4a1e&#8221; : &#8220;#33281f&#8221;);<br \/>\n    });<br \/>\n    aiBranches.forEach(function (b) {<br \/>\n      b.style.opacity = on ? 1 : 0.15;<br \/>\n      b.setAttribute(&#8220;stroke&#8221;, on ? &#8220;#7a4a1e&#8221; : &#8220;#33281f&#8221;);<br \/>\n    });<br \/>\n    reportHeight();<br \/>\n  });<\/p>\n<p>  \/\/ auto-resize for WordPress embed (component offsetHeight + buffer)<br \/>\n  function reportHeight() {<br \/>\n    try {<br \/>\n      var h = root.offsetHeight + 40;<br \/>\n      if (window.parent) {<br \/>\n        window.parent.postMessage({ type: &#8220;blume-explainer-height&#8221;, height: h }, &#8220;*&#8221;);<br \/>\n      }<br \/>\n    } catch (e) {}<br \/>\n  }<br \/>\n  window.addEventListener(&#8220;load&#8221;, reportHeight);<br \/>\n  window.addEventListener(&#8220;resize&#8221;, reportHeight);<\/p>\n<p>  render(-1);<br \/>\n})();<br \/>\n&lt;\/script&gt;<br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<br \/>\n&#8220;&gt;<\/p>\n<p class=\"wp-block-paragraph\">\n<h2 class=\"wp-block-heading\"><strong>Getting Started<\/strong><\/h2>\n<\/p><p class=\"wp-block-paragraph\">Setup takes a single command, so onboarding is short.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">npx blume init<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">Afterward, <code>blume dev<\/code> starts a hot-reloading server. Meanwhile, <code>blume build<\/code> writes static HTML and a local search index into <code>dist\/<\/code>. The config file is real TypeScript, validated by a schema.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">\/\/ blume.config.ts\nimport { defineConfig } from \"blume\";\n\nexport default defineConfig({\n  content: {\n    sources: [\n      { type: \"filesystem\", root: \"docs\" },\n      { type: \"notion\", database: process.env.NOTION_DB },\n    ],\n  },\n});<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">Because the config is typed, editors catch mistakes before a build runs. The CLI covers the full lifecycle beyond those basics:<\/p>\n<figure class=\"wp-block-table\">\n<table class=\"has-fixed-layout\">\n<thead>\n<tr>\n<th>Command<\/th>\n<th>Purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>blume init<\/code><\/td>\n<td>Scaffold a project, interactive by default<\/td>\n<\/tr>\n<tr>\n<td><code>blume dev<\/code><\/td>\n<td>Start the dev server with hot reload<\/td>\n<\/tr>\n<tr>\n<td><code>blume build<\/code><\/td>\n<td>Build the static or server site<\/td>\n<\/tr>\n<tr>\n<td><code>blume add<\/code><\/td>\n<td>Install a source component from the registry<\/td>\n<\/tr>\n<tr>\n<td><code>blume sync<\/code><\/td>\n<td>Re-fetch remote content sources<\/td>\n<\/tr>\n<tr>\n<td><code>blume eject<\/code><\/td>\n<td>Promote the runtime into a standalone Astro app<\/td>\n<\/tr>\n<tr>\n<td><code>blume validate<\/code><\/td>\n<td>Check internal, anchor, asset, and external links<\/td>\n<\/tr>\n<tr>\n<td><code>blume doctor<\/code><\/td>\n<td>Diagnose config and content problems<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2 class=\"wp-block-heading\"><strong>AI-Ready by Design<\/strong><\/h2>\n<p class=\"wp-block-paragraph\">Beyond human readers, Blume targets agents too. Every page returns raw Markdown when you append <code>.md<\/code> to its URL. A single flag emits <code>llms.txt<\/code> and <code>llms-full.txt<\/code> for agents. Each page can be copied as Markdown or opened in ChatGPT, Claude, or v0. An optional in-page Ask AI assistant answers reader questions directly. It runs on the AI SDK through the Vercel AI Gateway, OpenRouter, Inkeep, or any OpenAI-compatible endpoint. Blume can also host a Model Context Protocol (MCP) server. Through it, Claude Code, Cursor, and VS Code read docs directly.<\/p>\n<div class=\"dm-code-snippet dark dm-normal-version default no-background-mobile\">\n<div class=\"control-language\">\n<div class=\"dm-buttons\">\n<div class=\"dm-buttons-left\">\n<div class=\"dm-button-snippet red-button\"><\/div>\n<div class=\"dm-button-snippet orange-button\"><\/div>\n<div class=\"dm-button-snippet green-button\"><\/div>\n<\/div>\n<div class=\"dm-buttons-right\"><a><span class=\"dm-copy-text\">Copy Code<\/span><span class=\"dm-copy-confirmed\">Copied<\/span><span class=\"dm-error-message\">Use a different Browser<\/span><\/a><\/div>\n<\/div>\n<pre class=\"no-line-numbers\"><code class=\"no-wrap language-php\">claude mcp add --transport http your-docs https:\/\/docs.example.com\/mcp<\/code><\/pre>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">That server exposes four read-only tools: <code>search_docs<\/code>, <code>get_page<\/code>, <code>list_pages<\/code>, and <code>get_navigation<\/code>.<\/p>\n<h2 class=\"wp-block-heading\"><strong>Use Cases With Examples<\/strong><\/h2>\n<p class=\"wp-block-paragraph\">Those capabilities map to concrete jobs. For an API product, drop in an OpenAPI or AsyncAPI spec. Blume then renders an interactive reference with schemas, auth, and a request playground via Scalar. For a library, point Blume at your GitHub Releases. Each release rolls up into a generated changelog timeline with an RSS feed. For a global audience, add translated files per locale. Blume supports 36 locales, locale-aware routing, and right-to-left layouts. For mixed content, combine local files with remote MDX, Notion, or Sanity. All sources render through the same components. <\/p>\n<figure class=\"wp-block-embed is-type-rich is-provider-x wp-block-embed-x\">\n<div class=\"wp-block-embed__wrapper\">\n<div class=\"embed-x\">\n<blockquote class=\"twitter-tweet\" data-width=\"550\" data-dnt=\"true\">\n<p lang=\"en\" dir=\"ltr\">Introducing Blume <img decoding=\"async\" src=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/1fab7.png\" alt=\"\ud83e\udeb7\" class=\"wp-smiley\" \/><\/p>\n<p>A world-class docs framework for everything you ship. Drop Markdown into a folder and ship a full docs site with no app boilerplate.<\/p>\n<p>\u2192 zero-config setup<br \/>\u2192 automatic SEO and AEO<br \/>\u2192 30+ components<br \/>\u2192 powered by astro + vite<br \/>\u2192 open source, free forever <a href=\"https:\/\/t.co\/fQSwLd9BM9\">pic.twitter.com\/fQSwLd9BM9<\/a><\/p>\n<p>\u2014 Hayden Bleasel (@haydenbleasel) <a href=\"https:\/\/x.com\/haydenbleasel\/status\/2076714329404268576?ref_src=twsrc%5Etfw\">July 13, 2026<\/a><\/p><\/blockquote>\n<\/div>\n<\/div>\n<\/figure>\n<h2 class=\"wp-block-heading\"><strong>How Blume Compares<\/strong><\/h2>\n<p class=\"wp-block-paragraph\">For context, here is Blume against three common documentation approaches. Features change quickly, so verify current details before you adopt.<\/p>\n<figure class=\"wp-block-table\">\n<table class=\"has-fixed-layout\">\n<thead>\n<tr>\n<th>Dimension<\/th>\n<th>Blume<\/th>\n<th>Mintlify<\/th>\n<th>Docusaurus<\/th>\n<th>Astro Starlight<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Type<\/td>\n<td>Open-source CLI + framework<\/td>\n<td>Hosted commercial platform<\/td>\n<td>Open-source SSG<\/td>\n<td>Open-source Astro theme<\/td>\n<\/tr>\n<tr>\n<td>License<\/td>\n<td>MIT, free<\/td>\n<td>Proprietary; paid Pro tier<\/td>\n<td>MIT, free<\/td>\n<td>MIT, free<\/td>\n<\/tr>\n<tr>\n<td>Setup<\/td>\n<td>Zero-config Markdown folder<\/td>\n<td>Config-driven, managed<\/td>\n<td>Scaffold + React config<\/td>\n<td>Astro project + theme<\/td>\n<\/tr>\n<tr>\n<td>Engine<\/td>\n<td>Hidden Astro + Vite<\/td>\n<td>Proprietary hosted<\/td>\n<td>React<\/td>\n<td>Astro<\/td>\n<\/tr>\n<tr>\n<td>Core-theme client JS<\/td>\n<td>None (static HTML)<\/td>\n<td>\u2014<\/td>\n<td>React runtime<\/td>\n<td>Minimal (islands)<\/td>\n<\/tr>\n<tr>\n<td><code>llms.txt<\/code> \/ <code>llms-full.txt<\/code><\/td>\n<td>Built-in flag<\/td>\n<td>Auto-generated<\/td>\n<td>Community plugin<\/td>\n<td>Community plugin<\/td>\n<\/tr>\n<tr>\n<td>Built-in MCP server<\/td>\n<td>Yes (four read-only tools)<\/td>\n<td>Yes (auto-hosted)<\/td>\n<td>Not built-in<\/td>\n<td>Not built-in<\/td>\n<\/tr>\n<tr>\n<td>Eject path<\/td>\n<td>Standalone Astro app<\/td>\n<td>Not applicable (hosted)<\/td>\n<td>\u2014<\/td>\n<td>Already Astro<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<h2 class=\"wp-block-heading\"><strong>Strengths and Weaknesses<\/strong><\/h2>\n<h4 class=\"wp-block-heading\"><strong>Strengths<\/strong><\/h4>\n<ul class=\"wp-block-list\">\n<li>Zero-config start: a folder of Markdown becomes a full site.<\/li>\n<li>Static-first output ships no core client JS, aiding Core Web Vitals.<\/li>\n<li>Built-in AI surfaces: <code>llms.txt<\/code>, per-page Markdown, MCP server, and Ask AI.<\/li>\n<li>Type-safe config, so editors flag errors before a build runs.<\/li>\n<li>Eject path to a standalone Astro app reduces long-term lock-in.<\/li>\n<\/ul>\n<h4 class=\"wp-block-heading\"><strong>Weaknesses<\/strong><\/h4>\n<ul class=\"wp-block-list\">\n<li>Version 1.0.3 is new, so the ecosystem is still young.<\/li>\n<li>It needs Node.js 22.12 or newer, which some environments lack.<\/li>\n<li>Request-time features like Ask AI and MCP need a server adapter.<\/li>\n<li>The self-hosted model means you own analytics and assistant wiring.<\/li>\n<li>It has fewer third-party integrations than mature hosted platforms today.<\/li>\n<\/ul>\n<h2 class=\"wp-block-heading\"><strong>Key Takeaways<\/strong><\/h2>\n<ul class=\"wp-block-list\">\n<li>Blume turns a Markdown folder into a production docs site with zero config.<\/li>\n<li>It drives a hidden Astro and Vite project and can eject to standalone Astro.<\/li>\n<li>AI features ship built in: <code>llms.txt<\/code>, per-page Markdown, and an MCP server.<\/li>\n<li>It is MIT-licensed, needs Node.js 22.12+, and reached npm v1.0.3 on launch day.<\/li>\n<li>Early adopters include Quiver, moving from Mintlify, and Neon\u2019s add-mcp docs.<\/li>\n<\/ul>\n<p class=\"wp-block-paragraph\">\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n<\/p><p class=\"wp-block-paragraph\">\n<\/p><p class=\"wp-block-paragraph\">Check out the\u00a0<strong><a href=\"https:\/\/github.com\/haydenbleasel\/blume\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub Repo<\/a>.\u00a0<\/strong>Also,\u00a0feel free to follow us on\u00a0<strong><a href=\"https:\/\/x.com\/intent\/follow?screen_name=marktechpost\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Twitter<\/mark><\/a><\/strong>\u00a0and don\u2019t forget to join our\u00a0<strong><a href=\"https:\/\/www.reddit.com\/r\/machinelearningnews\/\" target=\"_blank\" rel=\"noreferrer noopener\">150k+ML SubReddit<\/a><\/strong>\u00a0and Subscribe to\u00a0<strong><a href=\"https:\/\/www.aidevsignals.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">our Newsletter<\/a><\/strong>. Wait! are you on telegram?\u00a0<strong><a href=\"https:\/\/t.me\/machinelearningresearchnews\" target=\"_blank\" rel=\"noreferrer noopener\">now you can join us on telegram as well.<\/a><\/strong><\/p>\n<p class=\"wp-block-paragraph\">Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.?\u00a0<strong><a href=\"https:\/\/forms.gle\/wbash1wF6efRj8G58\" target=\"_blank\" rel=\"noreferrer noopener\"><mark>Connect with us<\/mark><\/a><\/strong><\/p>\n<p>The post <a href=\"https:\/\/www.marktechpost.com\/2026\/07\/14\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/\">Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder<\/a> appeared first on <a href=\"https:\/\/www.marktechpost.com\/\">MarkTechPost<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Hayden Bleasel, an expert developer from OpenAI, released Blume, an open-source documentation framework. Blume shipped to npm as version 1.0.3 the same day. It is as simple as Drop Markdown into a folder and ship a docs site. No app boilerplate is written or maintained afterward. The project is MIT-licensed and open sourced. What is Blume? Blume is a command-line tool paired with a component library for docs. It reads a folder of Markdown or MDX files. From that folder, it produces a production-grade documentation site. That output ships navigation, search, theming, and Open Graph images. Configuration stays optional and is added one file at a time. The code is a TypeScript monorepo; the published package sits at packages\/blume. Blume\u2019s own documentation, under apps\/docs, is built with Blume itself. It requires Node.js 22.12 or newer. It runs with Bun, pnpm, npm, or yarn. How Blume Works? Under the surface, Blume generates and drives a hidden Astro project. First, the CLI loads blume.config.ts and scans your content into a graph. Next, it writes an Astro project into a .blume\/ directory. Astro then renders every page through a single catch-all route. That route imports Blume\u2019s shipped components, the generated data, and your overrides. On each run, .blume\/ regenerates, and only changed files are rewritten. As a result, hot reload stays fast during editing. The core theme ships no client framework JavaScript. Consequently, pages score well on Core Web Vitals by default. When you need full control, blume eject promotes the runtime into a standalone Astro app. That ejected project still depends on the blume package. Run blume dev&lt;\/button&gt; &lt;button id=&#8221;prevBtn&#8221; disabled&gt;\u2039 Prev&lt;\/button&gt; &lt;button id=&#8221;nextBtn&#8221;&gt;Next \u203a&lt;\/button&gt; &lt;button id=&#8221;resetBtn&#8221;&gt;\u21ba Reset&lt;\/button&gt; &lt;div class=&#8221;spacer&#8221;&gt;&lt;\/div&gt; &lt;label class=&#8221;toggle on&#8221; id=&#8221;aiToggle&#8221;&gt;&lt;span class=&#8221;dot&#8221;&gt;&lt;\/span&gt; Show AI outputs&lt;\/label&gt; &lt;\/div&gt; &lt;div class=&#8221;foot&#8221;&gt; &lt;span&gt;Blume v1.0.3 \u00b7 MIT \u00b7 Node.js 22.12+ \u00b7 Astro + Vite&lt;\/span&gt; &lt;span&gt;Interactive explainer by &lt;a class=&#8221;mtp&#8221; href=&#8221;https:\/\/www.marktechpost.com&#8221; target=&#8221;_blank&#8221; rel=&#8221;noopener&#8221;&gt;Marktechpost&lt;\/a&gt;&lt;\/span&gt; &lt;\/div&gt; &lt;\/div&gt; &lt;script&gt; (function () { var root = document.getElementById(&#8220;blume-explainer&#8221;); var token = root.querySelector(&#8220;#token&#8221;); var nodes = root.querySelectorAll(&#8220;.node[data-stage]&#8221;); var aiNodes = root.querySelectorAll(&#8220;.ai-node&#8221;); var aiBranches = root.querySelectorAll(&#8220;.ai-branch&#8221;); var stepLabel = root.querySelector(&#8220;#stepLabel&#8221;); var stepTitle = root.querySelector(&#8220;#stepTitle&#8221;); var stepText = root.querySelector(&#8220;#stepText&#8221;); var termText = root.querySelector(&#8220;#termText&#8221;); var runBtn = root.querySelector(&#8220;#runBtn&#8221;); var prevBtn = root.querySelector(&#8220;#prevBtn&#8221;); var nextBtn = root.querySelector(&#8220;#nextBtn&#8221;); var resetBtn = root.querySelector(&#8220;#resetBtn&#8221;); var aiToggle = root.querySelector(&#8220;#aiToggle&#8221;); \/\/ token positions per stage (cx, cy) var pos = [ [85, 90], [250, 90], [470, 90], [700, 70], [700, 163], [842, 90] ]; var steps = [ { label: &#8220;Stage 1 \/ 6&#8221;, title: &#8220;A folder of Markdown&#8221;, term: &#8220;docs\/ index.mdx guide.mdx api.mdx&#8221;, text: &#8220;You start with .md or .mdx files in a folder. There is no starter to clone and no app boilerplate to maintain.&#8221; }, { label: &#8220;Stage 2 \/ 6&#8221;, title: &#8220;The CLI loads your config&#8221;, term: &#8220;blume dev \u2713 loaded blume.config.ts&#8221;, text: &#8220;blume dev loads blume.config.ts. It reads your content sources, theme tokens, and options, all type-checked by a schema.&#8221; }, { label: &#8220;Stage 3 \/ 6&#8221;, title: &#8220;Content is scanned into a graph&#8221;, term: &#8220;scanning content \u2026 \u2713 3 pages, nav inferred&#8221;, text: &#8220;Blume scans every page into a content graph. Navigation is inferred from your files, so you rarely hand-write it.&#8221; }, { label: &#8220;Stage 4 \/ 6&#8221;, title: &#8220;A hidden Astro project is generated&#8221;, term: &#8220;writing .blume\/ \u2713 only changed files&#8221;, text: &#8220;Blume writes a hidden Astro project into .blume\/. It regenerates each run, rewriting only changed files, so hot reload stays fast.&#8221; }, { label: &#8220;Stage 5 \/ 6&#8221;, title: &#8220;Astro + Vite render the pages&#8221;, term: &#8220;rendering via catch-all route \u2713&#8221;, text: &#8220;Astro renders every page through one catch-all route. It imports Blume&#8217;s components, the generated data, and any overrides you add.&#8221; }, { label: &#8220;Stage 6 \/ 6&#8221;, title: &#8220;Static HTML ships to dist\/&#8221;, term: &#8220;blume build \u2713 dist\/ + search index&#8221;, text: &#8220;The build outputs static HTML and a local search index into dist\/. The core theme ships no client framework JS, helping Core Web Vitals.&#8221; } ]; var current = -1; var playing = false; var playTimer = null; function paintNodes(active) { nodes.forEach(function (n) { var s = parseInt(n.getAttribute(&#8220;data-stage&#8221;), 10); var rect = n.querySelector(&#8220;rect&#8221;); if (s === active) { rect.setAttribute(&#8220;stroke&#8221;, &#8220;#ff7000&#8221;); rect.setAttribute(&#8220;stroke-width&#8221;, &#8220;2.5&#8221;); rect.setAttribute(&#8220;fill&#8221;, &#8220;#241108&#8221;); } else if (s &lt; active) { rect.setAttribute(&#8220;stroke&#8221;, &#8220;#7a4a1e&#8221;); rect.setAttribute(&#8220;stroke-width&#8221;, &#8220;1.5&#8221;); rect.setAttribute(&#8220;fill&#8221;, &#8220;#1a120b&#8221;); } else { rect.setAttribute(&#8220;stroke&#8221;, &#8220;#33281f&#8221;); rect.setAttribute(&#8220;stroke-width&#8221;, &#8220;1.5&#8221;); rect.setAttribute(&#8220;fill&#8221;, &#8220;#17120e&#8221;); } }); } function moveToken(i) { if (i &lt; 0) { token.style.opacity = 0; return; } token.style.opacity = 1; token.style.transition = &#8220;cx .55s cubic-bezier(.4,0,.2,1), cy .55s cubic-bezier(.4,0,.2,1)&#8221;; token.setAttribute(&#8220;cx&#8221;, pos[i][0]); token.setAttribute(&#8220;cy&#8221;, pos[i][1]); } function render(i) { current = i; if (i &lt; 0) { stepLabel.textContent = &#8220;Ready&#8221;; stepTitle.textContent = &#8220;Press Run to watch the build&#8221;; stepText.textContent = &#8220;Blume needs only a folder of Markdown. Everything below is generated for you and thrown away on each run, unless you eject.&#8221;; termText.textContent = &#8220;npx blume init&#8221;; paintNodes(-1); moveToken(-1); } else { var s = steps[i]; stepLabel.textContent = s.label; stepTitle.textContent = s.title; stepText.textContent = s.text; termText.textContent = s.term; paintNodes(i); moveToken(i); } prevBtn.disabled = (i &lt;= 0); nextBtn.disabled = (i &gt;= steps.length &#8211; 1); reportHeight(); } function next() { if (current &lt; steps.length &#8211; 1) render(current + 1); } function prev() { if (current &gt; 0) render(current &#8211; 1); } function play() { playing = true; runBtn.textContent = &#8220; Pause&#8221;; if (current &gt;= steps.length &#8211; 1) render(0); else next(); playTimer = setInterval(function () { if (current &gt;= steps.length &#8211; 1) { stop(); return; } next(); }, 1700); } function stop() { playing = false; runBtn.textContent = current &gt;= steps.length &#8211; 1 ? &#8220;\u21ba Replay&#8221; : &#8220; Run blume dev&#8221;; if (playTimer) { clearInterval(playTimer); playTimer = null; } } runBtn.addEventListener(&#8220;click&#8221;, function () { if (playing) { stop(); } else { if (current &gt;= steps.length &#8211; 1) render(-1); play(); } }); nextBtn.addEventListener(&#8220;click&#8221;, function () { stop(); next(); }); prevBtn.addEventListener(&#8220;click&#8221;, function () { stop(); prev(); }); resetBtn.addEventListener(&#8220;click&#8221;, function () { stop(); render(-1); }); aiToggle.addEventListener(&#8220;click&#8221;, function () { var on = aiToggle.classList.toggle(&#8220;on&#8221;); aiNodes.forEach(function (n) { n.style.opacity = on ? 1 : 0.18; var r = n.querySelector(&#8220;rect&#8221;); r.setAttribute(&#8220;stroke&#8221;, on ? &#8220;#7a4a1e&#8221; : &#8220;#33281f&#8221;); }); aiBranches.forEach(function (b) { b.style.opacity =<\/p>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_pvb_checkbox_block_on_post":false,"footnotes":""},"categories":[52,5,7,1],"tags":[],"class_list":["post-104201","post","type-post","status-publish","format-standard","hentry","category-ai-club","category-committee","category-news","category-uncategorized","pmpro-has-access"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder - YouZum<\/title>\n<meta name=\"description\" content=\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/youzum.net\/fr\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder - YouZum\" \/>\n<meta property=\"og:description\" content=\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\" \/>\n<meta property=\"og:url\" content=\"https:\/\/youzum.net\/fr\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/\" \/>\n<meta property=\"og:site_name\" content=\"YouZum\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DroneAssociationTH\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-14T19:20:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png\" \/>\n<meta name=\"author\" content=\"admin NU\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin NU\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/\"},\"author\":{\"name\":\"admin NU\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c\"},\"headline\":\"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder\",\"datePublished\":\"2026-07-14T19:20:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/\"},\"wordCount\":1822,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"image\":{\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png\",\"articleSection\":[\"AI\",\"Committee\",\"News\",\"Uncategorized\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/\",\"url\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/\",\"name\":\"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder - YouZum\",\"isPartOf\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png\",\"datePublished\":\"2026-07-14T19:20:21+00:00\",\"description\":\"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19\",\"breadcrumb\":{\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#primaryimage\",\"url\":\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png\",\"contentUrl\":\"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/youzum.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/yousum.gpucore.co\/#website\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"name\":\"YouSum\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/yousum.gpucore.co\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\",\"name\":\"Drone Association Thailand\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"width\":300,\"height\":300,\"caption\":\"Drone Association Thailand\"},\"image\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/DroneAssociationTH\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c\",\"name\":\"admin NU\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png\",\"caption\":\"admin NU\"},\"url\":\"https:\/\/youzum.net\/fr\/members\/adminnu\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder - YouZum","description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/youzum.net\/fr\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/","og_locale":"fr_FR","og_type":"article","og_title":"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder - YouZum","og_description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","og_url":"https:\/\/youzum.net\/fr\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/","og_site_name":"YouZum","article_publisher":"https:\/\/www.facebook.com\/DroneAssociationTH\/","article_published_time":"2026-07-14T19:20:21+00:00","og_image":[{"url":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png","type":"","width":"","height":""}],"author":"admin NU","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"admin NU","Dur\u00e9e de lecture estim\u00e9e":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#article","isPartOf":{"@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/"},"author":{"name":"admin NU","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c"},"headline":"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder","datePublished":"2026-07-14T19:20:21+00:00","mainEntityOfPage":{"@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/"},"wordCount":1822,"commentCount":0,"publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"image":{"@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#primaryimage"},"thumbnailUrl":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png","articleSection":["AI","Committee","News","Uncategorized"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/","url":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/","name":"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder - YouZum","isPartOf":{"@id":"https:\/\/yousum.gpucore.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#primaryimage"},"image":{"@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#primaryimage"},"thumbnailUrl":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png","datePublished":"2026-07-14T19:20:21+00:00","description":"\u0e01\u0e34\u0e08\u0e01\u0e23\u0e23\u0e21\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a\u0e42\u0e14\u0e23\u0e19","breadcrumb":{"@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#primaryimage","url":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png","contentUrl":"https:\/\/s.w.org\/images\/core\/emoji\/17.0.2\/72x72\/23f8.png"},{"@type":"BreadcrumbList","@id":"https:\/\/youzum.net\/meet-blume-an-open-source-zero-config-documentation-framework-that-ships-ai-ready-docs-from-a-markdown-folder\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/youzum.net\/"},{"@type":"ListItem","position":2,"name":"Meet Blume: An Open-Source, Zero-Config Documentation Framework That Ships AI-Ready Docs From a Markdown Folder"}]},{"@type":"WebSite","@id":"https:\/\/yousum.gpucore.co\/#website","url":"https:\/\/yousum.gpucore.co\/","name":"YouSum","description":"","publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/yousum.gpucore.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/yousum.gpucore.co\/#organization","name":"Drone Association Thailand","url":"https:\/\/yousum.gpucore.co\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","width":300,"height":300,"caption":"Drone Association Thailand"},"image":{"@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DroneAssociationTH\/"]},{"@type":"Person","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/97fa48242daf3908e4d9a5f26f4a059c","name":"admin NU","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/person\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/avatars\/2\/1746849356-bpfull.png","caption":"admin NU"},"url":"https:\/\/youzum.net\/fr\/members\/adminnu\/"}]}},"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"admin NU","author_link":"https:\/\/youzum.net\/fr\/members\/adminnu\/"},"rttpg_comment":0,"rttpg_category":"<a href=\"https:\/\/youzum.net\/fr\/category\/ai-club\/\" rel=\"category tag\">AI<\/a> <a href=\"https:\/\/youzum.net\/fr\/category\/committee\/\" rel=\"category tag\">Committee<\/a> <a href=\"https:\/\/youzum.net\/fr\/category\/news\/\" rel=\"category tag\">News<\/a> <a href=\"https:\/\/youzum.net\/fr\/category\/uncategorized\/\" rel=\"category tag\">Uncategorized<\/a>","rttpg_excerpt":"Hayden Bleasel, an expert developer from OpenAI, released Blume, an open-source documentation framework. Blume shipped to npm as version 1.0.3 the same day. It is as simple as Drop Markdown into a folder and ship a docs site. No app boilerplate is written or maintained afterward. The project is MIT-licensed and open sourced. What is\u2026","_links":{"self":[{"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/posts\/104201","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/comments?post=104201"}],"version-history":[{"count":0,"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/posts\/104201\/revisions"}],"wp:attachment":[{"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/media?parent=104201"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/categories?post=104201"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/youzum.net\/fr\/wp-json\/wp\/v2\/tags?post=104201"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}