<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Portfolio</title>
    <link>https://www.piergiorgioyankah.com/posts/</link>
    <description>Recent content on Portfolio</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>Piergiorgio Yankah</copyright>
    <lastBuildDate>Wed, 11 Feb 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://www.piergiorgioyankah.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Infralight: A vibecoded Visual Dashboard for SaltStack &amp; Terraform</title>
      <link>https://www.piergiorgioyankah.com/posts/introducing_infralight/</link>
      <pubDate>Wed, 11 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://www.piergiorgioyankah.com/posts/introducing_infralight/</guid>
      <description>&lt;h2 id=&#34;where-this-started&#34;&gt;Where This Started&lt;/h2&gt;&#xA;&lt;p&gt;At my previous job I worked with SaltStack and Terraform. As the project grew, it became harder to keep track of what was installed where, which states depended on each other, and what a given change might affect. The usual approach was going through YAML files, which worked but wasn&amp;rsquo;t great.&lt;/p&gt;&#xA;&lt;p&gt;I wanted a simple tool that could scan a directory of &lt;code&gt;.sls&lt;/code&gt; or &lt;code&gt;.tf&lt;/code&gt; files and show me what&amp;rsquo;s in there — without needing a running Salt Master or Terraform state. I couldn&amp;rsquo;t find one, so I though it may be a good idea to build something my self.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bachelorproef</title>
      <link>https://www.piergiorgioyankah.com/posts/dissertation/</link>
      <pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate>
      <guid>https://www.piergiorgioyankah.com/posts/dissertation/</guid>
      <description>&lt;h1 id=&#34;poster&#34;&gt;Poster&lt;/h1&gt;&#xA;&lt;script type=&#34;text/javascript&#34; src= &#39;/js/pdf-js/build/pdf.js&#39;&gt;&lt;/script&gt;&#xA;&#xA;&lt;style&gt;&#xA;  #embed-pdf-container {&#xA;    position: relative;&#xA;    width: 100%;&#xA;    height: auto;&#xA;    min-height: 20vh;&#xA;     &#xA;  }&#xA;  &#xA;  .pdf-canvas {&#xA;    border: 1px solid black;&#xA;    direction: ltr;&#xA;    width: 100%;&#xA;    height: auto;&#xA;    display: none;&#xA;  }&#xA;  &#xA;  #the-canvas {&#xA;    border: 1px solid black;&#xA;    direction: ltr;&#xA;    width: 100%;&#xA;    height: auto;&#xA;    display: none;&#xA;  }&#xA;  &#xA;  &#xA;  .pdf-loadingWrapper {&#xA;    display: none;&#xA;    justify-content: center;&#xA;    align-items: center;&#xA;    width: 100%;&#xA;    height: 350px;&#xA;  }&#xA;  &#xA;  .pdf-loading {&#xA;    display: inline-block;&#xA;    width: 50px;&#xA;    height: 50px;&#xA;    border: 3px solid #d2d0d0;;&#xA;    border-radius: 50%;&#xA;    border-top-color: #383838;&#xA;    animation: spin 1s ease-in-out infinite;&#xA;    -webkit-animation: spin 1s ease-in-out infinite;&#xA;  }&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  #overlayText {&#xA;    word-wrap: break-word;&#xA;    display: grid;&#xA;    justify-content: end;&#xA;  }&#xA;  &#xA;  #overlayText a {&#xA;    position: relative;&#xA;    top: 10px;&#xA;    right: 4px;&#xA;    color: #000;&#xA;    margin: auto;&#xA;    background-color: #eeeeee;&#xA;    padding: 0.3em 1em;&#xA;    border: solid 2px;&#xA;    border-radius: 12px;&#xA;    border-color: #00000030;&#xA;    text-decoration: none;&#xA;  }&#xA;  &#xA;  #overlayText svg {&#xA;    height: clamp(1em, 2vw, 1.4em);&#xA;    width:  clamp(1em, 2vw, 1.4em);&#xA;  }&#xA;  &#xA;  &#xA;  &#xA;  @keyframes spin {&#xA;    to { -webkit-transform: rotate(360deg); }&#xA;  }&#xA;  @-webkit-keyframes spin {&#xA;    to { -webkit-transform: rotate(360deg); }&#xA;  }&#xA;  &lt;/style&gt;&lt;div class=&#34;embed-pdf-container&#34; id=&#34;embed-pdf-container-698a382b&#34;&gt;&#xA;    &lt;div class=&#34;pdf-loadingWrapper&#34; id=&#34;pdf-loadingWrapper-698a382b&#34;&gt;&#xA;        &lt;div class=&#34;pdf-loading&#34; id=&#34;pdf-loading-698a382b&#34;&gt;&lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div id=&#34;overlayText&#34;&gt;&#xA;      &lt;a href=&#34;./pdf/conference_poster.pdf&#34; aria-label=&#34;Download&#34; download&gt;&#xA;        &lt;svg aria-hidden=&#34;true&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 18 18&#34;&gt;&#xA;            &lt;path d=&#34;M9 13c.3 0 .5-.1.7-.3L15.4 7 14 5.6l-4 4V1H8v8.6l-4-4L2.6 7l5.7 5.7c.2.2.4.3.7.3zm-7 2h14v2H2z&#34; /&gt;&#xA;        &lt;/svg&gt;&#xA;      &lt;/a&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;canvas class=&#34;pdf-canvas&#34; id=&#34;pdf-canvas-698a382b&#34;&gt;&lt;/canvas&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;pdf-paginator&#34; id=&#34;pdf-paginator-698a382b&#34;&gt;&#xA;    &lt;button id=&#34;pdf-prev-698a382b&#34;&gt;Previous&lt;/button&gt;&#xA;    &lt;button id=&#34;pdf-next-698a382b&#34;&gt;Next&lt;/button&gt; &amp;nbsp; &amp;nbsp;&#xA;    &lt;span&gt;&#xA;      &lt;span class=&#34;pdf-pagenum&#34; id=&#34;pdf-pagenum-698a382b&#34;&gt;&lt;/span&gt; / &lt;span class=&#34;pdf-pagecount&#34; id=&#34;pdf-pagecount-698a382b&#34;&gt;&lt;/span&gt;&#xA;    &lt;/span&gt;&#xA;    &lt;a class=&#34;pdf-source&#34; id=&#34;pdf-source-698a382b&#34; href=&#34;./pdf/conference_poster.pdf&#34;&gt;[pdf]&lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;noscript&gt;&#xA;View the PDF file &lt;a class=&#34;pdf-source&#34; id=&#34;pdf-source-noscript-698a382b&#34; href=&#34;./pdf/conference_poster.pdf&#34;&gt;here&lt;/a&gt;.&#xA;&lt;/noscript&gt;&#xA;&#xA;&lt;script type=&#34;text/javascript&#34;&gt;&#xA;    (function(){&#xA;    var url = &#39;.\/pdf\/conference_poster.pdf&#39;;&#xA;&#xA;    var hidePaginator = &#34;&#34; === &#34;true&#34;;&#xA;    var hideLoader = &#34;&#34; === &#34;true&#34;;&#xA;    var selectedPageNum = parseInt(&#34;&#34;) || 1;&#xA;&#xA;    &#xA;    var pdfjsLib = window[&#39;pdfjs-dist/build/pdf&#39;];&#xA;&#xA;    &#xA;    if (pdfjsLib.GlobalWorkerOptions.workerSrc == &#39;&#39;)&#xA;      pdfjsLib.GlobalWorkerOptions.workerSrc = &#34;https:\/\/www.piergiorgioyankah.com\/&#34; + &#39;js/pdf-js/build/pdf.worker.js&#39;;&#xA;&#xA;    &#xA;    var pdfDoc = null,&#xA;        pageNum = selectedPageNum,&#xA;        pageRendering = false,&#xA;        pageNumPending = null,&#xA;        scale = 3,&#xA;        canvas = document.getElementById(&#39;pdf-canvas-698a382b&#39;),&#xA;        ctx = canvas.getContext(&#39;2d&#39;),&#xA;        paginator = document.getElementById(&#34;pdf-paginator-698a382b&#34;),&#xA;        loadingWrapper = document.getElementById(&#39;pdf-loadingWrapper-698a382b&#39;);&#xA;&#xA;&#xA;    &#xA;    showPaginator();&#xA;    showLoader();&#xA;&#xA;    &#xA;&#xA;    function renderPage(num) {&#xA;      pageRendering = true;&#xA;      &#xA;      pdfDoc.getPage(num).then(function(page) {&#xA;        var viewport = page.getViewport({scale: scale});&#xA;        canvas.height = viewport.height;&#xA;        canvas.width = viewport.width;&#xA;&#xA;        &#xA;        var renderContext = {&#xA;          canvasContext: ctx,&#xA;          viewport: viewport&#xA;        };&#xA;        var renderTask = page.render(renderContext);&#xA;&#xA;        &#xA;        renderTask.promise.then(function() {&#xA;          pageRendering = false;&#xA;          showContent();&#xA;&#xA;          if (pageNumPending !== null) {&#xA;            &#xA;            renderPage(pageNumPending);&#xA;            pageNumPending = null;&#xA;          }&#xA;        });&#xA;      });&#xA;&#xA;      &#xA;      document.getElementById(&#39;pdf-pagenum-698a382b&#39;).textContent = num;&#xA;    }&#xA;&#xA;    &#xA;&#xA;    function showContent() {&#xA;      loadingWrapper.style.display = &#39;none&#39;;&#xA;      canvas.style.display = &#39;block&#39;;&#xA;    }&#xA;&#xA;    &#xA;&#xA;    function showLoader() {&#xA;      if(hideLoader) return&#xA;      loadingWrapper.style.display = &#39;flex&#39;;&#xA;      canvas.style.display = &#39;none&#39;;&#xA;    }&#xA;&#xA;    &#xA;&#xA;    function showPaginator() {&#xA;      if(hidePaginator) return&#xA;      paginator.style.display = &#39;block&#39;;&#xA;    }&#xA;&#xA;    &#xA;&#xA;    function queueRenderPage(num) {&#xA;      if (pageRendering) {&#xA;        pageNumPending = num;&#xA;      } else {&#xA;        renderPage(num);&#xA;      }&#xA;    }&#xA;&#xA;    &#xA;&#xA;    function onPrevPage() {&#xA;      if (pageNum &lt;= 1) {&#xA;        return;&#xA;      }&#xA;      pageNum--;&#xA;      queueRenderPage(pageNum);&#xA;    }&#xA;    document.getElementById(&#39;pdf-prev-698a382b&#39;).addEventListener(&#39;click&#39;, onPrevPage);&#xA;&#xA;    &#xA;&#xA;    function onNextPage() {&#xA;      if (pageNum &gt;= pdfDoc.numPages) {&#xA;        return;&#xA;      }&#xA;      pageNum++;&#xA;      queueRenderPage(pageNum);&#xA;    }&#xA;    document.getElementById(&#39;pdf-next-698a382b&#39;).addEventListener(&#39;click&#39;, onNextPage);&#xA;&#xA;    &#xA;&#xA;    pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {&#xA;      pdfDoc = pdfDoc_;&#xA;      var numPages = pdfDoc.numPages;&#xA;      document.getElementById(&#39;pdf-pagecount-698a382b&#39;).textContent = numPages;&#xA;&#xA;      &#xA;      if(pageNum &gt; numPages) {&#xA;        pageNum = numPages&#xA;      }&#xA;&#xA;      &#xA;      renderPage(pageNum);&#xA;    });&#xA;    })();&#xA;&lt;/script&gt;&#xA;&#xA;&lt;h1 id=&#34;summary&#34;&gt;Summary&lt;/h1&gt;&#xA;&lt;p&gt;&amp;ldquo;Docbyte gebruikt een platform genaamd Nuxeo. Docbyte wil Nuxeo uitbreiden met specifieke plug-ins om opbasis daarvan de bestaande Docbyte oplossingen verder uit te werken en nieuwe uitbreidingen toe te voegen. Uiteindelijk wil Docbyte een nieuwe aanbieding op de markt zetten, namelijk ”Docbyte Core”. Docbyte Core biedt allerelevante basisfunctionaliteiten zoals het beheer van storage, gebruikers, autorisatie en authenticatie. Concreet heeftDocbyte behoefte aan een tool voor het creeren en visualiseren van workflows. Dit moet helpen bij het identificeren ¨van de bibliotheek of gereedschap die aan de criteria van Docbyte voldoet. Op basis van dit onderzoek kan wordengeconcludeerd dat jsPlumb CE de meest geschikte bibliotheek is voor het specifieke doel dat Docbyte in gedachtenhad.&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Me, Myself &amp; I</title>
      <link>https://www.piergiorgioyankah.com/posts/about/</link>
      <pubDate>Thu, 28 Feb 2019 00:00:00 +0000</pubDate>
      <guid>https://www.piergiorgioyankah.com/posts/about/</guid>
      <description>&lt;p&gt;Hi there 👋. I&amp;rsquo;m Piergiorgio Yankah a graduate of HoGent.&lt;/p&gt;&#xA;&lt;p&gt;I chose this field because I have a passion for computers and everything related to digital technology.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;📚 I&amp;rsquo;am currently reading:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Computer Systems A Programer&amp;rsquo;s Perspective &lt;a href=&#34;https://www.amazon.com/Computer-Systems-Programmers-Perspective-3rd/dp/013409266X&#34;&gt;Amazon&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Introduction to Probability, Statistics, and Random Processes &lt;a href=&#34;https://a.co/d/1SHO2WH&#34;&gt;Amazon&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Calculus 8th Edition &lt;a href=&#34;https://a.co/d/cwE0RA8&#34;&gt;Amazon&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Computer Graphics: Principles and Practice &lt;a href=&#34;https://amzn.eu/d/gUG0MFi&#34;&gt;Amazon&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;🏫 I&amp;rsquo;am always learning&lt;/li&gt;&#xA;&lt;li&gt;📫 How to reach me: &lt;a href=&#34;mailto:piergiorgioyankh@gmail.com&#34;&gt;Mail&lt;/a&gt; [Gmail]&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title></title>
      <link>https://www.piergiorgioyankah.com/posts/contacts/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://www.piergiorgioyankah.com/posts/contacts/</guid>
      <description></description>
    </item>
  </channel>
</rss>
