<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ola Rubaj</title>
    <description>The latest articles on Forem by Ola Rubaj (@olayway).</description>
    <link>https://forem.com/olayway</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F947945%2F1b38b19a-3c4a-4dab-aba9-8e87ca115150.jpeg</url>
      <title>Forem: Ola Rubaj</title>
      <link>https://forem.com/olayway</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/olayway"/>
    <language>en</language>
    <item>
      <title>Publishing Markdown shouldn’t be a side project</title>
      <dc:creator>Ola Rubaj</dc:creator>
      <pubDate>Mon, 19 Jan 2026 18:20:59 +0000</pubDate>
      <link>https://forem.com/flowershow/publishing-markdown-shouldnt-be-a-side-project-33ei</link>
      <guid>https://forem.com/flowershow/publishing-markdown-shouldnt-be-a-side-project-33ei</guid>
      <description>&lt;p&gt;A while back we shared a Next.js template - &lt;strong&gt;Flowershow&lt;/strong&gt; - for &lt;strong&gt;turning Markdown into a website&lt;/strong&gt;. It worked well—but it also came with the usual costs: setup, configuration, deployment, and ongoing maintenance.&lt;/p&gt;

&lt;p&gt;So we built a &lt;strong&gt;new version&lt;/strong&gt; of Flowershow: an &lt;strong&gt;open-source&lt;/strong&gt;, &lt;strong&gt;fully hosted&lt;/strong&gt; platform for publishing Markdown as a real website.&lt;/p&gt;

&lt;p&gt;The focus is simple: write in Markdown, publish, and move on.&lt;/p&gt;

&lt;p&gt;With hosted Flowershow you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Publish docs, notes, blogs, or small product sites in minutes&lt;/li&gt;
&lt;li&gt;Use your own domain and customize the look without touching code&lt;/li&gt;
&lt;li&gt;Get built-in features like full-text search and comments out of the box&lt;/li&gt;
&lt;li&gt;Skip servers, CI pipelines, Docker, and framework decisions entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works well for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;project documentation&lt;/li&gt;
&lt;li&gt;indie product websites&lt;/li&gt;
&lt;li&gt;“learning in public” blogs&lt;/li&gt;
&lt;li&gt;internal or public knowledge bases / wikis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anywhere Markdown already fits, but hosting feels like unnecessary overhead.&lt;/p&gt;

&lt;p&gt;If you enjoy writing in Markdown but don’t want publishing to become another thing to maintain, this might be useful:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://flowershow.app" rel="noopener noreferrer"&gt;https://flowershow.app&lt;/a&gt;&lt;br&gt;
👀 &lt;a href="https://github.com/flowershow/flowershow" rel="noopener noreferrer"&gt;https://github.com/flowershow/flowershow&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We’re building this in the open and will share updates as it evolves.&lt;br&gt;
Feedback, ideas, and rough edges are very welcome. 💐&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>documentation</category>
      <category>devtools</category>
    </item>
    <item>
      <title>MarkdownDB: A rich SQL API to your markdown files in seconds.</title>
      <dc:creator>Ola Rubaj</dc:creator>
      <pubDate>Thu, 12 Oct 2023 14:24:13 +0000</pubDate>
      <link>https://forem.com/datopian/markdowndb-a-rich-sql-api-to-your-markdown-files-in-seconds-8k8</link>
      <guid>https://forem.com/datopian/markdowndb-a-rich-sql-api-to-your-markdown-files-in-seconds-8k8</guid>
      <description>&lt;p&gt;Hello, dear readers!&lt;/p&gt;

&lt;p&gt;We're excited to announce the official launch of MarkdownDB, an open-source library to transform markdown content into sql-queryable data. Get a rich SQL API to your markdown files in seconds and build rich markdown-powered sites easily and reliably.&lt;/p&gt;

&lt;p&gt;We've also created a new dedicated website: &lt;a href="https://markdowndb.com/"&gt;https://markdowndb.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 What is MarkdownDB?
&lt;/h2&gt;

&lt;p&gt;MarkdownDB transforms your Markdown content into a queryable, lightweight SQLite database. Imagine being able to treat your collection of markdown files like entries in a database! Ever thought about fetching documents with specific tags or created in the past week? Or, say, pulling up all tasks across documents marked with the "⏭️" emoji? With MarkdownDB, all of this (and more) is not just possible, but a breeze.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rich metadata extracted including frontmatter, links, and more.&lt;/li&gt;
&lt;li&gt;Lightweight and fast indexing 1000s of files in seconds.&lt;/li&gt;
&lt;li&gt;Open source and extensible via plugin system.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 How it works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  You have a folder of markdown content
&lt;/h3&gt;

&lt;p&gt;For example, your blog posts. Each file can have a YAML frontmatter header with metadata like title, date, tags, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;first&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;blog&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;post"&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2021-01-01&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;John Doe&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# My first blog post&lt;/span&gt;

This is my first blog post.
I'm using MarkdownDB to manage my blog posts.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Index the files with MarkdownDB
&lt;/h3&gt;

&lt;p&gt;Use the npm &lt;code&gt;mddb&lt;/code&gt; package to index Markdown files into an SQLite database. This will create a &lt;code&gt;markdown.db&lt;/code&gt; file in the current directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# npx mddb &amp;lt;path-to-folder-with-your-md-files&amp;gt;&lt;/span&gt;
npx mddb ./blog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Query your files with SQL...
&lt;/h3&gt;

&lt;p&gt;E.g. get all the files with with tag &lt;code&gt;a&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;
&lt;span class="k"&gt;INNER&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;file_tags&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file_tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;file_tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'a'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ...or using MarkdownDB Node.js API in a framework of your choice!
&lt;/h3&gt;

&lt;p&gt;Use our Node API to query your data for your blog, wiki, docs, digital garden, or anything you want!&lt;/p&gt;

&lt;p&gt;E.g. here is an example of a Next.js page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// @/pages/blog/index.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;clientPromise&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@/lib/mddb.mjs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Blog&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;blogs&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Blog&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blogs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url_path&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/a&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="p"&gt;))}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ul&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getStaticProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mddb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;clientPromise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="c1"&gt;// get all files that are not marked as draft in the frontmatter&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blogFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mddb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getFiles&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;frontmatter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blogsList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;blogFiles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url_path&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;url_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}));&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;blogs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blogsList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the imported library with MarkdownDB database connection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// @/lib/mddb.mjs&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MarkdownDB&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mddb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;markdown.db&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;MarkdownDB&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sqlite3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;dbPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;clientPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;clientPromise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build your blog, wiki, docs, digital garden, or anything you want
&lt;/h3&gt;

&lt;p&gt;And share it with the world!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ysfP7znO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vbdnjq2ml06bqmspo2nt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ysfP7znO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vbdnjq2ml06bqmspo2nt.png" alt="MarkdownDB blog example" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://markdowndb.com/blog/basic-tutorial"&gt;Read the full tutorial&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Find out more on our new official website: &lt;a href="https://markdowndb.com/"&gt;https://markdowndb.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check out the source on GitHub: &lt;a href="https://github.com/datopian/markdowndb"&gt;https://github.com/datopian/markdowndb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;— Ola Rubaj, Developer at Datopian&lt;/p&gt;

</description>
      <category>markdown</category>
      <category>database</category>
      <category>nextjs</category>
      <category>contentlayer</category>
    </item>
    <item>
      <title>Publish your digital garden with Flowershow 🌷</title>
      <dc:creator>Ola Rubaj</dc:creator>
      <pubDate>Mon, 07 Nov 2022 00:51:12 +0000</pubDate>
      <link>https://forem.com/flowershow/publish-your-obsidian-vault-with-flowershow-48ip</link>
      <guid>https://forem.com/flowershow/publish-your-obsidian-vault-with-flowershow-48ip</guid>
      <description>&lt;h2&gt;
  
  
  What is Flowershow?
&lt;/h2&gt;

&lt;p&gt;Flowershow 🌷 is a &lt;strong&gt;free&lt;/strong&gt; and &lt;strong&gt;open-source&lt;/strong&gt; tool for easily converting your markdown files into an elegant website. It's built on a standard, modern web stack – &lt;strong&gt;React, Next.js, and Tailwind&lt;/strong&gt; and shipped with a basic default theme to get you started with just a few clicks🖱️.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://flowershow.app/"&gt;https://flowershow.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Following the steps below, or using our &lt;a href="https://flowershow.app/docs/publish-tutorial"&gt;tutorial&lt;/a&gt;, you can turn your markdown notes into an elegant website and tailor it to your needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Prepare the content
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;🚧 Flowershow CLI is not yet supported on Windows&lt;br&gt;
❕ Make sure you have &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; installed&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First, you'll need a folder with some markdown files you'd like to publish. You can use an existing one, e.g. your Obsidian vault. This folder should include at least a single &lt;code&gt;index.md&lt;/code&gt; file at the root level, which will be used to generate the home page of your website. If it doesn't exist, Flowershow CLI will create it for you.&lt;/p&gt;

&lt;p&gt;To create this folder from scratch, you can do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-digital-garden
&lt;span class="nb"&gt;cd &lt;/span&gt;my-digital-garden
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Hello, world!'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; index.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can create as many subfolders within your content folder as you want. Its directory tree will be reflected in URL paths on the published website, e.g.: &lt;code&gt;my-digital-garden/blog/hello.md&lt;/code&gt; file content will be available under &lt;code&gt;&amp;lt;base-url-of-your-published-website&amp;gt;/blog/hello&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each folder can have its own &lt;code&gt;index.md&lt;/code&gt; file, which will be available under its parent directory path, e.g. &lt;code&gt;my-content/blog/index.md&lt;/code&gt; will be available under &lt;code&gt;&amp;lt;base-url-of-your-published-website&amp;gt;/blog&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In order to embed files (e.g. images or pdfs) in your markdown files, you will also need to create a dedicated folder for them in your digital garden directory.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're an Obsidian user, you can set this folder as an attachments folder, by right-clicking on it in the sidebar on the left hand side. This way all embedded files will be saved to this folder automatically when you copy them to your notes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can create this folder by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-digital-garden/assets &lt;span class="c"&gt;#this can be any other name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If you don't use git version control system to track changes in your digital garden yet, we recommend setting it up. Check &lt;a href="https://docs.github.com/en/get-started/quickstart"&gt;GitHub quickstart&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Install Flowershow template
&lt;/h2&gt;

&lt;p&gt;In order to build your beautiful personal website out of your digital garden, you first need to install Flowershow template. This template will be linked to your digital garden after the installation process.&lt;/p&gt;

&lt;p&gt;So, let's imagine you have the following folder structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;some-parent-dir
├── my-digital-garden
│   ├── assets
│   └── index.md
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to install Flowershow in &lt;code&gt;some-parents-dir&lt;/code&gt; you can either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;go to that directory and run &lt;code&gt;npx flowershow@latest install&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;some-parent-dir
npx flowershow@latest &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll be asked to confirm if you want to install it in the current directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Create Flowershow project in current directory? Yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;...or you can pass this directory as an argument to the install command.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx flowershow@latest &lt;span class="nb"&gt;install &lt;/span&gt;some-parent-dir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running the install command you'll be shown a set of prompts, that will allow you to properly set up Flowershow with your digital garden.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;? Path to the folder with your content files
my-digital-garden

? Select a folder with your assets (attachments) (Use arrow keys)
❯ assets
  ──────────────
  I don't need assets folder
  Cancel

🌷 Installing Flowershow template in /home/me/some-parent-dir/.flowershow
⏳ Installing Flowershow dependencies...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the end you should see &lt;code&gt;.flowershow&lt;/code&gt; folder created in the target directory. In our example the folder structure will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;some-parent-dir
├── my-digital-garden
│   ├── assets
│   ├── config.js
│   └── index.md
├── .flowershow
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that &lt;code&gt;config.js&lt;/code&gt; and &lt;code&gt;index.md&lt;/code&gt; files will be created automatically if they didn't exist in your digital garden folder yet. The config file will allow you to do some basic configurations of your Flowershow app.&lt;/p&gt;

&lt;h2&gt;
  
  
  (Optional) customize your website
&lt;/h2&gt;

&lt;p&gt;You can now customize your website by wrapping your content in custom layouts, using custom components in you Markdown files, importing data from files and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build your website
&lt;/h2&gt;

&lt;p&gt;You can preview your website locally by running the following command in the directory where &lt;code&gt;.flowershow&lt;/code&gt; has been installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx flowershow preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...or by passing this directory as a command argument:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx flowershow preview some-parent-dir
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After running this command, you will now be able to see your website on &lt;a href="http://localhost:3000/"&gt;http://localhost:3000/&lt;/a&gt; - it will reload every time you make some changes to your content.&lt;/p&gt;

&lt;p&gt;If you're ready to publish your site, you can now build it with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx flowershow build-static
&lt;span class="c"&gt;# or npx flowershow build-static some-parent-dir&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will create a &lt;code&gt;.flowershow/out&lt;/code&gt; folder with all the resulting static files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback🙏
&lt;/h2&gt;

&lt;p&gt;Please take it for a spin and let us know your feedback in the &lt;a href="https://github.com/flowershow/flowershow/discussions"&gt;github discussion&lt;/a&gt; thread or our new &lt;a href="https://discord.gg/vQ5Y2uUzt6"&gt;discord chat&lt;/a&gt; forum.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
