{"@attributes":{"version":"2.0"},"channel":{"title":"Kin Hong NG","link":"http:\/\/kincodes.com\/","description":"Recent content on Kin Hong NG","generator":"Hugo","language":"en-Us","lastBuildDate":"Mon, 23 Feb 2026 00:00:00 +0000","item":[{"title":"Kinho's Homelab Series - GitOps, Secrets, and First Applications","link":"http:\/\/kincodes.com\/posts\/kinhos-homelab-series-gitops-secrets-and-first-applications\/","pubDate":"Mon, 23 Feb 2026 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/kinhos-homelab-series-gitops-secrets-and-first-applications\/","description":"<p>Welcome to another entry in <strong>Kinho&rsquo;s Homelab Series<\/strong>! In the last <a href=\"http:\/\/kincodes.com\/posts\/kinhos-homelab-series-orchestration-platform-and-networking-k3s--cilium\/\">entry<\/a>, we set up our orchestration platform with K3s and solidified our network\nstack with Cilium. However, at this point we have built a whole Kubernetes cluster whose only job is to exist. It has no apps, no workloads, just vibes.<\/p>\n<p>On top of that, Helm charts such as the one for Cilium were installed by hand, which means there&rsquo;s no structure, no repeatability, and no easy way to rebuild.\nBefore we can run real workloads, we need a proper, automated way to manage how all of our Kubernetes objects are installed and configured. It&rsquo;s finally time to adopt the <strong>GitOps workflow<\/strong>!<\/p>"},{"title":"Building a CI Pipeline for Container Images with Dagger and GitHub Actions","link":"http:\/\/kincodes.com\/posts\/building-a-ci-pipeline-for-container-images-with-dagger-and-github-actions\/","pubDate":"Sun, 08 Feb 2026 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/building-a-ci-pipeline-for-container-images-with-dagger-and-github-actions\/","description":"<p>Recently, I&rsquo;ve been hacking away in my <a href=\"https:\/\/kincodes.com\/tags\/homelab-series\/\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>homelab<svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>, and when it came time to deploy my blog, one thing became essential: <strong>having a reliable pipeline for building, scanning, and publishing container images<\/strong>.\nWhether you&rsquo;re developing custom applications from scratch or creating hardened versions of existing images to strengthen their security posture, you need a robust build process you can trust.<\/p>"},{"title":"Kinho's Homelab Series - Orchestration Platform and Networking (K3s + Cilium)","link":"http:\/\/kincodes.com\/posts\/kinhos-homelab-series-orchestration-platform-and-networking-k3s--cilium\/","pubDate":"Mon, 12 Jan 2026 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/kinhos-homelab-series-orchestration-platform-and-networking-k3s--cilium\/","description":"<p>Welcome to another entry in the <strong>Kinho&rsquo;s Homelab Series<\/strong>. We&rsquo;re picking up where we left off in the previous entry <a href=\"http:\/\/kincodes.com\/posts\/kinhos-homelab-series-securing-my-network-with-tailscale\/\"><strong>Securing my Network with Tailscale<\/strong><\/a>,\nand today we continue by installing the Greek engineering helmsman \u2388, the almighty <a href=\"https:\/\/kubernetes.io\/\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n><strong>Kubernetes<\/strong><svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>. This will serve as our main orchestration platform to\nrun all the applications we want in our lab throughout the series.<\/p>"},{"title":"Byte Size Series - What is CIDR?","link":"http:\/\/kincodes.com\/posts\/byte-size-series-what-is-cidr\/","pubDate":"Wed, 07 Jan 2026 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/byte-size-series-what-is-cidr\/","description":"<p>If you are perusing through some DevOps articles or documentation, chances are you might have encountered the acronym <strong>CIDR<\/strong>, but what the heck is it? and why is it a fundamental concept in modern-day networking?<\/p>\n<h2 id=\"we-had-abcs\">We had ABCs<\/h2>\n<p>An IP address consists of a <strong>network portion<\/strong> and a <strong>host portion<\/strong>. Before CIDR existed, IP address allocation was based on a classful system<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup> such as <strong>Class A (8 network prefix bits)<\/strong>, <strong>Class B (16 network prefix bits)<\/strong>, and <strong>Class C (24 network prefix bits)<\/strong>.<\/p>"},{"title":"Kinho's Homelab Series - Securing my Network with Tailscale","link":"http:\/\/kincodes.com\/posts\/kinhos-homelab-series-securing-my-network-with-tailscale\/","pubDate":"Mon, 05 Jan 2026 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/kinhos-homelab-series-securing-my-network-with-tailscale\/","description":"<p>This year I want to really up my <strong>DevOps<\/strong>\/<strong>Platform Engineering<\/strong> skills to the next level, as it is an area I am very interested in. After having such a great experience diving into <strong>Kubernetes<\/strong> for the <a href=\"https:\/\/nationalsciencedatafabric.org\/nsdf-intersect\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>NSDF Intersect<svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a> project,\nI thought that it is finally time go full throttle into building my own <strong>mini homelab playground<\/strong>.<\/p>"},{"title":"Byte Size Series - Limiting CPU and Memory Usage with cgroups","link":"http:\/\/kincodes.com\/posts\/byte-size-series-limiting-cpu-and-memory-usage-with-cgroups\/","pubDate":"Mon, 03 Nov 2025 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/byte-size-series-limiting-cpu-and-memory-usage-with-cgroups\/","description":"<p>The rise of containers and their adoption across the industry with technologies like <strong>Docker and Kubernetes<\/strong> has been remarkable, and with the advent of AI, these technologies are poised to become fundamental not only for training and inference of AI models but also for hosting AI services themselves.\nBeneath these abstractions lies the fundamental idea that allows us to start a Linux process while <strong>limiting its CPU and memory resources<\/strong> using <a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/cgroups.7.html\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n><strong>Control Groups<\/strong><svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>, also know as <strong>cgroups<\/strong>. In this entry of the byte size series, we&rsquo;ll explore how we can use <a href=\"https:\/\/systemd.io\/\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>systemd<svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>,\none of the most used init systems in many Linux distros, to configure and add a process to a cgroup.<\/p>"},{"title":"Automating my RSS Feed with Dagger","link":"http:\/\/kincodes.com\/posts\/automating-my-rss-feed-with-dagger\/","pubDate":"Wed, 22 Oct 2025 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/automating-my-rss-feed-with-dagger\/","description":"<p>After finally updating my blog to be a standalone site, I decided to start writing more about the different concepts I learn and the projects I build along the way, in order to form a more concrete <strong>note-making system<\/strong><sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote-ref\" role=\"doc-noteref\">1<\/a><\/sup>. A while back, I had set up a GitHub Action to scrape both <a href=\"https:\/\/dev.to\/\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>dev.to<svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a> and <a href=\"https:\/\/medium.com\/\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>medium.com<svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>, the platforms where I previously hosted the few articles I had written back in the day.<\/p>"},{"title":"Create Beautiful Documentation with Mkdocs Material","link":"http:\/\/kincodes.com\/posts\/create-beautiful-documentation-with-mkdocs-material\/","pubDate":"Mon, 13 Oct 2025 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/create-beautiful-documentation-with-mkdocs-material\/","description":"<p>Documentation is one of the most important pieces in any software project. Without documentation, it becomes harder to onboard new developers or gather community feedback, since there is\nno clear understanding of what the project is about or how to use it. On the other hand, documentation might exist, but it can sometimes be a nightmare to find the actual information due to a lack of search functionality, and aesthetically, it might just not be pleasing to look at.<\/p>"},{"title":"A 100 Days in Open Source: Key Lessons That Will Help You Get Started \ud83d\ude80","link":"http:\/\/kincodes.com\/posts\/a-100-days-in-open-source-key-lessons-that-will-help-you-get-started\/","pubDate":"Mon, 20 Nov 2023 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/a-100-days-in-open-source-key-lessons-that-will-help-you-get-started\/","description":"<p>October 31st marked the end of the 100 days of open source software (OSS) challenge by <a href=\"https:\/\/opensauced.pizza\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>Open Sauced<svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>. This challenge aimed to unite newcomers, dedicated contributors, and maintainers within OSS projects to foster active involvement, learn new skills,\nand enhance community interaction by engaging in OSS for 100 days. As a participant of this challenge, I will share three significant lessons I learned from this experience to help newcomers in getting started with OSS and making meaningful contributions.<\/p>"},{"title":"You Might Be Overlooking the PUT Method in your REST API","link":"http:\/\/kincodes.com\/posts\/you-might-be-overlooking-the-put-method-in-your-rest-api\/","pubDate":"Tue, 08 Aug 2023 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/you-might-be-overlooking-the-put-method-in-your-rest-api\/","description":"<p>So, you\u2019re building your first or maybe your hundredth REST API, or perhaps you\u2019re following along with a tutorial, and you\u2019re about to implement the PUT HTTP method for an endpoint. To demonstrate a simple workflow for implementing a PUT endpoint,\nlet\u2019s take a look at the following code snippets. In this article, I will be using Golang, but you can follow along with the language of your choice. Consider the following schema for a Pokemons table.<\/p>"},{"title":"Winning a Gamejam in 24 hours: The Creation of Princess Okoku","link":"http:\/\/kincodes.com\/posts\/winning-a-gamejam-in-24-hours-the-creation-of-princess-okoku\/","pubDate":"Sat, 08 Apr 2023 00:00:00 +0000","guid":"http:\/\/kincodes.com\/posts\/winning-a-gamejam-in-24-hours-the-creation-of-princess-okoku\/","description":"<p>I recently participated in Rosebud.ai game jam, its 3rd entry focused on the extra cute theme. I ended up winning the game jam and in this post, I would like to take you on a journey from concept to creation of Princess Okoku,\nthe game I created using the amazing asset generator PixelVibe , ChatGPT, and React.<\/p>\n<h2 id=\"react-for-game-development-\">React for Game Development ?<\/h2>\n<p>Hey don&rsquo;t start throwing the tomatoes! I am not a game developer, but I always have been a huge game fan, specially of rpgs, strategy and <a href=\"https:\/\/en.wikipedia.org\/wiki\/Gacha_game\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>gacha games<svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>. In fact, one of my first tries of dabbling into game development dates back to almost 2\u20133 years ago\n(<a href=\"https:\/\/github.com\/k1nho\/gacha-game\"target=\"_blank\"\n class=\"inline-flex items-center gap-1\"\n>The Programming Isekai Adventure<svg class=\"h-3 w-3 flex-shrink-0\" id=\"external-link\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"\/><\/svg>\n<\/a>) with a console based gacha game. When I saw that Rosebud open their 3rd game jam with the extra cute theme, I decided to give it a shot with my new skills.\nHowever, my expertise is on web, so I had to make a choice.<\/p>"},{"title":"Kin Hong NG","link":"http:\/\/kincodes.com\/about\/","pubDate":"Mon, 01 Jan 0001 00:00:00 +0000","guid":"http:\/\/kincodes.com\/about\/","description":"<h2 id=\"about\">About<\/h2>\n<p>Hi! I&rsquo;m <strong>Kin<\/strong>, I am a <strong>software engineer<\/strong> working in the processing, containerization, and visualization of scientific workflows. I have worked across multiple domains, from cybersecurity, developing advanced email phishing detection, to open source, enhancing repository insights,\nand accessibility.<\/p>\n<p>My main interest is in <strong>cloud-native infrastructure and DevOps tooling<\/strong>, with a focus on <strong>Kubernetes<\/strong>, <strong>Docker<\/strong>, and <strong>CI\/CD<\/strong> pipelines. I also enjoy contributing to open source (<strong>OSS<\/strong>) projects and working with tools that help improve and support the cloud-native community.<\/p>"}]}}