<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Welcome to Anatoly&#39;s Blog on Anatoly&#39;s Blog</title>
    <link>https://anatoly.dev/</link>
    <description>Recent content in Welcome to Anatoly&#39;s Blog on Anatoly&#39;s Blog</description>
    <generator>Hugo -- 0.152.2</generator>
    <language>en-us</language>
    <lastBuildDate>Sun, 22 Feb 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://anatoly.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>MetalLB LoadBalancer IPs Unreachable from macOS Host (QEMU/Talos)</title>
      <link>https://anatoly.dev/posts/2026/02/metallb-macos-qemu-unreachable/</link>
      <pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2026/02/metallb-macos-qemu-unreachable/</guid>
      <description>&lt;p&gt;I run a local Kubernetes cluster on macOS using &lt;a href=&#34;https://www.talos.dev/&#34;&gt;Talos Linux&lt;/a&gt; with QEMU. The cluster uses &lt;a href=&#34;https://metallb.universe.tf/&#34;&gt;MetalLB&lt;/a&gt; in L2 mode to assign external IPs to LoadBalancer services — the same way it works in production on bare metal. Everything inside the cluster was fine. But from my Mac, I couldn&amp;rsquo;t reach the LoadBalancer IP at all.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl -k --connect-timeout 3 https://10.5.0.10
curl: (28) Failed to connect to 10.5.0.10 port 443 after 3005 ms: Timeout was reached
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This took me a while to figure out, so here&amp;rsquo;s the full story.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Smart Home Setup Guide: The Bare Minimum without Regrets</title>
      <link>https://anatoly.dev/posts/2026/02/smart-home-the-bare-minimum-without-regrets/</link>
      <pubDate>Sun, 01 Feb 2026 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2026/02/smart-home-the-bare-minimum-without-regrets/</guid>
      <description>&lt;p&gt;Recently, I&amp;rsquo;ve been asked about my smart home setup and decided that I&amp;rsquo;ve gathered enough experience to share it with others, so people can avoid the pitfalls that I fell into.&lt;/p&gt;
&lt;h2 id=&#34;what-is-a-smart-home&#34;&gt;What Is a Smart Home?&lt;/h2&gt;
&lt;p&gt;A smart home consists of many scattered devices that interconnect with each other to follow your orders. For example, a thermostat that measures temperature and turns your air conditioner on or off on demand. It doesn&amp;rsquo;t only make your life easier—it will also reduce your electricity bill.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How a Mini PC and Kubernetes Changed My Life</title>
      <link>https://anatoly.dev/posts/2025/12/how-mini-pc-and-kubernetes-changed-my-life/</link>
      <pubDate>Wed, 24 Dec 2025 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/12/how-mini-pc-and-kubernetes-changed-my-life/</guid>
      <description>&lt;p&gt;Almost a year ago I purchased a &lt;a href=&#34;https://s.click.aliexpress.com/e/_c2JptJAl&#34;&gt;Beelink Mini S12 Pro&lt;/a&gt; (N100-based mini PC) from AliExpress. Initially I wanted to install only &lt;a href=&#34;https://www.home-assistant.io/&#34;&gt;Home Assistant&lt;/a&gt; and looked for something simple and cheap. I never thought I would need something more powerful. How wrong I was.&lt;/p&gt;
&lt;p&gt;Initially I planned to install HA OS, but then thought that installing it using a container and &lt;a href=&#34;https://docs.docker.com/compose/&#34;&gt;docker-compose&lt;/a&gt; would give me more room to test and debug. I knew that if something broke, it would be much easier to restore than using HA OS.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fixing k9s &#39;Too Many Open Files&#39; Error on K3s</title>
      <link>https://anatoly.dev/posts/2025/10/k9s-too-many-open-files/</link>
      <pubDate>Fri, 17 Oct 2025 01:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/10/k9s-too-many-open-files/</guid>
      <description>&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;
&lt;p&gt;I was using k9s to check logs on my K3s homelab cluster when I hit this frustrating error:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;to create fsnotify watcher: too many open files
stream closed: EOF for development/drawdb-ddf8d9569-grfff (drawdb)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The log stream would just close immediately, and I couldn&amp;rsquo;t see anything. Annoying.&lt;/p&gt;
&lt;h2 id=&#34;whats-actually-happening&#34;&gt;What&amp;rsquo;s Actually Happening&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s the thing - this isn&amp;rsquo;t a problem with k9s on your laptop. It&amp;rsquo;s happening on the K3s node itself. When applications watch files (like development tools, file syncing services, or even k9s monitoring your cluster), Linux uses something called inotify watchers. There&amp;rsquo;s a limit to how many of these you can have.&lt;/p&gt;</description>
    </item>
    <item>
      <title>IntelliJ IDEA: White Markdown Preview with Dark Theme</title>
      <link>https://anatoly.dev/posts/2025/09/intellij-white-markdown-preview/</link>
      <pubDate>Fri, 19 Sep 2025 01:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/09/intellij-white-markdown-preview/</guid>
      <description>&lt;p&gt;&lt;em&gt;Note: This post preserves and references the solution from &lt;a href=&#34;https://www.aloneguid.uk/posts/2021/04/intellij-white-markdown/&#34;&gt;Ivan Aloneguid&amp;rsquo;s original article&lt;/a&gt;. Full credit goes to the original author for this elegant solution.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;quick-solution&#34;&gt;Quick Solution&lt;/h2&gt;
&lt;p&gt;If you use IntelliJ IDEA with a dark theme but want a white Markdown preview, here&amp;rsquo;s the simplest fix:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;File → Settings → Languages &amp;amp; Frameworks → Markdown&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;In the &amp;ldquo;Custom CSS&amp;rdquo; field, add:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;body&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;invert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;#fff&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;font-family&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Segoe UI&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;16&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;px&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;img&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;invert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;Click &lt;strong&gt;Apply&lt;/strong&gt; and &lt;strong&gt;OK&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;why-this-works&#34;&gt;Why This Works&lt;/h2&gt;
&lt;p&gt;The CSS uses &lt;code&gt;filter: invert(1)&lt;/code&gt; to flip the dark preview to light. Images are also inverted to preserve their original appearance. You can customize the font family and size to your preference.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My little home server :)</title>
      <link>https://anatoly.dev/posts/2025/09/my-little-k3s-homelab-cluster/</link>
      <pubDate>Wed, 10 Sep 2025 05:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/09/my-little-k3s-homelab-cluster/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://anatoly.dev/images/my-little-home-server.png&#34;&gt;&lt;img alt=&#34;Image description&#34; loading=&#34;lazy&#34; src=&#34;https://anatoly.dev/images/my-little-home-server.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Professional Reminder: Keep Politics Out of LinkedIn</title>
      <link>https://anatoly.dev/posts/2025/09/keep-politics-out-linkedin/</link>
      <pubDate>Sat, 06 Sep 2025 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/09/keep-politics-out-linkedin/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been noticing more political content and engagement on LinkedIn lately. While I understand we&amp;rsquo;re living through complex times both in Israel and globally, and people naturally want to share their perspectives, I wanted to offer a gentle reminder about the potential professional risks.&lt;/p&gt;
&lt;p&gt;When recruiters and hiring managers review your profile, they inevitably see your activity—including political posts you&amp;rsquo;ve liked or shared. Even the most professional individuals can be unconsciously influenced by views that differ from their own. This bias might affect their perception of you as a candidate, even if they&amp;rsquo;d never admit it to themselves.&lt;/p&gt;</description>
    </item>
    <item>
      <title>About</title>
      <link>https://anatoly.dev/pages/about/</link>
      <pubDate>Tue, 02 Sep 2025 00:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/pages/about/</guid>
      <description>&lt;p&gt;Hi! I&amp;rsquo;m Anatoly Tarnavsky, a Senior Full Stack Engineer with 10+ years of experience building scalable distributed systems and cloud-native applications. Previously worked at Intel as a Senior Backend Developer, focusing on AI/ML infrastructure and Kubernetes-based solutions. You can &lt;a href=&#34;https://anatoly.dev/Anatoly_Tarnavsky_CV.pdf&#34;&gt;download my resume&lt;/a&gt; | &lt;a href=&#34;mailto:anatolyt@gmail.com&#34;&gt;write me an email&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-i-do&#34;&gt;What I do&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backend &amp;amp; Full Stack Development&lt;/strong&gt; - Node.js, Go, React, Vue, TypeScript&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud &amp;amp; DevOps&lt;/strong&gt; - Kubernetes, AWS, Docker, GitOps with ArgoCD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI/ML Infrastructure&lt;/strong&gt; - Building platforms for LLM models and machine learning workloads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Observability &amp;amp; Monitoring&lt;/strong&gt; - Prometheus, OpenTelemetry, distributed systems debugging&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homelab Engineering&lt;/strong&gt; - Production-ready K3S cluster with automated deployments&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;professional-background&#34;&gt;Professional Background&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve worked at companies like Intel, OurCrowd, and IBM, developing everything from payment processing systems to AI model serving platforms. My experience spans microservices architecture, data visualization tools, and enterprise-scale infrastructure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AI Won&#39;t Replace Programmers—At Least Not Anytime Soon</title>
      <link>https://anatoly.dev/posts/2025/08/ai-wont-replace-programmers/</link>
      <pubDate>Sat, 30 Aug 2025 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/08/ai-wont-replace-programmers/</guid>
      <description>&lt;p&gt;I may not be the smartest person in the room, but after working closely with Claude and ChatGPT over the past few months, I want to share some observations. AI won&amp;rsquo;t replace programmers—at least not anytime soon.&lt;/p&gt;
&lt;p&gt;For AI to truly replace programmers, one of two conditions must be met:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Accept that our codebases will eventually become completely unreadable to humans. Once no human can maintain the code, all bugs must be fixed by AI. Inevitably, the AI will encounter a bug it can&amp;rsquo;t solve, and we&amp;rsquo;ll need human programmers to refactor and essentially rewrite everything from scratch.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claude Code: First Impressions - Disturbingly Good</title>
      <link>https://anatoly.dev/posts/2025/08/claude-code-first-impressions/</link>
      <pubDate>Sat, 23 Aug 2025 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/08/claude-code-first-impressions/</guid>
      <description>&lt;p&gt;Just installed and played a little bit with Claude Code, and it&amp;rsquo;s disturbingly good. I played with it for a few hours—it took me that time to write an MCP server from scratch, create a simple OAuth proxy, debug it, and then perform some refactoring to make it modular and maintainable. Yes, without human touch it writes spaghetti code that works but is barely maintainable. However, the nature of programming is changing; you will need to read more than write. But without writing, you won&amp;rsquo;t be able to read and understand.
I think developers with many years of experience who know how to write code and are able to adopt new AI tools will be invaluable, because one such developer can easily replace a small team. But for newcomers, it will be extremely difficult to gain the required experience to work productively with AI tools.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Highest Appreciation an Employee Can Receive</title>
      <link>https://anatoly.dev/posts/2025/08/highest-appreciation-for-employees/</link>
      <pubDate>Sat, 16 Aug 2025 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/08/highest-appreciation-for-employees/</guid>
      <description>&lt;p&gt;You know what the biggest appreciation for an employee is? It&amp;rsquo;s not a title, not a good review, and not even a salary raise.&lt;/p&gt;
&lt;p&gt;The best appreciation comes when your old teammates or managers call you to join them at their new company. When there are no company rules involved, no need to be nice just to keep good work relationships—when your former manager needs to hire someone and remembers you, decides to message or call you to join their new team.&lt;/p&gt;</description>
    </item>
    <item>
      <title>No, AI won’t take jobs from us, not yet.</title>
      <link>https://anatoly.dev/posts/2025/08/ai-struggles-with-complex-tasks/</link>
      <pubDate>Sat, 09 Aug 2025 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2025/08/ai-struggles-with-complex-tasks/</guid>
      <description>&lt;p&gt;No, AI won&amp;rsquo;t take jobs from us, not yet. Claude struggled to write a script to unseal the vault in my k8s cluster until I split the job into small chunks and guided it step by step through what needed to be done.&lt;/p&gt;</description>
    </item>
    <item>
      <title>AnkiMCP</title>
      <link>https://anatoly.dev/projects/ankimcp/</link>
      <pubDate>Wed, 15 Jan 2025 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/projects/ankimcp/</guid>
      <description>MCP server connecting AI assistants to Anki through natural language</description>
    </item>
    <item>
      <title>MCP Server Starter</title>
      <link>https://anatoly.dev/projects/mcp-server-starter/</link>
      <pubDate>Fri, 10 Jan 2025 01:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/projects/mcp-server-starter/</guid>
      <description>Production-ready Model Context Protocol server with OAuth 2.0, structured logging, and enterprise security features</description>
    </item>
    <item>
      <title>Homelab Infrastructure</title>
      <link>https://anatoly.dev/projects/homelab/</link>
      <pubDate>Wed, 01 Jan 2025 10:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/projects/homelab/</guid>
      <description>My personal Kubernetes homelab setup with ArgoCD, monitoring, and various self-hosted services</description>
    </item>
    <item>
      <title>Mastering Asynchrony in the Browser: A Comprehensive Guide</title>
      <link>https://anatoly.dev/posts/2023/05/mastering-asynchrony-in-the-browser-a-comprehensive-guide/</link>
      <pubDate>Wed, 03 May 2023 18:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2023/05/mastering-asynchrony-in-the-browser-a-comprehensive-guide/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Acknowledgements&lt;/p&gt;
&lt;p&gt;This article was originally written in Russian by &lt;a href=&#34;https://habr.com/ru/users/gbiz/posts/&#34;&gt;Grigory Biziukin&lt;/a&gt; and was published on &lt;a href=&#34;https://habr.com/ru/companies/yandex/articles/718084/&#34;&gt;Полное понимание асинхронности в браузере
&lt;/a&gt; on 28/02/2023. I would like to thank &lt;a href=&#34;https://habr.com/ru/users/gbiz/posts/&#34;&gt;Grigory Biziukin&lt;/a&gt; for creating such informative and insightful content.
I have made every effort to accurately translate the content while maintaining the author&amp;rsquo;s original message and intent. However, any errors in translation are solely my own.
I hope that my translation will allow a wider audience to access and appreciate this valuable content, and I encourage readers to visit the original publication or website to read more of &lt;a href=&#34;https://habr.com/ru/users/gbiz/posts/&#34;&gt;Grigory Biziukin&lt;/a&gt;&amp;rsquo;s work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How I Accidentally Reinvented RPC: A Lightweight Alternative to GraphQL</title>
      <link>https://anatoly.dev/posts/2023/05/reinventing-rpc/</link>
      <pubDate>Tue, 02 May 2023 18:00:00 +0000</pubDate>
      <guid>https://anatoly.dev/posts/2023/05/reinventing-rpc/</guid>
      <description>&lt;p&gt;&lt;em&gt;Author&amp;rsquo;s Note (2025): When I originally wrote this article, I didn&amp;rsquo;t realize I was essentially reinventing RPC (Remote Procedure Call) - a pattern that&amp;rsquo;s been around for decades. What I built here is very similar to JSON-RPC over HTTP, just without knowing it had a name! Today, I&amp;rsquo;d recommend using battle-tested solutions like tRPC or oRPC which provide the same benefits I was seeking (type safety, simplicity, single endpoint) but with better tooling, community support, and production-readiness. However, I&amp;rsquo;m keeping this article as-is because building this from scratch taught me valuable lessons about API design, and sometimes reinventing the wheel is the best way to understand why the wheel is shaped the way it is.&lt;/em&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
