<?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: Temuri Takalandze</title>
    <description>The latest articles on Forem by Temuri Takalandze (@abgeo).</description>
    <link>https://forem.com/abgeo</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%2F147697%2F4d30c60a-8233-42fd-b8d5-a806d22f0957.jpeg</url>
      <title>Forem: Temuri Takalandze</title>
      <link>https://forem.com/abgeo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/abgeo"/>
    <language>en</language>
    <item>
      <title>Nginx Ingress Is Archived: Gateway API, Alternatives, and How to Actually Migrate</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Wed, 25 Mar 2026 16:55:15 +0000</pubDate>
      <link>https://forem.com/abgeo/nginx-ingress-is-archived-gateway-api-alternatives-and-how-to-actually-migrate-3hn</link>
      <guid>https://forem.com/abgeo/nginx-ingress-is-archived-gateway-api-alternatives-and-how-to-actually-migrate-3hn</guid>
      <description>&lt;p&gt;The nginx ingress controller that we all relied on for years is now officially retired. The repo is archived and nothing new is coming out of it.&lt;/p&gt;

&lt;p&gt;I wrote a detailed post breaking down your options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gateway API migration (with workarounds for charts that don't support it yet, including a wrapper chart pattern)&lt;/li&gt;
&lt;li&gt;Dual-support controllers for gradual migration&lt;/li&gt;
&lt;li&gt;Drop-in ingress controller replacements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Covers Envoy Gateway, Traefik, Cilium, Istio, Kong, HAProxy, and Contour with pros/cons and real YAML examples.&lt;/p&gt;

&lt;p&gt;Full post on my blog 👉 &lt;a href="https://www.abgeo.dev/blog/nginx-ingress-retirement/" rel="noopener noreferrer"&gt;https://www.abgeo.dev/blog/nginx-ingress-retirement/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>nginx</category>
    </item>
    <item>
      <title>Trivy GitHub Actions Compromised: Full Malware Payload Analysis</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Fri, 20 Mar 2026 14:13:42 +0000</pubDate>
      <link>https://forem.com/abgeo/trivy-github-actions-compromised-full-malware-payload-analysis-1f85</link>
      <guid>https://forem.com/abgeo/trivy-github-actions-compromised-full-malware-payload-analysis-1f85</guid>
      <description>&lt;p&gt;Yesterday, &lt;code&gt;aquasecurity/trivy-action&lt;/code&gt; got compromised again. Attackers force-pushed 75 out of 76 version tags to inject a full credential stealer that scrapes runner memory, harvests secrets across 17 categories, and exfiltrates everything encrypted to a typosquatted domain.&lt;/p&gt;

&lt;p&gt;I pulled the malicious payload apart and documented every step, from process discovery to AES+RSA encrypted exfiltration.&lt;/p&gt;

&lt;p&gt;Full write-up here: &lt;a href="https://www.abgeo.dev/blog/trivy-github-actions-compromised-full-payload-analysis/" rel="noopener noreferrer"&gt;https://www.abgeo.dev/blog/trivy-github-actions-compromised-full-payload-analysis/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>github</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>Git Sparse Checkout: Clone a Single File or Directory</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 19 Apr 2025 09:14:55 +0000</pubDate>
      <link>https://forem.com/abgeo/git-sparse-checkout-clone-a-single-file-or-directory-108i</link>
      <guid>https://forem.com/abgeo/git-sparse-checkout-clone-a-single-file-or-directory-108i</guid>
      <description>&lt;p&gt;Ever needed to clone a Git repository, but only partially?&lt;/p&gt;

&lt;p&gt;Maybe you just want a single file or a specific directory, not the entire codebase.&lt;/p&gt;

&lt;p&gt;Cloning the whole repo can be overkill, especially if it’s large or you’re running something in automation. That’s where Git’s sparse checkout comes in handy. It lets you pull only the parts you actually need, saving time, bandwidth, and disk space.&lt;/p&gt;

&lt;p&gt;Here’s how to do it:&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%2Fhl2vqzw03b06g0uykiee.jpg" 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%2Fhl2vqzw03b06g0uykiee.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automations that only need a single script or config&lt;/li&gt;
&lt;li&gt;Pulling just one project or service from a monorepo&lt;/li&gt;
&lt;li&gt;Saving time when you don’t need the full repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No need to clone the whole haystack when you only want the needle 🧵&lt;/p&gt;

&lt;p&gt;Give it a shot the next time you need just a piece of a repo.&lt;/p&gt;

</description>
      <category>git</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🚨 Common Programming Pitfalls &amp; How to Avoid Them 🚨</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Fri, 28 Feb 2025 09:23:50 +0000</pubDate>
      <link>https://forem.com/abgeo/common-programming-pitfalls-how-to-avoid-them-1c37</link>
      <guid>https://forem.com/abgeo/common-programming-pitfalls-how-to-avoid-them-1c37</guid>
      <description>&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%2Ff9n8wrfcr7k29wu2mjqd.jpg" 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%2Ff9n8wrfcr7k29wu2mjqd.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Even experienced developers fall into traps! Here are some common programming pitfalls and how to dodge them:&lt;/p&gt;

&lt;p&gt;💥 Not Handling Edge Cases – Always consider unexpected inputs, empty lists, and extreme values. Test thoroughly!&lt;/p&gt;

&lt;p&gt;🔄 Infinite Loops – A missing exit condition can break everything. Double-check loop conditions and use timeouts when needed.&lt;/p&gt;

&lt;p&gt;🧹 Ignoring Memory Leaks – Be mindful of object references, especially in long-running applications. Use profiling tools to monitor memory usage.&lt;/p&gt;

&lt;p&gt;📦 Hardcoding Values – Avoid magic numbers and hardcoded credentials. Use config files or environment variables instead.&lt;/p&gt;

&lt;p&gt;🛑 Skipping Error Handling – Ignoring exceptions can lead to crashes. Always handle errors gracefully with proper logging.&lt;/p&gt;

&lt;p&gt;🔄 Copy-Pasting Code – Repetitive code is a maintenance nightmare. DRY (Don’t Repeat Yourself) and use functions or modules.&lt;/p&gt;

&lt;p&gt;What’s the worst pitfall you’ve encountered? Let’s discuss! 💬👇&lt;/p&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🔓 Free Your Ports in One Command 🚀</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 22 Feb 2025 10:51:23 +0000</pubDate>
      <link>https://forem.com/abgeo/free-your-ports-in-one-command-2kio</link>
      <guid>https://forem.com/abgeo/free-your-ports-in-one-command-2kio</guid>
      <description>&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%2Fh0q5hpzmxkdvs9f346m6.jpg" 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%2Fh0q5hpzmxkdvs9f346m6.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;😤 Ever struggled with stopping a process that’s hogging a port on Linux? Hunting down the process ID and killing it manually can be a hassle. Here’s a quick one-liner that does it all for you.&lt;/p&gt;

&lt;p&gt;✨ Replace  with the port number you want to free, and you’re good to go! Simple, effective, and saves time. 💻⚡&lt;/p&gt;

</description>
      <category>linux</category>
      <category>productivity</category>
    </item>
    <item>
      <title>5 Tech Blogs Every Developer Should Follow 🚀</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 22 Feb 2025 10:50:17 +0000</pubDate>
      <link>https://forem.com/abgeo/5-tech-blogs-every-developer-should-follow-4c3e</link>
      <guid>https://forem.com/abgeo/5-tech-blogs-every-developer-should-follow-4c3e</guid>
      <description>&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%2Fxcsf1ahtc3bio2zl8brx.jpg" 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%2Fxcsf1ahtc3bio2zl8brx.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the ever-evolving world of technology, staying up-to-date is essential for every developer. Keeping track of the latest tools, trends, and innovations not only boosts your skills but also keeps you ahead of the curve.&lt;/p&gt;

&lt;p&gt;Here are 5 must-follow tech blogs from industry leaders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Developers Blog – Updates on Android, APIs, and web dev.&lt;/li&gt;
&lt;li&gt;AWS News Blog – Cloud innovations and best practices.&lt;/li&gt;
&lt;li&gt;Engineering at Meta Blog – Insights on Meta’s engineering challenges.&lt;/li&gt;
&lt;li&gt;Netflix TechBlog – Stories on streaming tech and scalability.&lt;/li&gt;
&lt;li&gt;Microsoft Developer Blogs – Tools and frameworks like .NET and Azure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay curious and keep learning! And don’t forget to check out abgeo.dev, where I also share interesting blogs and insights to fuel your developer journey 💻&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Dynamic Environment Variables in Dockerized Next.js: A Flexible Multi-Environment Solution</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 22 Feb 2025 10:48:59 +0000</pubDate>
      <link>https://forem.com/abgeo/dynamic-environment-variables-in-dockerized-nextjs-a-flexible-multi-environment-solution-3a0f</link>
      <guid>https://forem.com/abgeo/dynamic-environment-variables-in-dockerized-nextjs-a-flexible-multi-environment-solution-3a0f</guid>
      <description>&lt;p&gt;If you’re using Next.js with Docker, you’ve probably encountered the challenge of environment variables being fixed at build time. In this blog post, I walk through a practical approach to handling dynamic environment variables using a Docker entrypoint script.&lt;/p&gt;

&lt;p&gt;🔗 Read it here: &lt;a href="https://www.abgeo.dev/blog/dynamic-environment-variables-dockerized-nextjs/" rel="noopener noreferrer"&gt;https://www.abgeo.dev/blog/dynamic-environment-variables-dockerized-nextjs/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know how you manage environment variables in your Next.js projects.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>nextjs</category>
      <category>env</category>
    </item>
    <item>
      <title>Partially Committing Changes in Git ✂️</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 22 Feb 2025 10:47:09 +0000</pubDate>
      <link>https://forem.com/abgeo/partially-committing-changes-in-git-3og</link>
      <guid>https://forem.com/abgeo/partially-committing-changes-in-git-3og</guid>
      <description>&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%2Fo6wi0xe63by40u6qlbr7.jpg" 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%2Fo6wi0xe63by40u6qlbr7.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When working on a project, sometimes you don’t want to commit all your changes at once. Git makes it easy to commit changes selectively using the git add -p command. This allows you to interactively pick which chunks of changes you want to stage and commit 🎯&lt;/p&gt;

&lt;p&gt;First, you can use git add -p to stage only the changes you want. This will open your configured editor, where you can pick the changes to stage ✨&lt;/p&gt;

&lt;p&gt;By committing only what matters, you keep your commit history clean and focused, making it easier to track your progress 🚀&lt;/p&gt;

&lt;p&gt;Perfect for when you want to stay organized and avoid committing unnecessary changes! 😌&lt;/p&gt;

</description>
      <category>git</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>🔐 Secure Your Kubernetes Apps with Cert-Manager &amp; Let’s Encrypt</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 22 Feb 2025 10:45:43 +0000</pubDate>
      <link>https://forem.com/abgeo/secure-your-kubernetes-apps-with-cert-manager-lets-encrypt-48k3</link>
      <guid>https://forem.com/abgeo/secure-your-kubernetes-apps-with-cert-manager-lets-encrypt-48k3</guid>
      <description>&lt;p&gt;Ensuring secure communication for your Kubernetes applications is crucial! In my latest blog post, I walk you through how to automate SSL certificate issuance and management in Kubernetes using cert-manager and Let’s Encrypt.&lt;/p&gt;

&lt;p&gt;✅ Why cert-manager? Automates certificate provisioning &amp;amp; renewal&lt;br&gt;
✅ Why Let’s Encrypt? Free, automated &amp;amp; widely trusted&lt;br&gt;
✅ Demo setup: Securing a Kubernetes service with a real SSL certificate from Let’s Encrypt&lt;/p&gt;

&lt;p&gt;If you’re running Kubernetes workloads and need secure, automated certificate management, this guide is for you!&lt;/p&gt;

&lt;p&gt;📖 Read the full post: &lt;a href="https://www.abgeo.dev/blog/secure-kubernetes-apps-with-cert-manager-and-lets-encrypt/" rel="noopener noreferrer"&gt;https://www.abgeo.dev/blog/secure-kubernetes-apps-with-cert-manager-and-lets-encrypt/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>ssl</category>
      <category>security</category>
    </item>
    <item>
      <title>Ensuring Interface Implementation at Compile Time in Go 🛠️</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 22 Feb 2025 10:43:52 +0000</pubDate>
      <link>https://forem.com/abgeo/ensuring-interface-implementation-at-compile-time-in-go-3366</link>
      <guid>https://forem.com/abgeo/ensuring-interface-implementation-at-compile-time-in-go-3366</guid>
      <description>&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%2F44f2p57zhubgrx3rnc0x.jpg" 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%2F44f2p57zhubgrx3rnc0x.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Go, we can’t implicitly implement interfaces like in some other languages. To ensure a type implements an interface, we explicitly check this by trying to cast the type to the interface. If the type doesn’t match, Go will give a compile-time error, and the code won’t compile 🚫&lt;/p&gt;

&lt;p&gt;This compile-time check helps catch errors early, making sure your types conform to the expected interfaces. If Task doesn’t implement Executor properly, Go won’t compile the code, saving you from potential issues at runtime 👨‍💻&lt;/p&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🚀 What is a Bash Fork Bomb?</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 22 Feb 2025 10:42:24 +0000</pubDate>
      <link>https://forem.com/abgeo/what-is-a-bash-fork-bomb-12i5</link>
      <guid>https://forem.com/abgeo/what-is-a-bash-fork-bomb-12i5</guid>
      <description>&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%2Fcfw0lpav6lsz6k2374mp.jpg" 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%2Fcfw0lpav6lsz6k2374mp.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A tiny but deadly command that can crash a Linux system in seconds! 🤯&lt;/p&gt;

&lt;p&gt;This tiny Bash script is a fork bomb—a self-replicating function that keeps creating processes until the system collapses. It’s a great example of how recursion can go out of control!&lt;/p&gt;

&lt;p&gt;💡 How to stay safe?&lt;br&gt;
✅ Limit user processes with ulimit&lt;br&gt;
✅ Restrict execution permissions&lt;br&gt;
✅ Monitor system resource usage&lt;/p&gt;

</description>
      <category>linux</category>
      <category>bash</category>
    </item>
    <item>
      <title>Improve Code Readability with Early Returns 🚀</title>
      <dc:creator>Temuri Takalandze</dc:creator>
      <pubDate>Sat, 22 Feb 2025 10:41:12 +0000</pubDate>
      <link>https://forem.com/abgeo/improve-code-readability-with-early-returns-54ag</link>
      <guid>https://forem.com/abgeo/improve-code-readability-with-early-returns-54ag</guid>
      <description>&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%2Ffwvhmifalrhrwepunox1.jpg" 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%2Ffwvhmifalrhrwepunox1.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When writing functions, avoid deep nesting by using early returns. This keeps your code clean, flat, and easy to follow.&lt;/p&gt;

&lt;p&gt;Why is this better?&lt;/p&gt;

&lt;p&gt;✅ Flat structure – No unnecessary indentation&lt;br&gt;
✅ Clear conditions – Easier to read and understand&lt;br&gt;
✅ Improved maintainability – Less cognitive load&lt;/p&gt;

</description>
      <category>cleancode</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
