<?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>DEV Community: Malek Shawahneh</title>
    <description>The latest articles on DEV Community by Malek Shawahneh (@malek_shw).</description>
    <link>https://dev.to/malek_shw</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%2F3309531%2F22968652-76ff-402e-84c6-1ad1cee2d0f8.jpg</url>
      <title>DEV Community: Malek Shawahneh</title>
      <link>https://dev.to/malek_shw</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/malek_shw"/>
    <language>en</language>
    <item>
      <title>How I Built a Fully-Custom Blog with MDX and Next.js</title>
      <dc:creator>Malek Shawahneh</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:33:57 +0000</pubDate>
      <link>https://dev.to/malek_shw/how-i-built-a-fully-custom-blog-with-mdx-and-nextjs-35kk</link>
      <guid>https://dev.to/malek_shw/how-i-built-a-fully-custom-blog-with-mdx-and-nextjs-35kk</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This project is closed source, but you can find the blog at &lt;a href="https://malekd5.com/articles" rel="noopener noreferrer"&gt;https://malekd5.com/articles&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I always wanted to build my own blog and start posting things I find interesting. However, I kept delaying this task for so long that I ended up not doing it. I finally decided to give it a try and I'm happy to say that it's been a great experience (to some degree).&lt;/p&gt;

&lt;p&gt;When building this blog, I only had one thing in mind: I wanted a &lt;strong&gt;markdown&lt;/strong&gt; style blog. In this post, I will go over the journey and the challenges I faced along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;A Little Back Story..&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Posting my thoughts and ideas on the internet was something I wanted to do: things I learned, topics that interests me, learned lessons, educational content, goofy random shit I did.. you get the idea. But, I've told myself if I ever was going to do that, I wanted to publish it in my own blog.&lt;/p&gt;

&lt;p&gt;Why you must ask? Current platforms are highly limited in terms of customization and features, other platforms might require a subscription to access certain features (or to even read an article...)&lt;/p&gt;

&lt;p&gt;If I wanted to publish my thoughts, I want to publish it in a way that I can easily control how the content is delivered to the reader. I want to be able to customize the design, the layout, the font, the color scheme, etc..&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Day Job&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I've also recently graduated from college and was lucky to get hired right out of college. I've been working for a few months now and it took some adjusting for the demanding nature of my role, especially after my probation period ended and the requirement of understanding highly complex parts of the system. &lt;/p&gt;

&lt;p&gt;So this pushed the blog idea even more to the back of my mind as I couldn't really focus on anything other than the job. Now, after understanding my role and becoming more comfortable with my job, and being able to deal with the stress and pressure better than before, all of this allowed me to come back to the unfinished ideas, though I'm starting simple, which is creating my own blog (that can't be that hard, right?). &lt;/p&gt;

&lt;p&gt;Additionally, There are a lot of cool things I did in my job that I want to share with you, but I'm not going to do that now.&lt;/p&gt;

&lt;p&gt;I still haven't reached the level of 'customization' yet with this application. I had a lot of ideas but because I kept delaying building this app for so long, I lost sight of what I wanted to do with it. After building a simple version, I can finally focus on regaining my vision of what this should look like.&lt;/p&gt;

&lt;p&gt;Transitioning from being a student to a full-time job needs it own post, but I'll leave that to another day.&lt;/p&gt;

&lt;p&gt;Now, let us get a bit technical.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Tech Stack&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri1274d6v8xxjd0tjlwc.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fri1274d6v8xxjd0tjlwc.webp" alt="Image" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This blog application is a part of a &lt;strong&gt;monorepo&lt;/strong&gt; that is currently hosting both the portfolio and the blog (too much I know). This website is written in &lt;a href="https://nextjs.org" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; and uses &lt;a href="https://mdxjs.com" rel="noopener noreferrer"&gt;MDX&lt;/a&gt; for the blog posts. The blog posts are written in &lt;strong&gt;markdown&lt;/strong&gt; and compiled to React components using &lt;a href="https://remark.js.org" rel="noopener noreferrer"&gt;remark&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;for styling I used &lt;a href="https://tailwindcss.com" rel="noopener noreferrer"&gt;Tailwind CSS&lt;/a&gt; and &lt;a href="https://github.com/tailwindlabs/tailwindcss-typography" rel="noopener noreferrer"&gt;@tailwindcss/typography&lt;/a&gt; plugin to style things like headings, paragraphs, lists, etc..&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mdxjs.com" rel="noopener noreferrer"&gt;MDX&lt;/a&gt; is the most critical part of this entire system so without it this would've required a lot of work to get this blog up and running. So, much appreciation for the hard work of the people behind this beautiful piece of wonder.&lt;/p&gt;

&lt;p&gt;Finally, I used &lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt; to deploy this website.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Database&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I &lt;strong&gt;DID NOT&lt;/strong&gt; use a database to store information about the blog posts (&lt;strong&gt;Definetly not because I didn't want to pay for it&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Some would argue that I should've used &lt;strong&gt;sqlite&lt;/strong&gt; or a free database but honestly I did not want to overcomplicate this project because I wanted to get this project out of &lt;strong&gt;'wishlist'&lt;/strong&gt;  bucket.&lt;/p&gt;

&lt;p&gt;SOO... I used a much simpler system to store information about the blog posts, which is a custom script that loops over the mdx files and collects necessary info (extracted by &lt;a href="https://github.com/jonschlinkert/gray-matter" rel="noopener noreferrer"&gt;gray-matter&lt;/a&gt;) into an object. This object is then saved to a typescript file that is used by the application to render the blog post information like title, date, etc..&lt;/p&gt;

&lt;p&gt;The main rational behind this is that I did not want my app to do any sort of heavy processing (like reading files) in runtime, so I I moved all of this processing to compile time because the data doesn't really change until the next time I build the app. so it made sense to do it that way.&lt;/p&gt;

&lt;p&gt;Here is a small snippet of the JSON object that is generated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// THIS FILES IS AUTO GENERATED BY compile-mdx-data SCRIPT, DO NOT EDIT&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;blogPostsObject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;BlogPost&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mdx-nextjs-blog-setup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My MDX + Next.js Blog Setup&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tags&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;nextjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mdx&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tailwind&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;date&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2025-11-21&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;readingTime&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5 min&lt;/span&gt;&lt;span class="dl"&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;This script always runs before the build script.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Blog Main Page&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The blog main page which contains all the blog posts also uses the &lt;code&gt;blogPostsObject&lt;/code&gt; that was auto generated by the script to render the posts.&lt;/p&gt;

&lt;p&gt;This allows me to keep things consistent and avoid having to manually update the blog posts information in multiple places.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9y6lwhvdcwfj4mmqtam.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9y6lwhvdcwfj4mmqtam.webp" alt="Image" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Code Snippets&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I used a code snippet to highlight the code blocks. I'm using &lt;a href="https://expressive-code.dev" rel="noopener noreferrer"&gt;Expressive Code&lt;/a&gt; to do this. this is a very cool plugin that allows you to add syntax highlighting to your code blocks, but there is much more to it than that.&lt;/p&gt;

&lt;p&gt;as an example, you can add a &lt;strong&gt;file tab&lt;/strong&gt; to the code block like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgsfi5g6vb19k0nirmtz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgsfi5g6vb19k0nirmtz.png" alt="File Tab Code Snippet Example" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;there is also a &lt;strong&gt;show line numbers&lt;/strong&gt; option that you can use to show the line numbers of the code block, as an example I want to highlight the line that contains the port variable:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovupqj4fg0eahvuveb89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fovupqj4fg0eahvuveb89.png" alt="Show Line Number Code Snippet Example" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;even cooler than that, you can display a code diff like this, highlighting what has been added and removed:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgthq3neyibep76i8zs7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgthq3neyibep76i8zs7v.png" alt="Line Diff Code Snippet Example" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you would like to see more examples of code snippets, you can check out the &lt;a href="https://expressive-code.com/" rel="noopener noreferrer"&gt;Expressive Code&lt;/a&gt; website.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;TOC (Table of Contents)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This one was pretty hard to figure out as the documentation wasn't very clear (or because I was working on this after my day j*b..)&lt;/p&gt;

&lt;p&gt;Either way, I ended up using &lt;a href="https://github.com/stefanprobst/rehype-extract-toc" rel="noopener noreferrer"&gt;rehype-extract-toc&lt;/a&gt; to generate the table of contents. &lt;/p&gt;

&lt;p&gt;The plugin is pretty simple to use and it generates a table of contents based on the headings in the blog post. the &lt;code&gt;withTocExport&lt;/code&gt; function is what is triggers exporting the toc data.&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="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;withToc&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@stefanprobst/rehype-extract-toc&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;withTocExport&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@stefanprobst/rehype-extract-toc/mdx&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;withMdx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;nextMdx&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;options&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="na"&gt;rehypePlugins&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nx"&gt;withToc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;withTocExport&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;toc&lt;/span&gt;&lt;span class="dl"&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;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;toc&lt;/code&gt; variable is then exported from the mdx import itself that we are currently passing to the &lt;code&gt;Toc&lt;/code&gt; component to render the table of contents tree:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toc&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`@/app/(blog)/mdx/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.mdx`&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; 
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Toc&lt;/span&gt; &lt;span class="na"&gt;toc&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;toc&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Post&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Post&lt;/code&gt; is the component that will be rendered and &lt;code&gt;toc&lt;/code&gt; is the variable that contains the table of contents. &lt;code&gt;toc&lt;/code&gt; is then passed to the &lt;code&gt;TOC&lt;/code&gt; component which is responsible for rendering the table of contents.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Closing Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I'm really happy with how this blog turned out. Even though there is still much work to be done, what I have finished deserves to stop a bit and appreciate the hard work that went into it.&lt;/p&gt;

&lt;p&gt;I'm really excited for what comes next into this little project, and I hope you enjoyed reading this post! sorry for any mistakes or typos, I'm still learning how to write this kind of stuff 😅&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>tailwindcss</category>
      <category>mdx</category>
      <category>react</category>
    </item>
  </channel>
</rss>
