<?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: Kimon Topouzidis</title>
    <description>The latest articles on DEV Community by Kimon Topouzidis (@ktopouzi).</description>
    <link>https://dev.to/ktopouzi</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%2F278640%2Fcc51b23a-83d9-4fab-b4fb-e669651b677a.jpeg</url>
      <title>DEV Community: Kimon Topouzidis</title>
      <link>https://dev.to/ktopouzi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ktopouzi"/>
    <language>en</language>
    <item>
      <title>Upgrading to nuxt 3</title>
      <dc:creator>Kimon Topouzidis</dc:creator>
      <pubDate>Sat, 09 Mar 2024 19:12:31 +0000</pubDate>
      <link>https://dev.to/ktopouzi/upgrading-to-nuxt-3-54ej</link>
      <guid>https://dev.to/ktopouzi/upgrading-to-nuxt-3-54ej</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Oh boy. It's been a long time since the last time I published a blog post. So long that I had to do a whole migration to a new major version of Nuxt. &lt;a href="https://nuxt.com/"&gt;Nuxt 3&lt;/a&gt; is out for quite some time now and after working with the composition API for the past few years I really wanted to make the switch.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Couple of things before we get started. This is not a guide, but rather my journey and the problems I stumbled upon when migrating. If you are interested in a "how to" guide feel free to let me know and I'll do my best in creating one.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The process
&lt;/h2&gt;

&lt;p&gt;I rubbed my hands and got to work. I had two options.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The first option was to start from scratch and re-build the whole thing. Honestly the codebase is not that big. I've got around 10 components such as the &lt;code&gt;&amp;lt;AppHeader /&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;AppFooter /&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;BlogList /&amp;gt;&lt;/code&gt; etc. I could easily rebuilt the whole thing in a day and just replace the repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The second option was to migrate to Nuxt 3, slowly and carefully migrating to the new version. This approach, I figured, will also help me better understand the framework and how to use it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I went with option number two. You see I had a plan. The good folks over at Nuxt got me covered. I used &lt;a href="https://nuxt.com/docs/migration/overview"&gt;their guide&lt;/a&gt; to help me migrate from Nuxt 2. Ben Hong also did a &lt;a href="https://www.youtube.com/watch?v=Us3IPCKEooI"&gt;live coding session&lt;/a&gt; upgrading his website.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I was actually watching this live, so you understand how long it took me to finally pull the trigger&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;While I was doing the update I thought I could also update couple of other things in my repo such as switching to &lt;code&gt;pnpm&lt;/code&gt; instead of &lt;code&gt;yarn&lt;/code&gt; although I am considering switching to &lt;code&gt;bun&lt;/code&gt; just for fun (sorry, pun intended).&lt;/p&gt;

&lt;p&gt;The whole process was smooth well kind of. After updating the &lt;code&gt;nuxt.config.ts&lt;/code&gt; I started slowly upgrading the rest of the repo started from the top of the directory. I spare you the details but I'll try to list couple of things that I believe are worth mentioning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Eslint
&lt;/h3&gt;

&lt;p&gt;The very first thing I had to do was to remove &lt;code&gt;babel&lt;/code&gt; and every other dependency that Nuxt 2 was using and wasn't really needed in the new version. I also removed &lt;code&gt;eslint&lt;/code&gt; and that brings me to the first "issue". I am using prettier and eslint as my formatting and linting tools. It took me some time to get the desired results and after installing some packages I got it working. The Nuxt team &lt;a href="https://nuxt.com/docs/community/contribution#no-prettier"&gt;recommends against using Prettier&lt;/a&gt; when working with the codebase but I like Prettier. Anthony Fu has an opinionated &lt;a href="https://github.com/antfu/eslint-config"&gt;eslint-config&lt;/a&gt; but that didn't really work for me so I had to spend some time to make it work for me.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nuxt content
&lt;/h3&gt;

&lt;p&gt;I also use &lt;a href="https://content.nuxt.com/"&gt;Nuxt Content&lt;/a&gt; for my blog and this was another migration I had to do. To be fair I prefer the new way of fetching your content using the composables better!&lt;/p&gt;

&lt;p&gt;The gotcha here was really specific and it was related to dates. You see in my old nuxt blog I was using &lt;a href="https://github.com/dword-design/nuxt-content-git"&gt;nuxt-content-git&lt;/a&gt; to add an &lt;code&gt;updatedAt&lt;/code&gt; date on my markdown files. I had to move away from that though as it wasn't reliable enough for me. The nuxt content module also dropped support for &lt;code&gt;createdAt&lt;/code&gt; so the solution I found for that was creating custom date Front-matter parameters. Yeah I have to update them manually but I can live with that for now.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;As I was writing that I thought that I might be able to get away with it and use Obsidian to automatically enter the date whenever I make an edit on my markdown files. Nice!&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Modules migration
&lt;/h3&gt;

&lt;p&gt;I am also using couple of other modules on my site, such as &lt;code&gt;@nuxt/image&lt;/code&gt; and &lt;code&gt;@nuxt-svgo&lt;/code&gt; that I had to update and make sure that they work as intended. Apple almost made me cry when they announced dropping support for PWAs but they reversed it. In the meantime I already removed the PWA module that I have to eventually re add at some point!&lt;/p&gt;

&lt;h3&gt;
  
  
  Netlify
&lt;/h3&gt;

&lt;p&gt;I am deploying my website directly in Netlify and since Nuxt 3 is now powered by nitro I had to make a small change on the deployment settings in Netlify. Not a biggie but I had some down time because of that 😅&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Well that's pretty much it. I might update the article in the feature as I try to expand and update my website but overall it was an interesting experience that definitely feels like an upgrade! I really like the DX that Nuxt provides and I hope that this will inspire me to write blog posts like this more often.&lt;/p&gt;

&lt;p&gt;Until the next time...&lt;/p&gt;

</description>
      <category>nuxt</category>
      <category>vue</category>
    </item>
    <item>
      <title>Creating tags for your Nuxt Blog with Nuxt/Content</title>
      <dc:creator>Kimon Topouzidis</dc:creator>
      <pubDate>Sun, 10 Oct 2021 19:05:11 +0000</pubDate>
      <link>https://dev.to/ktopouzi/creating-tags-for-your-nuxt-blog-with-nuxt-content-4cc4</link>
      <guid>https://dev.to/ktopouzi/creating-tags-for-your-nuxt-blog-with-nuxt-content-4cc4</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;Quite recently I revamped my website using a newer version of Nuxt and decided to use Nuxt Content for my &lt;a href="https://kimontopouzidis.com/blog/" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;. While creating the main blog and projects pages though, I came across a quite common issue, tags.&lt;/p&gt;

&lt;p&gt;You see when you first land in the main Blog page you get a list of blog posts which can be overwhelming, especially since I haven't implemented pagination yet.&lt;/p&gt;

&lt;p&gt;A quick alternative for me, was to create tags so you can filter out the results based on the topic you are interested in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The how
&lt;/h2&gt;

&lt;p&gt;In my current configuration I do have one main component for the Blog that is responsible to list all the blogs found in the content folder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- BlogList.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- the list of blogs --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- the item/post wrapper --&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt;
      &lt;span class="na"&gt;v-for=&lt;/span&gt;&lt;span class="s"&gt;"blog of blogs"&lt;/span&gt;
      &lt;span class="na"&gt;:key=&lt;/span&gt;&lt;span class="s"&gt;"blog.slug"&lt;/span&gt;
     &lt;span class="err"&gt;...&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;NuxtLink&lt;/span&gt; &lt;span class="na"&gt;:to=&lt;/span&gt;&lt;span class="s"&gt;"`/blog/${blog.slug}`"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sr-only"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Link to the blog post&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/NuxtLink&amp;gt;&lt;/span&gt;

      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center px-4 pt-3 mb-2"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        ...
        &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-for=&lt;/span&gt;&lt;span class="s"&gt;"(tag, idx) of blog.tags"&lt;/span&gt; &lt;span class="na"&gt;:key=&lt;/span&gt;&lt;span class="s"&gt;"idx"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="c"&gt;&amp;lt;!-- The Tag component --&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;UITag&lt;/span&gt; &lt;span class="na"&gt;:tag=&lt;/span&gt;&lt;span class="s"&gt;"tag"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/UITag&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        ...
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This component has a &lt;code&gt;ul&lt;/code&gt; which holds the wrapper element of the blog post. Then I loop through the blog object and display the list items, aka blog post. Just after the date I am printing the &lt;code&gt;tag&lt;/code&gt; which is another component. This tag component accepts a string as a prop named, well, &lt;code&gt;tag&lt;/code&gt; and it's the slug of the tag. Lets take a look inside the component itself to see how this all works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Tag.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;template&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;NuxtLink&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"..."&lt;/span&gt; &lt;span class="na"&gt;:to=&lt;/span&gt;&lt;span class="s"&gt;"`/blog/tags/${tag}`"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;IconTag&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-kt-ice-white dark:text-text-kt-dark inline"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    {{ tag }}
  &lt;span class="nt"&gt;&amp;lt;/NuxtLink&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This component is a link, which will navigate the user into the special route &lt;code&gt;/blog/tags/#tag&lt;/code&gt;. The last part is the actual prop we previously passed in the component.&lt;/p&gt;

&lt;p&gt;For all this to make sense, I have created a new folder under the &lt;code&gt;Blog&lt;/code&gt; folder/page that already existed, named &lt;code&gt;Tags&lt;/code&gt;. Since this is a dynamic page (meaning that the slug is not a static string but will change every time) I have created a &lt;code&gt;_slug.vue&lt;/code&gt; file on the &lt;code&gt;Tags&lt;/code&gt; folder which will be responsible to display the blogs with the specific tag that I passed to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Tags -&amp;gt; _slug.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"container mx-auto mt-10"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl lg:text-4xl font-bold text-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Posts tagged with
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-kt-purple font-bold"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;#{{ slug }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-xl lg:text-2xl underline mt-4 text-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;NuxtLink&lt;/span&gt; &lt;span class="na"&gt;to=&lt;/span&gt;&lt;span class="s"&gt;"/blog"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; All posts &lt;span class="nt"&gt;&amp;lt;/NuxtLink&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;blog-list&lt;/span&gt; &lt;span class="na"&gt;v-if=&lt;/span&gt;&lt;span class="s"&gt;"articles.length"&lt;/span&gt; &lt;span class="na"&gt;:blogs=&lt;/span&gt;&lt;span class="s"&gt;"articles"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;v-else&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"my-6"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"text-xl lg:text-2xl text-center"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Whoops... It seems that there are no articles with #{{ slug }} tag. 😥
    &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, using the same component that I use for the &lt;code&gt;/blog&lt;/code&gt; route, the &lt;code&gt;blog-list&lt;/code&gt; I am able to re-render the blog list but this time I am filtering all the blogs to get the ones that have the specific tag in their &lt;a href="https://content.nuxtjs.org/writing#front-matter" rel="noopener noreferrer"&gt;Front Matter&lt;/a&gt;.&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;// _slug.vue script&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;asyncData&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;$content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// get the articles where the current tag is included in&lt;/span&gt;
&lt;span class="c1"&gt;// their tag front matter data and their status is published.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;$content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blog&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="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;$contains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;params&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="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;published&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="nf"&gt;fetch&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;slug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;slug&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;articles&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="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;Using the &lt;a href="https://content.nuxtjs.org/fetching" rel="noopener noreferrer"&gt;content API&lt;/a&gt; I am able to filter the blog posts and get the posts that the current tag match their tag declaration in their Front Matter block and they are published!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: the published is another Front Matter option I added so I can freely create posts whenever I do have an idea or inspiration and I can still push the content in git without them being published, if they are unfinished.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that's it! Now you can search for specific tags in my blog list and you can filter them for quick access!&lt;/p&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2Fgo46juiqvrok7nnlqdva.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2Fgo46juiqvrok7nnlqdva.gif" alt="tag-system"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can find more information about the Nuxt Content module &lt;a href="https://content.nuxtjs.org/" rel="noopener noreferrer"&gt;here&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Until the next time ✌&lt;/p&gt;

</description>
      <category>vue</category>
      <category>nuxt</category>
    </item>
    <item>
      <title>Contributing to Open Source</title>
      <dc:creator>Kimon Topouzidis</dc:creator>
      <pubDate>Tue, 06 Oct 2020 10:40:28 +0000</pubDate>
      <link>https://dev.to/ktopouzi/contributing-to-open-source-5f03</link>
      <guid>https://dev.to/ktopouzi/contributing-to-open-source-5f03</guid>
      <description>&lt;p&gt;October. Hactober. The month dedicated to tech and coffee (October 1st is the World Coffee Day)! In this month the most exciting things in the field of technology are announced and released. One of them, I am sure all of you know already, is Hactoberfest. With all that fuzziness of the first 5 days of October I remembered my very first contribution to Open Source and how things changed over the years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let me tell you a story...
&lt;/h2&gt;

&lt;p&gt;...about my experience in Open Source which started back in the summer of 2017. I was first introduced to Google Summer of Code by a professor in University. Actually I remember reading in his e-mail &lt;em&gt;Participate in Google Summer of Code for a salary of 6.000€&lt;/em&gt; or something like that. I jumped over my chair and I instantly made the calculations ".... 6000 divided by 3 equals...." TADA!! (SPOILER: it turned out to be less than that because, Greece, you know). &lt;/p&gt;

&lt;p&gt;I remember searching the internet trying to find information about the whole thing that Google sponsor students to work on Open Source projects. It must be a joke, I said and I searched on the organizations that was participating. &lt;/p&gt;

&lt;p&gt;After about a week I applied. The &lt;strong&gt;only&lt;/strong&gt; thing I was thinking of, was the &lt;em&gt;money&lt;/em&gt;. Yeah don't judge me that's my truth. I was thinking all the purchases I would do with my first payslip. For Greece even if the amount wasn't 6k with all the taxes and stuff, it was still a great amount of money for a student.&lt;/p&gt;

&lt;p&gt;I will never forget the day the results came out. &lt;strong&gt;NEVER&lt;/strong&gt;. I was out with friends and I got an email.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dwi3-iGx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gmc4gwp28u0zq1pybdfh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dwi3-iGx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/gmc4gwp28u0zq1pybdfh.jpg" alt="an email showing the response from Google that a proposal to google summer of code has been accepted"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;WHAT A JOY!!! I couldn't believe in my eyes. I thought someone messed up with me. Oh boy I was accepted to Mono's cppSharp project!!! (literally to this day I find it pretty hard to explain to others what this library does. But this seemed to be so interesting to me back then.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The Open Source adventure began...
&lt;/h2&gt;

&lt;p&gt;...right away actually. We used Skype for internal communication because of Microsoft (Mono is a Xamarin project where Xamarin belongs to Microsoft) and my training began in early May. And what a summer that was indeed. I spent hours in my PC trying to understand and compile the project locally and also learn new things. I also met some of the contributors in that time. They weren't students. They were real people, with daytime jobs, that helped and supported an Open Source project in the evenings &lt;strong&gt;FOR FREE&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;That was it. I realized it. I realized what open source is. Some crazy people with no lives that want to code all day long. &lt;br&gt;
&lt;strong&gt;No.&lt;/strong&gt; Of course &lt;strong&gt;not.&lt;/strong&gt; A great community with great people that offer their knowledge for free in exchange for a better world. They are heroes. Remember, when I thought of this whole thing I got money in my mind. I wanted that money and I did what I did for the money. They did it for the community. They did it for free. They did it for you and me that use OSS every day thanks to those HEROES.&lt;/p&gt;

&lt;p&gt;Through that summer I learnt what I haven't learnt in 3 years in University. I learnt how to use Git. How to write clean and documented code. How to interact with people from another part of this world. How to report a bug in a big OS library. How to dig into large scale projects and walk your way. How to create unit tests. The list could go on and on but the thing is you can't put a price tag on those. The value of those things can't be bought with money. There are so many maintainers right now and so many people willing to provide help, teach and work with young developers that are willing to contribute to Open Source. I get it, #GoodFirstIssue is not the ideal start but if you chat with those guys and girls if you spend two hours of your free time trying to understand what this project is about I am more than sure that someone will prompt you to a good first issue and give you all the help you might need. &lt;/p&gt;

&lt;h2&gt;
  
  
  ..through the end of the summer
&lt;/h2&gt;

&lt;p&gt;... i didn't even care about the money. All I wanted was to get up in the morning and work on that little thing that I couldn't solve. In 4 months I was a better developer and this was one of the most exciting things I did in my student years. Unfortunately I didn't find out about this earlier. This was my one and only participation on GSoC and I am grateful for all the things I learnt. This is a reminder for young readers and developers who are still students and want to elevate their careers. There are sources outside in the wilderness that will help you on the long run if you use them correctly. In my case I became a better developer and person. It could be just money and nothing more than that. But fortunately it wasn't. In your case that might be something entirely different but thats fine, everyone is different. &lt;/p&gt;

&lt;h2&gt;
  
  
  ...in the end...
&lt;/h2&gt;

&lt;p&gt;...Open source is not about money (at least for you and me. Funding an Open Source projects is another topic for someone more experienced than me) and its definitely not about a T-Shirt. Don't be like me and your motives are money (or a T-shirt in our days). See deeper in the value of Open Source and find your meaning when contributing. It's a great feeling having your code published on a OSS release. Maintainers out there, for me are Tech Heroes. They work hard to maintain a quality and bug free library/software/package. Respect them, they deserve it. Chat with them, they are friendly and eager to help because in the end your contribution helps them as well. They will guide you to the right direction and find a good First Issue. Changing the title of their project, that they might have put hours upon hours on, to &lt;em&gt;magical and wonderful project&lt;/em&gt; is just disrespectfull. &lt;/p&gt;

&lt;p&gt;If for any reason you are curious in learning more about my summer there, what I did and see my code, you can find my story &lt;a href="https://www.mono-project.com/community/google-summer-of-code/reports/2017/cppsharp-kimon-topouzidis/"&gt;here&lt;/a&gt; in the official Monos blog. Also you can find me in &lt;a href="https://twitter.com/_ktopouzi"&gt;Twitter&lt;/a&gt;, or write a comment below 😀&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>gsoc</category>
    </item>
    <item>
      <title>Installing Vue Storefront in Windows via WSL2</title>
      <dc:creator>Kimon Topouzidis</dc:creator>
      <pubDate>Fri, 20 Mar 2020 16:22:35 +0000</pubDate>
      <link>https://dev.to/ktopouzi/installing-vue-storefront-in-windows-via-wsl2-54j0</link>
      <guid>https://dev.to/ktopouzi/installing-vue-storefront-in-windows-via-wsl2-54j0</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;If you are reading this, I am assuming you already know what Vue Storefront is, but for those who don’t let me explain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vuestorefront.io/"&gt;Vue Storefront&lt;/a&gt; is an Open Source PWA for eCommerce. As its name suggest its based on Vue.js  and it uses its own Node.js &lt;a href="https://github.com/DivanteLtd/storefront-api"&gt;API&lt;/a&gt; or any other really, to fetch data from the backend of your desire. The most popular choice right now is Magento 2 but there are other options too and a lot more coming on the way. The community is super friendly and I really encourage you to join the Slack channel if you find this interesting!&lt;/p&gt;

&lt;h1&gt;
  
  
  Preparation
&lt;/h1&gt;

&lt;p&gt;Okay let’s focus on the installation. You will need some stuff installed beforehand. Let’s &lt;br&gt;
have a look: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;del&gt;Windows Insider - Slow or Fast track&lt;/del&gt; As per &lt;a href="https://dev.to/mattwojo/comment/1bm5i"&gt;this&lt;/a&gt; comment you can now skip this step! Matt also gives some great suggestion for your setup there! &lt;/li&gt;
&lt;li&gt;Linux distro e.g Ubuntu-18.04 &lt;/li&gt;
&lt;li&gt;Docker for Windows &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s start enabling the WSL2 features on our Windows machine. In order to do so we have to make sure that we have a Windows 10 build of 18917 or higher. Press &lt;code&gt;win + r&lt;/code&gt; and type &lt;code&gt;winver&lt;/code&gt; to see your current version. If you have a build version greater that the required  you are good to go. If not you’ll have to register for the Windows Insiders Program. &lt;/p&gt;

&lt;p&gt;Before doing so please make sure you enable the additional required features for the WSL2 which are &lt;strong&gt;Windows Subsystem for Linux&lt;/strong&gt; and &lt;strong&gt;Virtual Machine Platform&lt;/strong&gt;. Both of these can be found if you search for &lt;em&gt;Turn Windows features on and off&lt;/em&gt;. Now let’s try register for the Insiders program. Type &lt;em&gt;Settings&lt;/em&gt; on the start menu and under Update &amp;amp; Security locate Windows Insider Program.&lt;/p&gt;

&lt;p&gt;After you successfully enroll to the slow or fast track the first part is complete.&lt;/p&gt;

&lt;p&gt;Moving on to the second part which is installing a Linux distro. Open &lt;strong&gt;Microsoft Store&lt;/strong&gt; and search for “Linux”. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OJjQ7uVc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584718846025_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OJjQ7uVc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584718846025_image.png" alt="Microsoft Store - Linux options"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There some great options there but for the sake of this tutorial we will choose Ubuntu 18.04. Install the Linux version of your choice like you would do with a regular app. Moving on with docker, &lt;a href="https://docs.docker.com/docker-for-windows/wsl-tech-preview/"&gt;install docker&lt;/a&gt; and activate the WSL2 option as shown.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cTxloT-b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584718329446_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cTxloT-b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584718329446_image.png" alt="Docker general tab"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next go to the &lt;strong&gt;Resources&lt;/strong&gt; tab and choose the distro you installed on the previous step and enable the integration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4dmrFXuB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584718373382_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4dmrFXuB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584718373382_image.png" alt="Docker resources tab"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By now we have enrolled to the insiders program, installed docker with WSL2 features enabled, installed a linux distro and the last thing to do is actually enable WSL2.&lt;/p&gt;

&lt;p&gt;In order to do so we have to run &lt;code&gt;wsl --set-version &amp;lt;Distro&amp;gt; 2&lt;/code&gt; to the command line. I installed the new Microsoft terminal but you can do that with pre-installed Powershell too. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Remember to change  with the name of your distro. you can check the installed ones if you run&lt;/em&gt; &lt;code&gt;wsl --list&lt;/code&gt;. More information can be found &lt;a href="https://docs.microsoft.com/en-us/windows/wsl/wsl2-install"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To check your WSL version type &lt;code&gt;wsl -l -v&lt;/code&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z3N9PSWA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584719638405_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z3N9PSWA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584719638405_image.png" alt="WSL list with version"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now if you open your terminal and choose the Linux version you installed you should be good to go. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r8Wa-xh3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584720072846_image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r8Wa-xh3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_84E7DE6440936B0CDC2873BC2EAC0FDDD453238A448633273C10D0BC8529B9FE_1584720072846_image.png" alt="Ubuntu 18.04 root directory on Windows Terminal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s it 🎉 🎊 . You have successfully installed WSL2 and have enabled its features on your default distro. You can also follow this &lt;a href="https://www.youtube.com/watch?v=A0eqZujVfYU"&gt;video&lt;/a&gt; by Scott Hanselman which I found super useful.&lt;/p&gt;

&lt;p&gt;From here you can just follow the default instruction found on the Vue Storefront &lt;a href="https://docs.vuestorefront.io/guide/installation/linux-mac.html"&gt;docs&lt;/a&gt;. You are in a Linux OS now after all 🙂 (kinda)&lt;/p&gt;

&lt;p&gt;Quick tip before I let you go. &lt;br&gt;
I find that running this command &lt;code&gt;echo "sync &amp;amp;&amp;amp; echo 3 &amp;gt; /proc/sys/vm/drop_caches" | sudo sh&lt;/code&gt; fixes some issues with memory the Vmmem process is having. It can be really memory hungry!&lt;/p&gt;

&lt;p&gt;Please let me know if there’s anything I can improve on this mini - guide. You can also find me on the VSF Slack channel. &lt;/p&gt;

&lt;p&gt;Vue Storefront is really promising and the community is super friendly. It’s how open source should be. It’s a great place to be in if you are interested in finding more. &lt;/p&gt;

&lt;p&gt;Good luck with your adventures 🍀 &lt;/p&gt;

</description>
      <category>vue</category>
      <category>pwa</category>
    </item>
  </channel>
</rss>
