<?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</title>
    <description>The most recent home feed on DEV Community.</description>
    <link>https://dev.to</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/rss"/>
    <language>en</language>
    <item>
      <title>I Built a Random Word Generator… Then Realized How Often People Get Stuck</title>
      <dc:creator>Bhavin Sheth</dc:creator>
      <pubDate>Tue, 12 May 2026 04:01:44 +0000</pubDate>
      <link>https://dev.to/bhavin-allinonetools/i-built-a-random-word-generator-then-realized-how-often-people-get-stuck-4le7</link>
      <guid>https://dev.to/bhavin-allinonetools/i-built-a-random-word-generator-then-realized-how-often-people-get-stuck-4le7</guid>
      <description>&lt;h2&gt;
  
  
  🚨 The Problem Wasn’t “Lack of Ideas”
&lt;/h2&gt;

&lt;p&gt;It was something smaller.&lt;/p&gt;

&lt;p&gt;And honestly… more annoying.&lt;/p&gt;

&lt;p&gt;I’d sit there trying to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name something&lt;/li&gt;
&lt;li&gt;Start writing&lt;/li&gt;
&lt;li&gt;Think of an example&lt;/li&gt;
&lt;li&gt;Create test content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And suddenly my brain would go completely blank.&lt;/p&gt;

&lt;p&gt;Not because I had no ideas.&lt;/p&gt;

&lt;p&gt;But because:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Starting is weirdly hard.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  😐 The Funny Part?
&lt;/h2&gt;

&lt;p&gt;Sometimes all you need is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One random word&lt;/li&gt;
&lt;li&gt;One unexpected idea&lt;/li&gt;
&lt;li&gt;One small trigger&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And suddenly your brain starts moving again.&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Why I Built This Tool
&lt;/h2&gt;

&lt;p&gt;So I built something simple:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://allinonetools.net/random-word-generator/" rel="noopener noreferrer"&gt;Random Word Generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A tool that instantly generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Random words&lt;/li&gt;
&lt;li&gt;Creative prompts&lt;/li&gt;
&lt;li&gt;Naming inspiration&lt;/li&gt;
&lt;li&gt;Brainstorming triggers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No signup.&lt;br&gt;
No setup.&lt;br&gt;
No overthinking.&lt;/p&gt;

&lt;p&gt;Just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Click → Get a word → Keep going&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧠 What I Realized
&lt;/h2&gt;

&lt;p&gt;People don’t always use random words for “fun”&lt;/p&gt;

&lt;p&gt;They use them when they’re:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stuck&lt;/li&gt;
&lt;li&gt;Overthinking&lt;/li&gt;
&lt;li&gt;Brainstorming&lt;/li&gt;
&lt;li&gt;Naming projects&lt;/li&gt;
&lt;li&gt;Practicing writing&lt;/li&gt;
&lt;li&gt;Testing UI/content&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ The Real Frustration
&lt;/h2&gt;

&lt;p&gt;Creative blocks rarely look dramatic.&lt;/p&gt;

&lt;p&gt;Usually it’s just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sitting there… thinking too long about one tiny thing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And the longer you wait…&lt;/p&gt;

&lt;p&gt;👉 The harder it becomes to start.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Why Random Inputs Actually Help
&lt;/h2&gt;

&lt;p&gt;A random word forces your brain to react.&lt;/p&gt;

&lt;p&gt;Even if the word isn’t perfect…&lt;/p&gt;

&lt;p&gt;It creates movement.&lt;/p&gt;

&lt;p&gt;And honestly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Movement is usually more important than the “perfect idea”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  😬 Where Most Tools Feel Wrong
&lt;/h2&gt;

&lt;p&gt;A lot of generators online feel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cluttered&lt;/li&gt;
&lt;li&gt;Slow&lt;/li&gt;
&lt;li&gt;Filled with ads&lt;/li&gt;
&lt;li&gt;Trying too hard to be “creative”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this use case is simple.&lt;/p&gt;

&lt;p&gt;You just want:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One quick spark.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔥 What I Focused On
&lt;/h2&gt;

&lt;p&gt;I kept it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Minimal&lt;/li&gt;
&lt;li&gt;Instant&lt;/li&gt;
&lt;li&gt;Distraction-free&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because this tool isn’t about features.&lt;/p&gt;

&lt;p&gt;It’s about:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Breaking mental friction.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📈 What Surprised Me
&lt;/h2&gt;

&lt;p&gt;After launching it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some people used it for writing prompts&lt;/li&gt;
&lt;li&gt;Others used it for project naming&lt;/li&gt;
&lt;li&gt;Developers used it for dummy content/testing&lt;/li&gt;
&lt;li&gt;Students used it for practice exercises&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And honestly…&lt;/p&gt;

&lt;p&gt;👉 The variety surprised me most.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤯 The Real Insight
&lt;/h2&gt;

&lt;p&gt;Sometimes the hardest part of creativity is not the work itself.&lt;/p&gt;

&lt;p&gt;It’s simply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Getting started.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 Simple Rule I Follow Now
&lt;/h2&gt;

&lt;p&gt;If users feel stuck…&lt;/p&gt;

&lt;p&gt;👉 Reduce the pressure to be “perfect”&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Final Thought
&lt;/h2&gt;

&lt;p&gt;You don’t always need a big idea.&lt;/p&gt;

&lt;p&gt;Sometimes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One random word is enough to restart your brain.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Be honest — what do you usually do when your brain goes blank?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take a break?&lt;/li&gt;
&lt;li&gt;Search inspiration?&lt;/li&gt;
&lt;li&gt;Force yourself to continue? 😅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Curious how others handle it 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>productivity</category>
      <category>writing</category>
    </item>
    <item>
      <title>A Physics-Aware React Design System for Modern Frontend Architecture</title>
      <dc:creator>Limon</dc:creator>
      <pubDate>Tue, 12 May 2026 04:01:16 +0000</pubDate>
      <link>https://dev.to/limonkhan669/a-physics-aware-react-design-system-for-modern-frontend-architecture-kj7</link>
      <guid>https://dev.to/limonkhan669/a-physics-aware-react-design-system-for-modern-frontend-architecture-kj7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;How I built a scalable React component ecosystem with Liquid Glass UI, token-driven theming, ITCSS architecture, accessibility-first APIs, and physics-reactive rendering.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Modern frontend development has evolved far beyond styling buttons and shipping pages.&lt;/p&gt;

&lt;p&gt;Today’s applications require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scalable component systems&lt;/li&gt;
&lt;li&gt;accessible interfaces&lt;/li&gt;
&lt;li&gt;runtime theming&lt;/li&gt;
&lt;li&gt;predictable architecture&lt;/li&gt;
&lt;li&gt;performance-aware rendering&lt;/li&gt;
&lt;li&gt;animation systems&lt;/li&gt;
&lt;li&gt;design token synchronization&lt;/li&gt;
&lt;li&gt;developer tooling&lt;/li&gt;
&lt;li&gt;maintainable APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most UI libraries solve only a portion of these problems.&lt;/p&gt;

&lt;p&gt;Some provide components.&lt;br&gt;
Some provide styling.&lt;br&gt;
Some provide theming.&lt;br&gt;
Some focus on animations.&lt;/p&gt;

&lt;p&gt;Very few attempt to unify all of them into a single frontend architecture system.&lt;/p&gt;

&lt;p&gt;That became the motivation behind &lt;strong&gt;Atomix&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;⚛️ Atomix is a modern React design system and component architecture framework built to combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;enterprise-grade component patterns&lt;/li&gt;
&lt;li&gt;token-based theming&lt;/li&gt;
&lt;li&gt;accessibility-first APIs&lt;/li&gt;
&lt;li&gt;physics-aware visual rendering&lt;/li&gt;
&lt;li&gt;ITCSS + Sass architecture&lt;/li&gt;
&lt;li&gt;Storybook-driven development&lt;/li&gt;
&lt;li&gt;tree-shakable package exports&lt;/li&gt;
&lt;li&gt;CLI-based tooling&lt;/li&gt;
&lt;li&gt;modern DX workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project started as a small internal component system.&lt;br&gt;
Over time, it evolved into something much larger.&lt;/p&gt;

&lt;p&gt;Today, Atomix includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;50+ typed React components&lt;/li&gt;
&lt;li&gt;a physics-reactive Liquid Glass rendering engine&lt;/li&gt;
&lt;li&gt;a configurable theme compiler&lt;/li&gt;
&lt;li&gt;a CLI toolchain&lt;/li&gt;
&lt;li&gt;multiple package entry points&lt;/li&gt;
&lt;li&gt;chart systems&lt;/li&gt;
&lt;li&gt;accessibility tooling&lt;/li&gt;
&lt;li&gt;runtime theme injection&lt;/li&gt;
&lt;li&gt;utility-first architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article explores the architecture decisions, rendering systems, and engineering concepts behind Atomix.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Problem with Most Component Libraries
&lt;/h2&gt;

&lt;p&gt;Most component libraries eventually run into the same limitations.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Styling Becomes Fragile
&lt;/h2&gt;

&lt;p&gt;Applications start small.&lt;br&gt;
Then CSS grows.&lt;br&gt;
Then overrides appear.&lt;br&gt;
Then theme exceptions appear.&lt;br&gt;
Then design inconsistencies spread.&lt;/p&gt;

&lt;p&gt;Without a strict architecture system, frontend codebases become difficult to maintain.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Components Are Not Truly Reusable
&lt;/h2&gt;

&lt;p&gt;A component may look reusable, but often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;styles are tightly coupled&lt;/li&gt;
&lt;li&gt;theming is incomplete&lt;/li&gt;
&lt;li&gt;accessibility is inconsistent&lt;/li&gt;
&lt;li&gt;APIs are rigid&lt;/li&gt;
&lt;li&gt;motion systems are disconnected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;True reusability requires architectural consistency.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Most Design Systems Ignore Motion
&lt;/h2&gt;

&lt;p&gt;Animation is often treated as decoration.&lt;/p&gt;

&lt;p&gt;But modern interfaces increasingly rely on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;motion feedback&lt;/li&gt;
&lt;li&gt;physics&lt;/li&gt;
&lt;li&gt;transitions&lt;/li&gt;
&lt;li&gt;interaction-driven rendering&lt;/li&gt;
&lt;li&gt;spatial continuity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Motion is part of UX.&lt;/p&gt;

&lt;p&gt;Atomix was designed with that idea from the beginning.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Vision Behind Atomix
&lt;/h2&gt;

&lt;p&gt;The goal was never just “another React UI library.”&lt;/p&gt;

&lt;p&gt;The vision was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a frontend architecture system where design tokens, components, accessibility, motion, rendering, and developer tooling work together as a unified ecosystem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That meant focusing on several core principles.&lt;/p&gt;


&lt;h2&gt;
  
  
  Core Principles
&lt;/h2&gt;
&lt;h2&gt;
  
  
  1. Architecture First
&lt;/h2&gt;

&lt;p&gt;Atomix follows a strict system-oriented philosophy.&lt;/p&gt;

&lt;p&gt;The project uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ITCSS&lt;/li&gt;
&lt;li&gt;layered Sass architecture&lt;/li&gt;
&lt;li&gt;token-driven styling&lt;/li&gt;
&lt;li&gt;utility namespaces&lt;/li&gt;
&lt;li&gt;predictable component APIs&lt;/li&gt;
&lt;li&gt;isolated rendering systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This creates long-term maintainability.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Accessibility by Default
&lt;/h2&gt;

&lt;p&gt;Accessibility should not be optional.&lt;/p&gt;

&lt;p&gt;Every component is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keyboard navigation&lt;/li&gt;
&lt;li&gt;ARIA attributes&lt;/li&gt;
&lt;li&gt;focus management&lt;/li&gt;
&lt;li&gt;screen reader support&lt;/li&gt;
&lt;li&gt;reduced motion awareness&lt;/li&gt;
&lt;li&gt;semantic HTML patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Atomix targets WCAG 2.1 AA compliance.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Performance Matters
&lt;/h2&gt;

&lt;p&gt;Modern frontend systems can easily become bloated.&lt;/p&gt;

&lt;p&gt;Atomix focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tree-shakable exports&lt;/li&gt;
&lt;li&gt;lazy-loaded heavy components&lt;/li&gt;
&lt;li&gt;isolated package entry points&lt;/li&gt;
&lt;li&gt;runtime performance optimization&lt;/li&gt;
&lt;li&gt;GPU-accelerated rendering&lt;/li&gt;
&lt;li&gt;adaptive animation quality&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  4. Motion Is Part of the System
&lt;/h2&gt;

&lt;p&gt;Interfaces should feel responsive and alive.&lt;/p&gt;

&lt;p&gt;That led to one of the most experimental parts of Atomix:&lt;/p&gt;
&lt;h2&gt;
  
  
  AtomixGlass
&lt;/h2&gt;


&lt;h2&gt;
  
  
  AtomixGlass — Building a Physics-Reactive Glassmorphism Engine
&lt;/h2&gt;

&lt;p&gt;Glassmorphism became extremely popular across modern interfaces.&lt;/p&gt;

&lt;p&gt;But most implementations are static.&lt;/p&gt;

&lt;p&gt;Usually it’s just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;backdrop-filter&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;blur&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;20&lt;/span&gt;&lt;span class="nt"&gt;px&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wanted something more dynamic.&lt;/p&gt;

&lt;p&gt;Something that reacted to motion.&lt;br&gt;
Something that felt physical.&lt;br&gt;
Something closer to real optical distortion.&lt;/p&gt;

&lt;p&gt;That became AtomixGlass.&lt;/p&gt;


&lt;h2&gt;
  
  
  What AtomixGlass Does
&lt;/h2&gt;

&lt;p&gt;AtomixGlass is a rendering layer that provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;backdrop blur&lt;/li&gt;
&lt;li&gt;SVG displacement distortion&lt;/li&gt;
&lt;li&gt;shader-based rendering&lt;/li&gt;
&lt;li&gt;spring physics elasticity&lt;/li&gt;
&lt;li&gt;velocity-aware gradients&lt;/li&gt;
&lt;li&gt;chromatic aberration&lt;/li&gt;
&lt;li&gt;adaptive FPS rendering&lt;/li&gt;
&lt;li&gt;cursor-reactive deformation&lt;/li&gt;
&lt;li&gt;reduced-motion accessibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of static blur, the surface behaves like a physical material.&lt;/p&gt;


&lt;h2&gt;
  
  
  Rendering Modes
&lt;/h2&gt;

&lt;p&gt;AtomixGlass supports multiple rendering strategies.&lt;/p&gt;
&lt;h2&gt;
  
  
  Standard Mode
&lt;/h2&gt;

&lt;p&gt;A lightweight SVG-based displacement effect.&lt;/p&gt;

&lt;p&gt;Good for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cards&lt;/li&gt;
&lt;li&gt;buttons&lt;/li&gt;
&lt;li&gt;lightweight UI&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Polar Mode
&lt;/h2&gt;

&lt;p&gt;Applies radial distortion patterns.&lt;/p&gt;

&lt;p&gt;Useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;immersive panels&lt;/li&gt;
&lt;li&gt;hero sections&lt;/li&gt;
&lt;li&gt;futuristic UI&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Prominent Mode
&lt;/h2&gt;

&lt;p&gt;Increases deformation intensity.&lt;/p&gt;

&lt;p&gt;Designed for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interactive demos&lt;/li&gt;
&lt;li&gt;marketing experiences&lt;/li&gt;
&lt;li&gt;motion-heavy layouts&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Shader Mode
&lt;/h2&gt;

&lt;p&gt;The most advanced rendering mode.&lt;/p&gt;

&lt;p&gt;This uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GLSL-inspired displacement techniques&lt;/li&gt;
&lt;li&gt;off-thread calculations&lt;/li&gt;
&lt;li&gt;cached distortion maps&lt;/li&gt;
&lt;li&gt;adaptive frame scheduling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result feels much closer to dynamic liquid glass.&lt;/p&gt;


&lt;h2&gt;
  
  
  Physics-Aware Interaction
&lt;/h2&gt;

&lt;p&gt;One of the most important ideas behind AtomixGlass was elasticity.&lt;/p&gt;

&lt;p&gt;The system tracks motion velocity and applies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stretch&lt;/li&gt;
&lt;li&gt;deformation&lt;/li&gt;
&lt;li&gt;border intensity shifts&lt;/li&gt;
&lt;li&gt;displacement updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;using spring-based calculations.&lt;/p&gt;

&lt;p&gt;This creates interfaces that feel reactive rather than static.&lt;/p&gt;


&lt;h2&gt;
  
  
  Accessibility and Motion
&lt;/h2&gt;

&lt;p&gt;Motion systems can become problematic for accessibility.&lt;/p&gt;

&lt;p&gt;That’s why AtomixGlass respects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;prefers-reduced-motion&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When reduced motion is enabled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;animations decrease&lt;/li&gt;
&lt;li&gt;distortions soften&lt;/li&gt;
&lt;li&gt;rendering loops reduce intensity&lt;/li&gt;
&lt;li&gt;transitions become simpler&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Accessibility remains part of the architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building the Theme Engine
&lt;/h2&gt;

&lt;p&gt;The second major challenge was theming.&lt;/p&gt;

&lt;p&gt;Most design systems eventually struggle with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;color overrides&lt;/li&gt;
&lt;li&gt;spacing consistency&lt;/li&gt;
&lt;li&gt;dark mode&lt;/li&gt;
&lt;li&gt;runtime themes&lt;/li&gt;
&lt;li&gt;token synchronization&lt;/li&gt;
&lt;li&gt;CSS drift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Atomix solves this using a token-driven architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Token-Based Theming
&lt;/h2&gt;

&lt;p&gt;Atomix uses CSS custom properties as the foundation.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;defineConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@shohojdhara/atomix/config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#7AFFD7&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="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;This allows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runtime theme injection&lt;/li&gt;
&lt;li&gt;theme extension&lt;/li&gt;
&lt;li&gt;token synchronization&lt;/li&gt;
&lt;li&gt;dynamic overrides&lt;/li&gt;
&lt;li&gt;predictable design systems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Runtime Theme Injection
&lt;/h2&gt;

&lt;p&gt;Themes can also be injected dynamically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;injectTheme&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@shohojdhara/atomix/theme&lt;/span&gt;&lt;span class="dl"&gt;'&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;css&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createTheme&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;injectTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes it possible to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;switch themes instantly&lt;/li&gt;
&lt;li&gt;generate runtime themes&lt;/li&gt;
&lt;li&gt;support multi-brand systems&lt;/li&gt;
&lt;li&gt;power white-label applications&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why ITCSS?
&lt;/h2&gt;

&lt;p&gt;Many developers ask why Atomix still heavily uses Sass and ITCSS.&lt;/p&gt;

&lt;p&gt;The reason is architectural predictability.&lt;/p&gt;

&lt;p&gt;Atomix uses layered styling:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Settings&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;Generic&lt;/li&gt;
&lt;li&gt;Elements&lt;/li&gt;
&lt;li&gt;Objects&lt;/li&gt;
&lt;li&gt;Components&lt;/li&gt;
&lt;li&gt;Utilities&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This prevents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;specificity wars&lt;/li&gt;
&lt;li&gt;random overrides&lt;/li&gt;
&lt;li&gt;inconsistent styling patterns&lt;/li&gt;
&lt;li&gt;scaling issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Large frontend systems need structure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Utility Architecture
&lt;/h2&gt;

&lt;p&gt;Atomix includes utility classes with strict namespacing.&lt;/p&gt;

&lt;p&gt;Everything uses the &lt;code&gt;u-&lt;/code&gt; prefix.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"u-flex u-gap-4 u-items-center"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;naming collisions&lt;/li&gt;
&lt;li&gt;CSS ambiguity&lt;/li&gt;
&lt;li&gt;framework conflicts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is controlled flexibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tree-Shakable Architecture
&lt;/h2&gt;

&lt;p&gt;Large UI systems often become bundle-size problems.&lt;/p&gt;

&lt;p&gt;Atomix solves this using segmented entry points.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@shohojdhara/atomix/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;LineChart&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@shohojdhara/atomix/charts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures applications only load what they need.&lt;/p&gt;




&lt;h2&gt;
  
  
  Building the CLI Toolchain
&lt;/h2&gt;

&lt;p&gt;As the project grew, configuration became increasingly important.&lt;/p&gt;

&lt;p&gt;That led to the Atomix CLI.&lt;/p&gt;

&lt;p&gt;The CLI handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;component generation&lt;/li&gt;
&lt;li&gt;token synchronization&lt;/li&gt;
&lt;li&gt;migrations&lt;/li&gt;
&lt;li&gt;diagnostics&lt;/li&gt;
&lt;li&gt;validation&lt;/li&gt;
&lt;li&gt;theme building&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atomix generate component Button
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;atomix tokens &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is to reduce repetitive engineering work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Storybook-Driven Development
&lt;/h2&gt;

&lt;p&gt;Every Atomix component is developed inside Storybook.&lt;/p&gt;

&lt;p&gt;This improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;visual testing&lt;/li&gt;
&lt;li&gt;interaction testing&lt;/li&gt;
&lt;li&gt;accessibility inspection&lt;/li&gt;
&lt;li&gt;isolated rendering&lt;/li&gt;
&lt;li&gt;documentation quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ecosystem uses Storybook 8 with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a11y addons&lt;/li&gt;
&lt;li&gt;interaction testing&lt;/li&gt;
&lt;li&gt;viewport testing&lt;/li&gt;
&lt;li&gt;measurement tools&lt;/li&gt;
&lt;li&gt;outline debugging&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Component Philosophy
&lt;/h2&gt;

&lt;p&gt;Atomix components are intentionally designed around composability.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;polymorphic rendering&lt;/li&gt;
&lt;li&gt;slot-based composition&lt;/li&gt;
&lt;li&gt;accessibility-first APIs&lt;/li&gt;
&lt;li&gt;controlled + uncontrolled states&lt;/li&gt;
&lt;li&gt;motion-aware interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;
  &lt;span class="na"&gt;as&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt;
  &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/dashboard"&lt;/span&gt;
  &lt;span class="na"&gt;LinkComponent&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Link&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  Dashboard
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows seamless integration with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;React Router&lt;/li&gt;
&lt;li&gt;custom navigation systems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Charts as First-Class Components
&lt;/h2&gt;

&lt;p&gt;Another goal was avoiding fragmented visualization systems.&lt;/p&gt;

&lt;p&gt;Atomix includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LineChart&lt;/li&gt;
&lt;li&gt;HeatmapChart&lt;/li&gt;
&lt;li&gt;TreemapChart&lt;/li&gt;
&lt;li&gt;RadarChart&lt;/li&gt;
&lt;li&gt;FunnelChart&lt;/li&gt;
&lt;li&gt;GaugeChart&lt;/li&gt;
&lt;li&gt;CandlestickChart&lt;/li&gt;
&lt;li&gt;and more&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All charts follow the same design-token architecture.&lt;/p&gt;

&lt;p&gt;That creates consistency across applications.&lt;/p&gt;




&lt;h2&gt;
  
  
  Developer Experience Matters
&lt;/h2&gt;

&lt;p&gt;One of the biggest lessons from frontend engineering is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Good DX improves product quality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Atomix prioritizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TypeScript-first APIs&lt;/li&gt;
&lt;li&gt;strict typing&lt;/li&gt;
&lt;li&gt;IntelliSense support&lt;/li&gt;
&lt;li&gt;consistent naming&lt;/li&gt;
&lt;li&gt;discoverable architecture&lt;/li&gt;
&lt;li&gt;scalable imports&lt;/li&gt;
&lt;li&gt;Storybook documentation&lt;/li&gt;
&lt;li&gt;CLI tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Frontend tooling should accelerate development rather than slow it down.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned While Building Atomix
&lt;/h2&gt;

&lt;p&gt;Building a design system teaches you a lot about frontend engineering.&lt;/p&gt;

&lt;p&gt;Some of the biggest lessons:&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Consistency Beats Complexity
&lt;/h2&gt;

&lt;p&gt;Fancy abstractions are useless if developers cannot understand them.&lt;/p&gt;

&lt;p&gt;Predictability matters more than cleverness.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Motion Requires Restraint
&lt;/h2&gt;

&lt;p&gt;Animation can easily become overwhelming.&lt;/p&gt;

&lt;p&gt;The best motion systems enhance usability without distracting users.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Accessibility Must Exist From Day One
&lt;/h2&gt;

&lt;p&gt;Retrofitting accessibility later becomes extremely difficult.&lt;/p&gt;

&lt;p&gt;It needs to be foundational.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Architecture Is a Long-Term Investment
&lt;/h2&gt;

&lt;p&gt;Small projects can survive chaotic CSS.&lt;/p&gt;

&lt;p&gt;Large systems cannot.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Future of Atomix
&lt;/h2&gt;

&lt;p&gt;Atomix is still evolving.&lt;/p&gt;

&lt;p&gt;Planned areas include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;advanced animation primitives&lt;/li&gt;
&lt;li&gt;design token pipelines&lt;/li&gt;
&lt;li&gt;visual editors&lt;/li&gt;
&lt;li&gt;AI-assisted theme generation&lt;/li&gt;
&lt;li&gt;rendering optimizations&lt;/li&gt;
&lt;li&gt;WebGPU experiments&lt;/li&gt;
&lt;li&gt;advanced chart tooling&lt;/li&gt;
&lt;li&gt;layout engines&lt;/li&gt;
&lt;li&gt;motion orchestration systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The long-term vision is ambitious:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a complete frontend architecture ecosystem for modern applications.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Frontend development is no longer just about building pages.&lt;/p&gt;

&lt;p&gt;We are designing systems.&lt;/p&gt;

&lt;p&gt;The future belongs to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;scalable architecture&lt;/li&gt;
&lt;li&gt;accessible experiences&lt;/li&gt;
&lt;li&gt;motion-aware interfaces&lt;/li&gt;
&lt;li&gt;token-driven design&lt;/li&gt;
&lt;li&gt;performance-focused rendering&lt;/li&gt;
&lt;li&gt;developer-first tooling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Atomix is my attempt to bring those ideas together into a single ecosystem.&lt;/p&gt;

&lt;p&gt;Still experimental.&lt;br&gt;
Still evolving.&lt;br&gt;
Still growing.&lt;/p&gt;

&lt;p&gt;But the direction is clear.&lt;/p&gt;

&lt;p&gt;Frontend systems should feel engineered — not assembled.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Shohojdhara/atomix" rel="noopener noreferrer"&gt;https://github.com/Shohojdhara/atomix&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/@shohojdhara/atomix" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@shohojdhara/atomix&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Package: @shohojdhara/atomix&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Thanks for reading ⚛️&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>react</category>
      <category>frontend</category>
      <category>designsystem</category>
    </item>
    <item>
      <title>Run Claude Code Locally for Free with Docker Model Runner</title>
      <dc:creator>Pradumna Saraf</dc:creator>
      <pubDate>Tue, 12 May 2026 03:56:26 +0000</pubDate>
      <link>https://dev.to/pradumnasaraf/run-claude-code-locally-for-free-with-docker-model-runner-3o27</link>
      <guid>https://dev.to/pradumnasaraf/run-claude-code-locally-for-free-with-docker-model-runner-3o27</guid>
      <description>&lt;p&gt;We know that the Claude Code is phenomenal for development and code. But we can easily run out of tokens, and it becomes quickly expensive as your project becomes more complex. What if we can keep all the good parts about the Claude Code, but use the local models instead of clouds once from Anthropic?&lt;/p&gt;

&lt;p&gt;Another reason we want to use the local models is that we have something proprietary or private that we don't want to expose to the cloud models, or we are in flight with no internet connection.&lt;/p&gt;

&lt;p&gt;This is where Docker Model Runner is really useful; it helps us run the LLMs very easily locally on our machine, and we will then we will do some configuration to make it work with the Claude Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we begin, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Docker Desktop or Docker Engine installed.&lt;/li&gt;
&lt;li&gt;  Docker Model Runner enabled.&lt;/li&gt;
&lt;li&gt;  Claude Code is installed and ready to go.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're on Docker Desktop, head over to &lt;strong&gt;Settings &amp;gt; AI&lt;/strong&gt; and enable TCP access for Model Runner. &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%2Fym8axt8e7igb8k4ax3xv.png" 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%2Fym8axt8e7igb8k4ax3xv.png" alt="docker desktop screenshot" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or, if you prefer the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker desktop &lt;span class="nb"&gt;enable &lt;/span&gt;model-runner &lt;span class="nt"&gt;--tcp&lt;/span&gt; 12434
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Choosing and pulling a local model
&lt;/h3&gt;

&lt;p&gt;There are a load of LLMs to choose from. I'll go with &lt;code&gt;ai/phi4:14B-Q4_K_M&lt;/code&gt;, but you can pick whatever fits your machine can handle.&lt;/p&gt;

&lt;p&gt;You can find all the models here in the &lt;a href="https://hub.docker.com/u/ai" rel="noopener noreferrer"&gt;DocketHub AI catalogue&lt;/a&gt;. Make sure that whenever you choose a model that is good on the coding side.&lt;/p&gt;

&lt;p&gt;To pull the model, execute the command below. Pull time depends on the size of the model.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker model pull ai/phi4:14B-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Checking the connection
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;docker model&lt;/code&gt; sub-commands, we can check various things like the status and the model we have pulled. It's very similar to how we work with Docker images and containers.&lt;/p&gt;

&lt;p&gt;Run the command below to check the model status and the list of models we have&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker model status
docker model &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F47wgmbq626hdlky3a9y5.png" 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%2F47wgmbq626hdlky3a9y5.png" alt="terminal screenshot" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Testing the endpoint
&lt;/h3&gt;

&lt;p&gt;Before we jump to test and use Claude Code, we should confirm that the API is actually responding. We can &lt;code&gt;curl&lt;/code&gt; and send the request to the &lt;code&gt;/v1/messages&lt;/code&gt; endpoint, and check that.&lt;/p&gt;

&lt;p&gt;This is how the curl structure will look. Let's execute it in the terminal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:12434/v1/messages &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "ai/phi4:14B-Q4_K_M",
    "max_tokens": 100,
    "messages": [{"role": "user", "content": "Hello!"}]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will get a response like this. I am using &lt;code&gt;jq&lt;/code&gt; to better format the output.&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%2Fdfh3m52agzjj7ld4pdz9.png" 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%2Fdfh3m52agzjj7ld4pdz9.png" alt="terminal screenshot" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4: Pointing Claude Code at the local endpoint
&lt;/h3&gt;

&lt;p&gt;It is very simple. We just need to tell Claude Code to use the local API instead of Anthropic's. We can do it by setting up a variable and a model name.&lt;/p&gt;

&lt;p&gt;Set the &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; environment variable to use the Docker Model Runner endpoint and pass the model name we pull with &lt;code&gt;--model&lt;/code&gt;. Execute the command below to set that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:12434 claude &lt;span class="nt"&gt;--model&lt;/span&gt; ai/devstral-small-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fzlfaepn5uxa99ey7e70i.png" 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%2Fzlfaepn5uxa99ey7e70i.png" alt="terminal screenshot" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's about it. Claude Code is now pointing and running against your local model. You can also see the model being used by the Claude Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  5: Adding the Shell config
&lt;/h3&gt;

&lt;p&gt;As we know, the environment variable &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; is not persistent, and only lives for that session of the terminal. Setting the env variable every time is annoying.&lt;/p&gt;

&lt;p&gt;To make it permanent so that every time you openup and new terminal, you have the same setup, we need to add the below shell config (&lt;code&gt;~/.zshrc&lt;/code&gt;, &lt;code&gt;~/.bashrc&lt;/code&gt;, etc):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:12434
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you've done this. Restart your terminal, now the Claude Code will always use your local endpoint when you pass &lt;code&gt;--model&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Using the Claude Code
&lt;/h3&gt;

&lt;p&gt;Now, everything is set. Let's run Claude's code. To run with the local model, pass the same model flag and name, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--model&lt;/span&gt; ai/phi4:14B-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we can give some simple tasks to check it's working:&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%2Ffjcs8o0hay2r6vdo9vff.png" 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%2Ffjcs8o0hay2r6vdo9vff.png" alt="terminal screenshot" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Watching the requests flow
&lt;/h3&gt;

&lt;p&gt;If you are a bit nerdy like me, and want to see what is happening under the hood. You can actually watch every request Claude Code is making to your local model:&lt;/p&gt;

&lt;p&gt;To do that, execute the command below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker model requests &lt;span class="nt"&gt;--model&lt;/span&gt; ai/phi4:14B-Q4_K_M
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fx7kjm21rfmdgk4wi3ssb.png" 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%2Fx7kjm21rfmdgk4wi3ssb.png" alt="terminal screenshot" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Again, we used &lt;code&gt;jq&lt;/code&gt; for better formatting.&lt;/p&gt;

&lt;h3&gt;
  
  
  7: What next?
&lt;/h3&gt;

&lt;p&gt;The default context size on most models is fine for small tasks, but Claude Code reads a lot of files. For big project work, you'll want more headroom and a bigger context.&lt;/p&gt;

&lt;p&gt;For example, to package &lt;code&gt;gpt-oss&lt;/code&gt; with a 32k context window:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker model pull ai/gpt-oss
docker model package &lt;span class="nt"&gt;--from&lt;/span&gt; ai/gpt-oss &lt;span class="nt"&gt;--context-size&lt;/span&gt; 32000 gpt-oss:32k
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run Claude Code with the new variant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;--model&lt;/span&gt; gpt-oss:32k
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And this is the game: we keep trying and experimenting with different models and context sizes until we find a perfect model for a task.&lt;/p&gt;

&lt;p&gt;That was it. That's how you can run Claude Code completely locally with Docker Model Runner.&lt;/p&gt;

&lt;p&gt;Give it a try, and let me know what model works best for you. &lt;/p&gt;

&lt;p&gt;As always, I'm glad you made it to the end. Thank you for your support and reading. I regularly share tips on &lt;a href="https://x.com/pradumna_saraf" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;. You can connect with me there.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>ai</category>
      <category>development</category>
      <category>agents</category>
    </item>
    <item>
      <title>The Lie of Time Management: Why Your Energy is the Real Bottleneck</title>
      <dc:creator>Hamza Hasanain</dc:creator>
      <pubDate>Tue, 12 May 2026 03:53:56 +0000</pubDate>
      <link>https://dev.to/hamzahassanain0/the-lie-of-time-management-why-your-energy-is-the-real-bottleneck-4lc6</link>
      <guid>https://dev.to/hamzahassanain0/the-lie-of-time-management-why-your-energy-is-the-real-bottleneck-4lc6</guid>
      <description>&lt;p&gt;I recently tried a very foolish experiment. I decided to overwhelm myself with a massive workload to force myself to learn better time management. Between juggling university coursework, optimizing cloud infrastructure for Repovive, and grinding through AWS architecture study sessions, I mapped out every hour of my day. &lt;/p&gt;

&lt;p&gt;I failed miserably.&lt;/p&gt;

&lt;p&gt;But from that failure, I discovered a crucial truth: &lt;strong&gt;Time management is an overrated concept.&lt;/strong&gt; The problem has never been a lack of time. The problem is entirely your energy as a human being.&lt;/p&gt;

&lt;p&gt;Your energy is your daily currency. You spend it throughout the day on decisions, complex logic, and effort until your balance is depleted. Everything around us, especially in the tech industry, seems designed to drain this balance without us even noticing.&lt;/p&gt;

&lt;p&gt;Here is the reality of what is actually stealing your energy, why we avoid hard tasks, and how to stop the leak.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Procrastination Myth
&lt;/h3&gt;

&lt;p&gt;We often think we procrastinate because we are out of time or lack discipline. But psychological research paints a different picture. According to Dr. Tim Pychyl, author of &lt;em&gt;Solving the Procrastination Puzzle&lt;/em&gt;, procrastination is not a time management issue; it is an emotional regulation problem. &lt;/p&gt;

&lt;p&gt;As developers, we procrastinate to avoid the immediate negative emotions—like anxiety, frustration, or the intimidation of a blank IDE—associated with a complex task. When your energy is already low, you simply do not have the internal currency left to fight those negative feelings, so your brain seeks a quick dopamine hit elsewhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Silent Energy Drains for Developers
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Context Switching and The "Quick Check"
&lt;/h4&gt;

&lt;p&gt;Those five minutes you spend checking your phone, replying to a Slack ping, or glancing at a Jira board don't just waste time; they burn your mental currency. &lt;/p&gt;

&lt;p&gt;When you are deep in a complex problem—like holding the architecture of a distributed submission pipeline in your head or debugging a custom C++ allocator—your brain builds a massive, fragile mental model. Research by Gloria Mark at UC Irvine shows that it takes an average of 23 minutes and 15 seconds to return to your original state of flow after an interruption. Tearing down and rebuilding that mental model multiple times a day is exhausting.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. The Morning Coffee Trap
&lt;/h4&gt;

&lt;p&gt;Drinking coffee the second you wake up is actively setting you up for a mid-day crash. &lt;/p&gt;

&lt;p&gt;According to neurobiologist Dr. Andrew Huberman of Stanford University, caffeine doesn't give you energy; it blocks adenosine, the brain chemical that makes you feel sleepy. If you drink coffee immediately, the adenosine continues to build up in the background. Once the caffeine metabolizes, you are hit with a massive backlog of adenosine all at once, causing your brain to shut down in the middle of the afternoon. &lt;/p&gt;

&lt;p&gt;Delay your coffee by 90 to 120 minutes after waking up. Let your body's natural cortisol spike clear out the morning adenosine first.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Mental Load and Analysis Paralysis
&lt;/h4&gt;

&lt;p&gt;Giving tasks more mental weight than they deserve drains your reserves fast. Staring at the screen, agonizing over the absolute most optimal database schema or over-engineering a simple microservice, burns more energy than actually writing the code. Overthinking is a massive energy leak. Often, writing a naive implementation and refactoring it later is far cheaper on your internal battery.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Protect Your Currency
&lt;/h3&gt;

&lt;p&gt;If energy is the real bottleneck, how do we protect it?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Audit Your Drains:&lt;/strong&gt; Stop tracking your time and start tracking your energy. Notice when you feel sharpest and when you feel completely brain-dead. Protect your high-energy windows fiercely—schedule your hardest architecture or problem-solving work for those specific hours.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strategic Ignorance:&lt;/strong&gt; Turn off notifications when doing deep work. Batch your communication. Check your emails and messages only at specific, low-energy points in the day rather than leaving them open on a second monitor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lower the Activation Energy:&lt;/strong&gt; To fight the emotional block of starting an intimidating ticket, break it down into absurdly small steps. Don't set out to "build the feature." Set out to "create the file" or "write the function signature." Once the initial friction is overcome, momentum takes over.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Time is just a container. What matters is the energy you bring to the time you have. Stop trying to manage the clock, and start managing your battery.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>programming</category>
      <category>challenge</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Day 15/45 — Building a Workforce Management SaaS in Public</title>
      <dc:creator>Taskdudes</dc:creator>
      <pubDate>Tue, 12 May 2026 03:50:17 +0000</pubDate>
      <link>https://dev.to/taskdude/day-1545-building-a-workforce-management-saas-in-public-49bn</link>
      <guid>https://dev.to/taskdude/day-1545-building-a-workforce-management-saas-in-public-49bn</guid>
      <description>&lt;p&gt;At &lt;a href="https://taskdudes.com/" rel="noopener noreferrer"&gt;Taskdudes&lt;/a&gt;, our team is currently building a workforce management SaaS focused on simplifying employee operations for businesses.&lt;/p&gt;

&lt;p&gt;The core problem we’re solving:&lt;br&gt;
Most companies rely on multiple disconnected tools for scheduling, attendance tracking, employee management, and invoicing. That creates unnecessary operational friction.&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%2Fp083qi5xj8ganhee7l5f.png" 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%2Fp083qi5xj8ganhee7l5f.png" alt=" " width="800" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our approach is to unify those workflows into a single scalable platform.&lt;/p&gt;

&lt;p&gt;What We’ve Built So Far&lt;br&gt;
Employee Management Module&lt;br&gt;
Shift Scheduling System&lt;br&gt;
Time Tracking Features&lt;br&gt;
Automated Invoicing Workflows&lt;br&gt;
Backend Optimization&lt;br&gt;
Testing &amp;amp; Quality Improvements&lt;br&gt;
Tech Stack&lt;br&gt;
Next.js&lt;br&gt;
NestJS&lt;br&gt;
PostgreSQL&lt;br&gt;
Redis&lt;/p&gt;

&lt;p&gt;This is a collaborative build involving multiple developers working together on architecture, scalability, workflows, and product decisions.&lt;/p&gt;

&lt;p&gt;We’re documenting the entire process publicly — including challenges, trade-offs, and technical learnings.&lt;/p&gt;

&lt;p&gt;45 days. One production-ready SaaS product.&lt;/p&gt;

&lt;h1&gt;
  
  
  Taskdudes #SaaS #WebDevelopment #SoftwareEngineering #NextJS #NestJS #PostgreSQL #Redis #BuildInPublic
&lt;/h1&gt;

</description>
      <category>buildinpublic</category>
      <category>devjournal</category>
      <category>saas</category>
      <category>startup</category>
    </item>
    <item>
      <title>Coding Cat Oran S2 Ep3 — The Auditor Arrives</title>
      <dc:creator>SysLayer</dc:creator>
      <pubDate>Tue, 12 May 2026 03:48:43 +0000</pubDate>
      <link>https://dev.to/syslayer/coding-cat-oran-s2-ep3-the-auditor-arrives-mfo</link>
      <guid>https://dev.to/syslayer/coding-cat-oran-s2-ep3-the-auditor-arrives-mfo</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%2F1aesrddvociesmffoety.png" 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%2F1aesrddvociesmffoety.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;She doesn't look at the machines.&lt;br&gt;
She looks at the filing cabinets.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Her name is Ms. Chen.&lt;/p&gt;

&lt;p&gt;She arrives at 9am with a rolling carry-on bag,&lt;br&gt;
an iPad in a hard case,&lt;br&gt;
and the specific kind of calm that belongs to people&lt;br&gt;
who have seen this before.&lt;/p&gt;

&lt;p&gt;Many times before.&lt;/p&gt;




&lt;p&gt;The plant manager gives her a tour.&lt;br&gt;
New equipment. Clean floors. Calibrated instruments.&lt;br&gt;
He is proud of the production line.&lt;br&gt;
He should be. It's good work.&lt;/p&gt;

&lt;p&gt;Ms. Chen walks the line for two hours.&lt;br&gt;
She says nothing.&lt;br&gt;
She writes nothing on her iPad.&lt;/p&gt;

&lt;p&gt;Then she turns to the plant manager and says:&lt;br&gt;
&lt;em&gt;"I'd like to see the production records. All of them. Going back eighteen months."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The plant manager smiles.&lt;br&gt;
He has been preparing for this question.&lt;br&gt;
He did not prepare for the answer to be complicated.&lt;/p&gt;




&lt;p&gt;Here is what Ms. Chen finds:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The production floor:&lt;/strong&gt; acceptable.&lt;br&gt;
&lt;strong&gt;The equipment:&lt;/strong&gt; calibrated, documented, within spec.&lt;br&gt;
&lt;strong&gt;The documentation:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Batch records exist in three formats across four departments.&lt;/em&gt;&lt;br&gt;
No single record contains the full picture of any batch.&lt;br&gt;
To trace one production run from raw material to finished goods,&lt;br&gt;
you would need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the batch number in Manufacturing's daily log (Excel, by shift, by month, one file per month, stored on the shift supervisor's PC)&lt;/li&gt;
&lt;li&gt;Cross-reference with QA's inspection log (different Excel format, different batch number convention, stored on the QA lead's laptop)&lt;/li&gt;
&lt;li&gt;Find the process parameters in Engineering's test folder (password protected; the VP is in a meeting)&lt;/li&gt;
&lt;li&gt;Locate the material lot number in the incoming inspection binder (physical binder, shelf B3, organized by receipt date, not by lot number)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ms. Chen does not do all of this.&lt;br&gt;
She does enough of it to write, in the Notes field of her iPad:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Traceability: not demonstrated.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;She meets with the CEO at 2pm.&lt;/p&gt;

&lt;p&gt;She is direct. She is not unkind.&lt;/p&gt;

&lt;p&gt;"Your production capability is real," she says.&lt;br&gt;
"Your quality control process is real.&lt;br&gt;
Your documentation system&lt;br&gt;
is not a system.&lt;br&gt;
It is hope organized into folders."&lt;/p&gt;

&lt;p&gt;She opens her iPad and reads from the checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single source of truth for production data: &lt;strong&gt;Not met.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Traceability from raw material to finished goods: &lt;strong&gt;Not met.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Audit trail for process parameter changes: &lt;strong&gt;Not met.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Data stored in auditable, non-editable system: &lt;strong&gt;Not met.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"You have ninety days," she says.&lt;br&gt;
"If these items are addressed at re-audit,&lt;br&gt;
we proceed with the contract.&lt;br&gt;
If not—"&lt;/p&gt;

&lt;p&gt;She doesn't finish the sentence.&lt;br&gt;
She doesn't need to.&lt;/p&gt;




&lt;p&gt;The emergency meeting is Monday, 8am.&lt;br&gt;
All senior managers. No exceptions.&lt;/p&gt;

&lt;p&gt;The CEO does not raise his voice.&lt;br&gt;
He doesn't need to.&lt;/p&gt;

&lt;p&gt;He says: &lt;em&gt;"Everything goes into a database. Oran is the project manager."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then he looks at Oran.&lt;/p&gt;

&lt;p&gt;Oran has been in this company for two years.&lt;br&gt;
He has fixed the printers.&lt;br&gt;
He has recovered someone's corrupted Excel file at 11pm.&lt;br&gt;
He has set up the WiFi in the new warehouse.&lt;/p&gt;

&lt;p&gt;He has never been a project manager.&lt;/p&gt;

&lt;p&gt;He has also never wanted to be one.&lt;/p&gt;

&lt;p&gt;But he has been taking notes since this meeting started,&lt;br&gt;
and he has been thinking about this problem since the yield rate argument&lt;br&gt;
three months ago,&lt;br&gt;
and he knows — with the specific certainty that comes from&lt;br&gt;
having already tried to do the thing the wrong way —&lt;br&gt;
that there is no version of this that works&lt;br&gt;
if IT just builds a database and waits for departments to fill it.&lt;/p&gt;

&lt;p&gt;So before he says yes,&lt;br&gt;
he stands up.&lt;/p&gt;

&lt;p&gt;He writes three things on the whiteboard.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. The timeline is IT's decision.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"The audit deadline is ninety days from today.&lt;br&gt;
That does not mean the system is delivered in ninety days.&lt;br&gt;
That means the system is delivered in whatever time it takes to build it correctly,&lt;br&gt;
and the scope is defined by what can be done correctly,&lt;br&gt;
not by what the deadline demands.&lt;br&gt;
If the scope doesn't fit the timeline,&lt;br&gt;
that is a conversation about scope.&lt;br&gt;
Not about overtime."&lt;/p&gt;

&lt;p&gt;The VP of Engineering shifts in his seat.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;2. Resourcing is non-negotiable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"I need two additional developers.&lt;br&gt;
I need budget for tooling — database licenses, server infrastructure, testing environment.&lt;br&gt;
I am one person. One person cannot build a traceability system for six product lines&lt;br&gt;
in ninety days and also answer the help desk tickets&lt;br&gt;
and also be in four status meetings a week."&lt;/p&gt;

&lt;p&gt;The VP of Manufacturing starts to say something.&lt;br&gt;
Oran continues.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. Passive cooperation is not cooperation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;"Every department will have data submission deadlines.&lt;br&gt;
If a department does not submit data by the agreed date,&lt;br&gt;
the project is blocked.&lt;br&gt;
That is documented as a management issue,&lt;br&gt;
not an IT issue.&lt;br&gt;
I will not absorb delays caused by other departments.&lt;br&gt;
I will document them and escalate them."&lt;/p&gt;

&lt;p&gt;He looks at the room.&lt;/p&gt;

&lt;p&gt;"I want this in writing.&lt;br&gt;
Signed.&lt;br&gt;
Before the project starts."&lt;/p&gt;




&lt;p&gt;The room is quiet for a moment.&lt;/p&gt;

&lt;p&gt;Then the VP of QA says: &lt;em&gt;"I think that's reasonable."&lt;/em&gt;&lt;br&gt;
The VP of Engineering says nothing, which Oran writes down.&lt;br&gt;
The VP of Manufacturing smiles — the specific smile of someone&lt;br&gt;
who has already decided what they are going to do&lt;br&gt;
and it is not what they are about to say —&lt;br&gt;
and says: &lt;em&gt;"Of course. We'll cooperate fully."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Oran writes that down too.&lt;br&gt;
He writes the date next to it.&lt;br&gt;
He puts a small star next to the VP of Manufacturing's name.&lt;/p&gt;

&lt;p&gt;The CEO looks at Oran for a long moment.&lt;br&gt;
Then he nods once.&lt;/p&gt;

&lt;p&gt;"Ninety days," he says. "Make it work."&lt;/p&gt;




&lt;p&gt;After the meeting, Oran walks back to his desk.&lt;br&gt;
He opens his notebook to a fresh page.&lt;br&gt;
At the top he writes:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Day 1.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Below it:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Things that are true:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— The system doesn't exist yet.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— The data is in twelve drawers.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— Three departments will say they're cooperating.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— Two of them mean it.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— The one who doesn't will be the most enthusiastic in every meeting.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;He draws a line.&lt;/p&gt;

&lt;p&gt;Below the line:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Things I can control:&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— What I agree to.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— What I document.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;— What I build.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;He looks at that list for a while.&lt;/p&gt;

&lt;p&gt;Then he opens his laptop and starts writing the schema.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The battle for the data hadn't started yet.&lt;br&gt;
But Oran had just made sure that when it did,&lt;br&gt;
he would not be the one who lost it alone.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Next: Ep4 — The Voluntary Table&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;No department wanted to think about the whole picture.&lt;br&gt;
Then they sat in a room with a deadline and no escape.&lt;br&gt;
Oran said nothing. That was the point.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;← &lt;a href="https://dev.to/syslayer/coding-cat-oran-s2-ep1-the-excel-republic-5g15"&gt;Ep1: The Excel Republic&lt;/a&gt;&lt;/em&gt;&lt;br&gt;
&lt;em&gt;← &lt;a href="https://dev.to/syslayer/-coding-cat-oran-s2-ep2-the-big-customer-pp"&gt;Ep2: The Big Customer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Coding Cat Oran is a serialized fiction about building real production systems inside real companies.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;The audits are real. The ninety days are real. The cat is fictional.&lt;/em&gt;&lt;br&gt;
&lt;em&gt;The VP of Manufacturing is, unfortunately, also real.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By &lt;a href="https://syslayer.gumroad.com" rel="noopener noreferrer"&gt;SysLayer&lt;/a&gt; · &lt;a href="https://dev.to/syslayer"&gt;dev.to/syslayer&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>career</category>
      <category>sql</category>
      <category>database</category>
    </item>
    <item>
      <title>Why does paying more make your LLM reply faster?</title>
      <dc:creator>Ashwin Hariharan</dc:creator>
      <pubDate>Tue, 12 May 2026 03:43:49 +0000</pubDate>
      <link>https://dev.to/booleanhunter/why-does-paying-more-make-your-llm-reply-faster-3lfn</link>
      <guid>https://dev.to/booleanhunter/why-does-paying-more-make-your-llm-reply-faster-3lfn</guid>
      <description>&lt;p&gt;Why does Claude respond faster when you pay more? And why does a longer conversation cost disproportionately more than a short one?&lt;/p&gt;

&lt;p&gt;For the longest time I simply accepted these as &lt;em&gt;"it's just how it works"&lt;/em&gt;. Like most engineers, I burn through Claude and GPT tokens all day and assumed "longer prompts cost more" was just a billing convention.&lt;/p&gt;

&lt;p&gt;As it turns out, &lt;strong&gt;memory&lt;/strong&gt; is one of the factors that influence LLM pricing.&lt;/p&gt;

&lt;p&gt;Now memory in AI systems lives in a lot of places. vector stores for RAG, Redis for semantic caches and session state, in process caches for short-lived data. Each layer has its own latency budget and its own access pattern.&lt;/p&gt;

&lt;p&gt;One layer that doesn't get talked about much, but quietly determines almost every LLM pricing decision from Claude, GPT, and Gemini, is HBM - the &lt;strong&gt;high-bandwidth memory inside the GPU&lt;/strong&gt; itself.&lt;/p&gt;

&lt;p&gt;At every token generation phase, the GPU does two reads from this high-bandwidth memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reading the model's &lt;strong&gt;weights&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;reading the &lt;strong&gt;KV cache&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's unpack each briefly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the model's weights
&lt;/h2&gt;

&lt;p&gt;Every time the model generates a token, your input flows through the model's layers one by one - from the first layer all the way to the output. This is called a &lt;em&gt;forward pass&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Each forward pass reads the model weights just &lt;strong&gt;once&lt;/strong&gt;, regardless of how many users are calling the API at the same moment. The weights are constant; they don't change between users.&lt;/p&gt;

&lt;p&gt;This means the cost of that one weight read can be &lt;strong&gt;split&lt;/strong&gt;. If the GPU packs 100 user requests into the same forward pass as a batch, those 100 users share the single weight read. The cost is split amongst 100 users.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Basically, it means that the "fast tier" modes in tools like Cursor are smaller batches (fewer people splitting the bill) - so you pay more per token.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Reading the &lt;code&gt;KV&lt;/code&gt; Cache
&lt;/h2&gt;

&lt;p&gt;The KV cache works differently. It is a &lt;strong&gt;variable cost&lt;/strong&gt; that grows with your conversation.&lt;/p&gt;

&lt;h3&gt;
  
  
  A quick detour: the attention mechanism
&lt;/h3&gt;

&lt;p&gt;When the model generates a new token, it doesn't treat every earlier token equally. It uses attention to decide which earlier tokens matter most.&lt;/p&gt;

&lt;p&gt;The easiest way to picture it: imagine every token in your conversation is a sticky note with two parts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The key is a short tag describing what kind of information this token carries.&lt;/li&gt;
&lt;li&gt;The value is what's written inside the note — the actual information the model can pull in.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Take the sentence: &lt;em&gt;"The cat sat on the mat. It was fluffy."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When the model gets to "It was fluffy" and tries to predict the next word, it needs to know what "It" refers to. So it scans the tabs (keys) of every earlier token:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cat&lt;/code&gt;: key indicates "I'm a noun, an animal, the subject". Value carries "small, furry, four legs, often a pet."&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mat&lt;/code&gt;: key indicates "I'm a noun, an object, a location". Value carries "flat thing on the floor."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are nouns, but the cat key matches the question "what could &lt;em&gt;'It'&lt;/em&gt; refer to that could be fluffy?" better. So the model pulls in &lt;code&gt;cat&lt;/code&gt;'s value more strongly than mat's, and uses that to shape the next token.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In reality keys and values aren't English sentences - they're vectors of numbers the model learned during training. But functionally that's the job they do: the key is how this token gets found, the value is what gets pulled in once it's found.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;For every token in your conversation, the model saves a key (a searchable label) and a value (the content). Without the cache, the attention mechanism would recompute these from scratch on every step. With it, it just reads them back.&lt;/p&gt;

&lt;p&gt;But that read grows linearly with every conversation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1,000 tokens of context -&amp;gt; 1,000 key-value pairs read per generated token&lt;/li&gt;
&lt;li&gt;100,000 tokens of context -&amp;gt; 100,000 key–value pairs read per generated token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And unlike weights, this cache is unique to your session - the GPU can't read user A's KV cache and reuse it for user B, because the data is different. Every user pays the full cost of reading their own KV cache, with no sharing.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Q0LTU_N38Wc"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;💡 So under the hood, it's about how fast a chip can read memory.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;weight&lt;/strong&gt; bill gets split across the batch, whereas the &lt;strong&gt;KV&lt;/strong&gt; bill is just yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Learn more here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=xmkSf5IS-zw" rel="noopener noreferrer"&gt;The math behind how LLMs are trained and served&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>llm</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>The "Tunnel Vision" Effect and the Eclipse of A Priori Judgment in the Age of AI</title>
      <dc:creator>Christian Herlein</dc:creator>
      <pubDate>Tue, 12 May 2026 03:38:20 +0000</pubDate>
      <link>https://dev.to/chrisherlein/the-tunnel-vision-effect-and-the-eclipse-of-a-priori-judgment-in-the-age-of-ai-23ea</link>
      <guid>https://dev.to/chrisherlein/the-tunnel-vision-effect-and-the-eclipse-of-a-priori-judgment-in-the-age-of-ai-23ea</guid>
      <description>&lt;p&gt;As developers, we have always sought tools to optimize our workflow. However, the massive integration of Generative AI is not merely a change in tooling; it is a shift in our &lt;strong&gt;cognitive paradigm&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Lately, I have been reflecting on how this technology is altering our approach to complex problem-solving. What happens when we only activate our analytical capacity once a proposal is already on the table? Do we become mere editors of external solutions instead of the architects of our own?&lt;/p&gt;

&lt;p&gt;This post is the first in a series of reflections on new workflows in our industry: the productivity gains, the invisible costs—in other words, the risks, challenges, and new opportunities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prolegomena: The Mutation of the Heuristic Process
&lt;/h2&gt;

&lt;p&gt;The integration of Generative Artificial Intelligence into the software development lifecycle has introduced a mutation in the developer's heuristic. This phenomenon, characterized by a shift from systemic analysis toward point validation, threatens the architectural integrity of complex systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shift Toward A Posteriori Judgment
&lt;/h2&gt;

&lt;p&gt;From a Kantian perspective, traditional software design has fundamentally relied on a priori judgment: the engineer's ability to structure mental schemas, model data to define information, establish interface contracts, and foresee potential internal system collisions before its formal codification.&lt;/p&gt;

&lt;p&gt;This synthetic judgment has always acted as a mediator between the provided requirement and the resulting source code, serving as a channel for intellectual effort. The time invested in generating the theoretical framework—within which the source code possesses its own life—was the space where the developer added the most value, making the deepest design decisions. In this schema, the act of writing code was a task subordinate to mechanics and technique rather than to creative-architectural thought.&lt;/p&gt;

&lt;p&gt;Conversely, the irruption of AI through the immediate availability of syntactic proposals induces a cognitive relaxation. The developer no longer generates the solution; they react to it. This transition toward an exclusively a posteriori judgment—where criticism is only activated in the face of an already produced artifact—eliminates the phase of pure reflection.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trap of Concreteness and the Loss of the "Big Picture"
&lt;/h2&gt;

&lt;p&gt;Current language models are, by definition, local probability optimizers. Their output tends toward extreme concreteness: solutions that satisfy immediate functional requirements but lack the capacity for synthesis necessary for abstraction.&lt;/p&gt;

&lt;p&gt;By delegating the choice of implementation strategy, the human developer falls into a "tunnel vision"; the leap from requirement to source code becomes instantaneous. The task of validating what was written—a mechanical activity—occurs immediately after receiving the requirement, eliminating the perception of added value in the essential decision-making process. Consequently, the unity of the system fragments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;At a local level:&lt;/strong&gt; The solution is efficient, syntactically and functionally correct, and produces a reaction to the human perception of time that is substantially different from the traditional process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;At a systemic level:&lt;/strong&gt; Architectural elegance is lost. AI does not comprehend the teleology of the system, nor does it possess the intrinsic intertemporality of the system it modifies, resulting in entropic growth of the codebase.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Consequences for Software Architecture
&lt;/h2&gt;

&lt;p&gt;Abstraction is the primary mechanism for managing complexity. However, a posteriori judgment is inherently reactive and tends to accept the path of least cognitive resistance. If the AI’s proposal "works," the incentive to refactor toward a higher abstraction disappears.&lt;/p&gt;

&lt;p&gt;In the long run, this produces systems composed of disjointed concrete solutions, increasing technical debt and reducing maintainability, as the "Big Picture" is sacrificed at the altar of delivery speed.&lt;/p&gt;

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

&lt;p&gt;Software engineering must not be confused with the mere production of code; it is a discipline of systems design. Valuing and maintaining the exercise of a priori judgment is imperative to prevent technological assistance from degrading our ability to build robust and coherent systems, grounded in interconnected abstractions that provide unity and completeness. AI must be an instrument of execution, not the arbiter of our mental architecture.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>computerscience</category>
      <category>generativeai</category>
      <category>philosophyoftech</category>
    </item>
    <item>
      <title>Kubernetes CNI Complete Guide: Flannel vs Cilium vs Calico + Cloud Provider CNIs</title>
      <dc:creator>Pendela BhargavaSai</dc:creator>
      <pubDate>Tue, 12 May 2026 03:30:00 +0000</pubDate>
      <link>https://dev.to/pendelabhargavasai/kubernetes-cni-complete-guide-flannel-vs-cilium-vs-calico-cloud-provider-cnis-5c6c</link>
      <guid>https://dev.to/pendelabhargavasai/kubernetes-cni-complete-guide-flannel-vs-cilium-vs-calico-cloud-provider-cnis-5c6c</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%2Fwiu2b1dngo2gmr0srlif.png" 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%2Fwiu2b1dngo2gmr0srlif.png" alt=" " width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;K3s&lt;/strong&gt; v1.29+  |  &lt;strong&gt;Flannel&lt;/strong&gt; v0.24+  |  &lt;strong&gt;Cilium&lt;/strong&gt; v1.15+  |  &lt;strong&gt;Calico&lt;/strong&gt; v3.27+  |  &lt;strong&gt;AWS VPC CNI&lt;/strong&gt; v1.18+  |  &lt;strong&gt;Azure CNI&lt;/strong&gt; v1.5+  |  &lt;strong&gt;GKE Dataplane V2&lt;/strong&gt; (Cilium-based)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A definitive comparison of every major Kubernetes CNI — open-source plugins (Flannel, Calico, Cilium, Weave, Antrea, Multus) and cloud-managed defaults (AWS VPC CNI on EKS, Azure CNI on AKS, and GKE's Dataplane V2 on GKE) — across architecture, performance, network policy, observability, encryption, and when to choose each.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CNI&lt;/th&gt;
&lt;th&gt;Identity&lt;/th&gt;
&lt;th&gt;Core Approach&lt;/th&gt;
&lt;th&gt;Default On&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢 &lt;strong&gt;Flannel&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Simple Overlay&lt;/td&gt;
&lt;td&gt;VXLAN tunnel, zero policy&lt;/td&gt;
&lt;td&gt;K3s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟠 &lt;strong&gt;Calico&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Policy Powerhouse&lt;/td&gt;
&lt;td&gt;BGP routing, iptables/eBPF&lt;/td&gt;
&lt;td&gt;Self-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔵 &lt;strong&gt;Cilium&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;eBPF Native&lt;/td&gt;
&lt;td&gt;Kernel eBPF, replaces kube-proxy&lt;/td&gt;
&lt;td&gt;GKE (Dataplane V2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟡 &lt;strong&gt;Weave Net&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Mesh Overlay&lt;/td&gt;
&lt;td&gt;Gossip-based mesh routing&lt;/td&gt;
&lt;td&gt;Self-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🟣 &lt;strong&gt;Antrea&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;VMware-backed&lt;/td&gt;
&lt;td&gt;OVS dataplane, Antrea policies&lt;/td&gt;
&lt;td&gt;Self-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔶 &lt;strong&gt;AWS VPC CNI&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Cloud-native&lt;/td&gt;
&lt;td&gt;Native VPC IP assignment&lt;/td&gt;
&lt;td&gt;EKS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔷 &lt;strong&gt;Azure CNI&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Cloud-native&lt;/td&gt;
&lt;td&gt;Azure VNET IP assignment&lt;/td&gt;
&lt;td&gt;AKS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;♦️ &lt;strong&gt;GKE CNI / Dataplane V2&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Cloud-native + eBPF&lt;/td&gt;
&lt;td&gt;Cilium-based eBPF on GKE&lt;/td&gt;
&lt;td&gt;GKE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What Is a CNI?&lt;/li&gt;
&lt;li&gt;
Open Source CNIs

&lt;ul&gt;
&lt;li&gt;2.1 Flannel — Simple Overlay
&lt;/li&gt;
&lt;li&gt;2.2 Cilium — eBPF Native
&lt;/li&gt;
&lt;li&gt;2.3 Calico — BGP + Flexible Dataplane
&lt;/li&gt;
&lt;li&gt;2.4 Weave Net — Mesh Overlay
&lt;/li&gt;
&lt;li&gt;2.5 Antrea — OVS-based CNI
&lt;/li&gt;
&lt;li&gt;2.6 Multus — Meta CNI
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Cloud Provider CNIs

&lt;ul&gt;
&lt;li&gt;3.1 AWS VPC CNI — EKS Default
&lt;/li&gt;
&lt;li&gt;3.2 Azure CNI — AKS Default
&lt;/li&gt;
&lt;li&gt;3.3 GKE Dataplane V2 — GKE Default
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Data Plane Comparison&lt;/li&gt;
&lt;li&gt;Network Policy&lt;/li&gt;
&lt;li&gt;Observability&lt;/li&gt;
&lt;li&gt;Performance Benchmarks&lt;/li&gt;
&lt;li&gt;Encryption&lt;/li&gt;
&lt;li&gt;Multi-Cluster&lt;/li&gt;
&lt;li&gt;Resource Usage&lt;/li&gt;
&lt;li&gt;Full Feature Comparison&lt;/li&gt;
&lt;li&gt;When to Choose Each&lt;/li&gt;
&lt;li&gt;K3s-Specific Setup&lt;/li&gt;
&lt;li&gt;Migration Guide on K3s&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. What Is a CNI and Why Does It Matter?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Container Network Interface&lt;/strong&gt; (CNI) is the plugin layer every Kubernetes cluster depends on for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assigning IP addresses to pods from a defined CIDR range&lt;/li&gt;
&lt;li&gt;Creating virtual Ethernet (veth) pairs between pod namespaces and the host&lt;/li&gt;
&lt;li&gt;Programming cross-node routing so pods on Node A can reach pods on Node B&lt;/li&gt;
&lt;li&gt;Optionally enforcing &lt;code&gt;NetworkPolicy&lt;/code&gt; resources to control traffic flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloud providers like AWS, Azure, and GCP have built proprietary CNI plugins that deeply integrate with their underlying VPC/VNET networking primitives — providing native IP assignment, cloud-aware routing, and tight integration with cloud IAM, load balancers, and security groups.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;K3s Key Flag&lt;/strong&gt;&lt;br&gt;
To replace the default CNI on K3s, install with &lt;code&gt;--flannel-backend=none --disable-network-policy&lt;/code&gt;. This leaves the CNI slot open for Calico or Cilium to fill.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Open Source CNIs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 Flannel Simple Overlay
&lt;/h3&gt;

&lt;p&gt;Flannel's design philosophy: do one thing well. A user-space daemon (&lt;code&gt;flanneld&lt;/code&gt;) manages subnet allocation, while the kernel's own VXLAN and bridge code handles all actual forwarding. No policy, no observability — just connectivity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pod A (eth0: 10.244.0.2)          Pod B (eth0: 10.244.0.5)
        │                                  │
        │ veth pair                        │ veth pair
        ▼                                  ▼
           cni0 Linux bridge (kernel)
                    │
      iptables PREROUTING / FORWARD / POSTROUTING
                    │
         VXLAN encapsulation — UDP 8472
                    │
     flanneld (user-space) ← etcd / K8s API
                    │
          Physical NIC → Node B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fwyp31b0v2tfpvqia6vgb.png" 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%2Fwyp31b0v2tfpvqia6vgb.png" alt="Fannel Architecture" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Available backends:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Backend&lt;/th&gt;
&lt;th&gt;Transport&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;vxlan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;UDP encap (default)&lt;/td&gt;
&lt;td&gt;Works across any network, even routers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;host-gw&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Direct routing&lt;/td&gt;
&lt;td&gt;Fastest, requires L2 adjacency between nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wireguard-native&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encrypted WireGuard tunnel&lt;/td&gt;
&lt;td&gt;When you need encryption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;udp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Legacy user-space&lt;/td&gt;
&lt;td&gt;Fallback only — very slow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Network Policy:&lt;/strong&gt; Flannel enforces zero NetworkPolicy. Resources are silently ignored. You must pair it with Calico (Canal) to get policy — adding a second DaemonSet, version compatibility risk, and split ownership between two projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flannel Encryption:&lt;/strong&gt; Flannel encrypts cross-node traffic only — pod-to-pod on the same node travels through the &lt;code&gt;cni0&lt;/code&gt; bridge unencrypted. No auto key rotation; restart &lt;code&gt;flanneld&lt;/code&gt; to rotate keys.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10.244.0.0/16"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Backend"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wireguard"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Dev/CI clusters, Raspberry Pi, edge nodes, K3s defaults.&lt;/p&gt;




&lt;h3&gt;
  
  
  2.2 Cilium — eBPF Native
&lt;/h3&gt;

&lt;p&gt;Cilium compiles and injects eBPF programs into the Linux kernel at TC/XDP hook points. There is no bridge, no iptables — packets are forwarded via &lt;code&gt;bpf_redirect()&lt;/code&gt; at line rate, and policy is enforced via O(1) BPF map lookups.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pod A (eth0)                         Pod B (eth0)
       │                                  │
       │ veth pair                        │
       ▼                                  ▼
TC eBPF hook ──── bpf_redirect() ──── TC eBPF hook
                  │
BPF maps: identity · policy · NAT · LB
                  │
cilium-agent — compiles eBPF, watches K8s API
                  │
  Physical NIC — GENEVE / native routing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ftei3oiyqewc7l9s5tk6p.webp" 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%2Ftei3oiyqewc7l9s5tk6p.webp" alt="K8S Network vs Cilium" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Datapath modes:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Encapsulation&lt;/th&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tunnel: geneve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GENEVE (default)&lt;/td&gt;
&lt;td&gt;Any network topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;native-routing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;L2 adjacency or BGP underlay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wireguard&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;WireGuard transparent&lt;/td&gt;
&lt;td&gt;Kernel ≥ 5.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ipsec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IPsec&lt;/td&gt;
&lt;td&gt;FIPS-regulated environments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Network Policy:&lt;/strong&gt; 4.3 Cilium — L3 Through L7, No Sidecar&lt;/p&gt;

&lt;p&gt;Cilium enforces standard NetworkPolicy and extends it with &lt;code&gt;CiliumNetworkPolicy&lt;/code&gt; (CNP) for Layer 7 rules — no sidecar required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# CiliumNetworkPolicy — L7 HTTP rule&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cilium.io/v2&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CiliumNetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allow-get-only&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;endpointSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
  &lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;fromEndpoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;frontend&lt;/span&gt;
    &lt;span class="na"&gt;toPorts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080"&lt;/span&gt;
        &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
      &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GET&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/api/v1/.*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔭 Cilium + Hubble
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Per-flow visibility on every packet&lt;/li&gt;
&lt;li&gt;✅ Live service dependency map (Hubble UI)&lt;/li&gt;
&lt;li&gt;✅ L7 HTTP / DNS / Kafka / gRPC flows&lt;/li&gt;
&lt;li&gt;✅ Drop reason per endpoint&lt;/li&gt;
&lt;li&gt;✅ Rich Prometheus metrics
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable Hubble and UI&lt;/span&gt;
cilium hubble &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--ui&lt;/span&gt;

&lt;span class="c"&gt;# Watch live flows in a namespace&lt;/span&gt;
hubble observe &lt;span class="nt"&gt;--namespace&lt;/span&gt; production &lt;span class="nt"&gt;--follow&lt;/span&gt;

&lt;span class="c"&gt;# Show only policy drops with reason&lt;/span&gt;
hubble observe &lt;span class="nt"&gt;--verdict&lt;/span&gt; DROPPED &lt;span class="nt"&gt;--follow&lt;/span&gt;

&lt;span class="c"&gt;# Sample output:&lt;/span&gt;
&lt;span class="c"&gt;# 12:34:01: default/frontend → default/backend  FORWARDED  TCP:SYN&lt;/span&gt;
&lt;span class="c"&gt;# 12:34:02: default/attacker → default/backend  DROPPED    Policy denied&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cilium Encryption:&lt;/strong&gt; Cilium WireGuard + IPsec&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# WireGuard with strict mode (drops unencrypted packets)&lt;/span&gt;
cilium &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--encryption&lt;/span&gt; wireguard &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--encryption-strict-mode&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;

&lt;span class="c"&gt;# IPsec for FIPS-regulated environments&lt;/span&gt;
cilium &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--encryption&lt;/span&gt; ipsec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Large-scale production, L7 policy, observability (Hubble), zero-trust, multi-cluster.&lt;/p&gt;




&lt;h3&gt;
  
  
  2.3 Calico — BGP + Flexible Dataplane
&lt;/h3&gt;

&lt;p&gt;Calico uses &lt;strong&gt;BGP&lt;/strong&gt; (Border Gateway Protocol) to distribute pod routes across nodes — no encapsulation by default. Each node acts as a BGP peer, advertising its pod CIDR to other nodes and upstream routers. Calico's data plane is pluggable: iptables, eBPF, or even Windows HNS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pod A (eth0: 192.168.0.2)          Pod B (eth0: 192.168.1.2)
        │                                  │
        │ veth pair                        │ veth pair
        ▼                                  ▼
      Host routing table (no bridge needed)
                    │
      iptables / eBPF policy enforcement
                    │
     Felix (per-node agent) ← Typha (fan-out)
                    │
     BIRD (BGP daemon) — peers with other nodes
                    │
    Physical NIC — direct IP routing (no encap)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fm2yz0fuiiezgssjwfb85.png" 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%2Fm2yz0fuiiezgssjwfb85.png" alt="Calico Architecture" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Calico components:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Felix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per-node agent; programs iptables/eBPF rules and routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BIRD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open-source BGP daemon; advertises pod subnets to peers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typha&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fan-out proxy for the K8s datastore; recommended at 50+ nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;calico-kube-controllers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Garbage-collects stale Calico resources&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Network Policy:&lt;/strong&gt; 4.2 Calico — L3/L4 Policy Leader&lt;/p&gt;

&lt;p&gt;Calico is widely regarded as the gold standard for L3/L4 NetworkPolicy. It supports standard &lt;code&gt;NetworkPolicy&lt;/code&gt; resources plus its own &lt;code&gt;GlobalNetworkPolicy&lt;/code&gt; and &lt;code&gt;NetworkSet&lt;/code&gt; CRDs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Calico GlobalNetworkPolicy — cluster-wide deny-all&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;projectcalico.org/v3&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GlobalNetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default-deny-all&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all()&lt;/span&gt;
  &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Egress&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Calico NetworkSet — group external CIDRs&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;projectcalico.org/v3&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;trusted-external&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;nets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;203.0.113.0/24&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;198.51.100.0/24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ Calico does &lt;strong&gt;not&lt;/strong&gt; support L7 HTTP/gRPC policy natively in OSS. For that you need its optional Envoy-based Application Layer Policy (ALP), which adds a sidecar and complexity.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Calico Encryption:&lt;/strong&gt; Calico supports WireGuard for node-to-node encryption, enabled with a single patch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl patch felixconfiguration default &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--type&lt;/span&gt; merge &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--patch&lt;/span&gt; &lt;span class="s1"&gt;'{"spec":{"wireguardEnabled":true}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Starting in Calico v3.26, same-node pod traffic encryption is also supported via host-to-pod WireGuard options.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; BGP-integrated DCs, Windows node support, bare-metal L3, robust L3/L4 policy.&lt;/p&gt;




&lt;h3&gt;
  
  
  2.4 Weave Net — Mesh Overlay
&lt;/h3&gt;

&lt;p&gt;Weave Net uses a gossip protocol to build a full mesh topology between all cluster nodes without any central store. It wraps packets in a sleeve (VXLAN-like) tunnel and can optionally encrypt all traffic with NaCl. Weave is simpler to operate than Calico/Cilium but is no longer under active development (archived by Weaveworks in 2023).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pod A (eth0)
       │
    weave bridge
       │
  weave daemon (gossip mesh peer discovery)
       │
  Sleeve / Fast Datapath (VXLAN kernel bypass)
       │
    Node B weave daemon
       │
    Pod B (eth0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key characteristics:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gossip — no external etcd needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Datapath&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sleeve (user-space) or Fast Datapath (kernel VXLAN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;NaCl (enabled per-pod connection)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NetworkPolicy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Standard K8s policy supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Archived/maintenance mode (use Cilium or Calico for new clusters)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; Weaveworks ceased active development in 2023. Weave Net is community-maintained but no longer receives feature updates. It is &lt;strong&gt;not recommended&lt;/strong&gt; for new clusters — migrate to Cilium or Calico.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Legacy clusters already running Weave with migration on the roadmap.&lt;/p&gt;




&lt;h3&gt;
  
  
  2.5 Antrea — OVS-based CNI
&lt;/h3&gt;

&lt;p&gt;Antrea is a CNI backed by VMware (now Broadcom) that uses &lt;strong&gt;Open vSwitch (OVS)&lt;/strong&gt; as its dataplane. It supports both Linux and Windows nodes and provides its own &lt;code&gt;AntreaNetworkPolicy&lt;/code&gt; and &lt;code&gt;ClusterNetworkPolicy&lt;/code&gt; CRDs with tiered policy enforcement. Antrea integrates well with NSX-T for enterprise SD-WAN environments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pod A (eth0)
       │
   OVS (Open vSwitch) bridge
       │
   antrea-agent (per-node DaemonSet)
       │
   antrea-controller (centralized)
       │
   Encap: Geneve / VXLAN / GRE (configurable)
       │
   Node B OVS bridge → Pod B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Antrea&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dataplane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Open vSwitch (OVS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Full (OVS on Windows)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NetworkPolicy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ K8s standard + AntreaNetworkPolicy CRDs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tiered policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ (Emergency / Security / Application tiers)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ IPsec / WireGuard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Antrea Octant plugin, Prometheus metrics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NSX-T integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Enterprise add-on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;eBPF support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ AntreaProxy (partial eBPF)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; VMware/NSX-T environments, Windows-heavy clusters, tiered network policy.&lt;/p&gt;




&lt;h3&gt;
  
  
  2.6 Multus — Meta CNI
&lt;/h3&gt;

&lt;p&gt;Multus is not a standalone CNI — it is a &lt;strong&gt;meta CNI&lt;/strong&gt; that allows pods to attach multiple network interfaces simultaneously. A pod can have its primary network (managed by Flannel/Calico/Cilium) and secondary interfaces (SR-IOV, DPDK, Macvlan) for specialized workloads like telco NFV or HPC.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pod with Multiple NICs:
  eth0 (primary) ← Flannel/Calico/Cilium (cluster network)
  net1 (secondary) ← SR-IOV (high-throughput direct NIC)
  net2 (secondary) ← Macvlan (storage network)

Multus reads NetworkAttachmentDefinition CRDs and delegates
to the correct CNI for each interface.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# NetworkAttachmentDefinition for secondary interface&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;k8s.cni.cncf.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkAttachmentDefinition&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sriov-net&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
    &lt;span class="s"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;"type": "sriov",&lt;/span&gt;
      &lt;span class="s"&gt;"name": "sriov-net",&lt;/span&gt;
      &lt;span class="s"&gt;"ipam": { "type": "static" }&lt;/span&gt;
    &lt;span class="s"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Telco/NFV workloads, HPC, pods that need to straddle multiple network segments.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Cloud Provider CNIs
&lt;/h2&gt;

&lt;p&gt;Cloud-managed Kubernetes services ship their own CNI plugins that are deeply integrated with the underlying cloud networking fabric. These provide first-class VPC routing, cloud IAM integration, and managed lifecycle — but are typically locked to their respective cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 AWS VPC CNI — EKS Default
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Amazon EKS&lt;/strong&gt; uses the &lt;strong&gt;Amazon VPC CNI plugin&lt;/strong&gt; (&lt;code&gt;aws-node&lt;/code&gt; DaemonSet) by default. Instead of an overlay, it assigns &lt;strong&gt;real VPC secondary IP addresses&lt;/strong&gt; directly to pods from Elastic Network Interfaces (ENIs) attached to the worker node.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Worker Node (EC2 instance)
    │
    ├── Primary ENI (node IP: 10.0.1.10)
    │      └── eth0
    │
    ├── Secondary ENI (attached by vpc-cni)
    │      ├── 10.0.1.20 → Pod A (eth0 via veth)
    │      ├── 10.0.1.21 → Pod B (eth0 via veth)
    │      └── 10.0.1.22 → Pod C (eth0 via veth)
    │
    └── vpc-cni (aws-node DaemonSet)
           manages ENI lifecycle via EC2 API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How pod IPs work:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each EC2 instance can attach multiple ENIs; each ENI holds multiple secondary IPs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vpc-cni&lt;/code&gt; pre-warms a pool of secondary IPs per node via EC2 API calls&lt;/li&gt;
&lt;li&gt;Pods receive a real VPC IP — &lt;strong&gt;routable natively&lt;/strong&gt; across the VPC, peered VPCs, VPNs, and Direct Connect — with no overlay&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pod density limits per node (examples):&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instance Type&lt;/th&gt;
&lt;th&gt;Max ENIs&lt;/th&gt;
&lt;th&gt;Max IPs (pod limit)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;t3.medium&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.large&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.xlarge&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;m5.4xlarge&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;234&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c5.18xlarge&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;750&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; Default pod density is capped by the ENI/IP limit per instance type. For IP-constrained environments, use &lt;strong&gt;VPC CNI with prefix delegation&lt;/strong&gt; (&lt;code&gt;ENABLE_PREFIX_DELEGATION=true&lt;/code&gt;) to assign /28 prefixes instead of individual IPs, dramatically increasing pod density.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;AWS VPC CNI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IP assignment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Native VPC secondary IPs from ENIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Overlay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗ None — native VPC routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NetworkPolicy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗ Not built-in — requires Calico or Cilium add-on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security Groups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Security Groups for Pods (SGP) — per-pod AWS SGs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IPv6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prefix delegation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ /28 prefix per ENI (more pods per node)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows nodes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Custom networking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Pods in different subnet than node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;eBPF acceleration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ via Cilium add-on (EKS + Cilium mode)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Enabling Network Policy on EKS:&lt;/strong&gt;&lt;br&gt;
AWS VPC CNI itself does not enforce NetworkPolicy. You must add one of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Calico&lt;/strong&gt; (most common) — install as an add-on alongside vpc-cni&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cilium in chained mode&lt;/strong&gt; — replaces policy enforcement, keeps VPC IP routing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon VPC CNI Network Policy&lt;/strong&gt; (AWS-native, GA as of 2024) — uses eBPF for policy enforcement
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable AWS-native network policy controller (EKS add-on)&lt;/span&gt;
aws eks create-addon &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cluster-name&lt;/span&gt; my-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--addon-name&lt;/span&gt; vpc-cni &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--configuration-values&lt;/span&gt; &lt;span class="s1"&gt;'{"nodeAgent":{"enablePolicyEventLogs":"true"}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;When to choose AWS VPC CNI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Running EKS — it is the default and AWS-managed&lt;/li&gt;
&lt;li&gt;✅ Need pods directly reachable from on-premises via Direct Connect / VPN&lt;/li&gt;
&lt;li&gt;✅ Need per-pod AWS Security Groups (SGP feature)&lt;/li&gt;
&lt;li&gt;✅ Compliance requires no overlay network&lt;/li&gt;
&lt;li&gt;⚠️ Watch instance type ENI limits for large pod densities&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  3.2 Azure CNI — AKS Default
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Azure Kubernetes Service (AKS)&lt;/strong&gt; offers multiple CNI modes. The default for most production clusters is &lt;strong&gt;Azure CNI&lt;/strong&gt;, which assigns pod IPs directly from the Azure Virtual Network (VNET) subnet — similar in concept to AWS VPC CNI but using Azure's networking primitives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AKS CNI Modes:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Default?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;kubenet&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Basic overlay; nodes get VNET IPs, pods get private overlay IPs (NAT)&lt;/td&gt;
&lt;td&gt;Legacy default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure CNI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pods get real VNET IPs from a pre-allocated subnet&lt;/td&gt;
&lt;td&gt;Current recommended default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure CNI Overlay&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pods get overlay IPs (larger scale, fewer VNET IPs needed)&lt;/td&gt;
&lt;td&gt;Recommended for large clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure CNI + Cilium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Azure CNI routing + Cilium eBPF dataplane + Hubble&lt;/td&gt;
&lt;td&gt;Recommended for policy/observability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bring Your Own CNI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Disable Azure CNI; install Calico, Flannel, etc.&lt;/td&gt;
&lt;td&gt;Advanced&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Azure CNI (traditional):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AKS Worker Node (Azure VM)
    │
    ├── Primary NIC (node IP: 10.240.0.4)
    │      └── VNET: 10.240.0.0/16
    │
    └── Pod IPs pre-allocated from subnet:
           ├── 10.240.0.10 → Pod A
           ├── 10.240.0.11 → Pod B
           └── 10.240.0.12 → Pod C

azure-vnet (CNI plugin) programs routes in Azure SDN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Azure CNI Overlay (recommended for scale):&lt;/strong&gt;&lt;br&gt;
Introduced to solve IP exhaustion. Pods get IPs from a private overlay CIDR (e.g., 10.244.0.0/16) while nodes get real VNET IPs. Azure SDN handles the translation — no overlay encap at the packet level from the VM's perspective.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create AKS cluster with Azure CNI Overlay + Cilium dataplane&lt;/span&gt;
az aks create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--resource-group&lt;/span&gt; myRG &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; myAKS &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network-plugin&lt;/span&gt; azure &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network-plugin-mode&lt;/span&gt; overlay &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network-dataplane&lt;/span&gt; cilium &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pod-cidr&lt;/span&gt; 192.168.0.0/16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;kubenet&lt;/th&gt;
&lt;th&gt;Azure CNI&lt;/th&gt;
&lt;th&gt;Azure CNI Overlay&lt;/th&gt;
&lt;th&gt;Azure CNI + Cilium&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pod IPs&lt;/td&gt;
&lt;td&gt;Overlay (NAT)&lt;/td&gt;
&lt;td&gt;Real VNET IPs&lt;/td&gt;
&lt;td&gt;Overlay (Azure SDN)&lt;/td&gt;
&lt;td&gt;Overlay (Azure SDN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP exhaustion risk&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Direct pod routing&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (via Azure SDN)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NetworkPolicy&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;Azure Network Policy / Calico&lt;/td&gt;
&lt;td&gt;Azure NP / Calico&lt;/td&gt;
&lt;td&gt;✅ Cilium (eBPF)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows nodes&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hubble observability&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max pods/node&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;td&gt;250&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Network Policy options on AKS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Azure Network Policy Manager (NPM)&lt;/strong&gt; — iptables-based, Azure-native, limited feature set&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Calico&lt;/strong&gt; — add-on, full L3/L4 policy, most commonly used&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cilium&lt;/strong&gt; — available with Azure CNI Overlay mode, eBPF enforcement + Hubble&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to choose Azure CNI:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Running AKS — Azure CNI Overlay is the modern recommended choice&lt;/li&gt;
&lt;li&gt;✅ Need pods directly reachable from on-premises via ExpressRoute&lt;/li&gt;
&lt;li&gt;✅ Want Hubble observability → use Azure CNI Overlay + Cilium dataplane&lt;/li&gt;
&lt;li&gt;✅ Large clusters (100+ nodes) → use Overlay mode to avoid VNET IP exhaustion&lt;/li&gt;
&lt;li&gt;⚠️ Traditional Azure CNI requires pre-allocating pod IPs per node — plan subnet size carefully&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3.3 GKE Dataplane V2 — GKE Default
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Google Kubernetes Engine (GKE)&lt;/strong&gt; introduced &lt;strong&gt;Dataplane V2&lt;/strong&gt; in 2021, which is based on &lt;strong&gt;Cilium's eBPF engine&lt;/strong&gt;. It is the default for new GKE clusters and brings production-grade eBPF networking, built-in NetworkPolicy enforcement, and a subset of Hubble observability — all managed by Google.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GKE networking modes:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Default?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Legacy (iptables)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;kube-proxy + iptables, no Dataplane V2&lt;/td&gt;
&lt;td&gt;Older clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dataplane V2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cilium eBPF, managed by GKE, no full Cilium control plane&lt;/td&gt;
&lt;td&gt;Default for new clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dataplane V2 + Hubble&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same + network telemetry via Hubble&lt;/td&gt;
&lt;td&gt;Optional add-on&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Architecture:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GKE Node (GCE VM)
    │
    ├── Alias IP range (VPC-native pod CIDRs)
    │     Pods get real VPC IPs, routed via Google SDN
    │
    └── Dataplane V2 (Cilium eBPF engine)
           ├── TC eBPF hooks on veth interfaces
           ├── BPF maps for policy, NAT, LB
           ├── kube-proxy replaced by eBPF
           └── Hubble telemetry (if enabled)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GKE uses &lt;strong&gt;VPC-native networking&lt;/strong&gt; (alias IP ranges) — pods get real VPC CIDRs routed natively through Google's Andromeda SDN. Dataplane V2 sits on top, adding eBPF policy enforcement and observability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enabling Dataplane V2 on GKE:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create GKE cluster with Dataplane V2 (default for new clusters)&lt;/span&gt;
gcloud container clusters create my-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-dataplane-v2&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-ip-alias&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--location&lt;/span&gt; us-central1

&lt;span class="c"&gt;# Enable Hubble observability add-on&lt;/span&gt;
gcloud container clusters update my-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-dataplane-v2-flow-observability&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--location&lt;/span&gt; us-central1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;GKE Dataplane V2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dataplane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cilium eBPF (managed subset)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;kube-proxy replacement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ eBPF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NetworkPolicy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ eBPF-enforced (L3/L4)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FQDN policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ (GKE 1.28+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hubble observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Optional add-on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L7 policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Not exposed (managed limitations)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pod IPs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real VPC IPs (alias ranges)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows nodes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-cluster&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ via GKE Fleet / Anthos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Managed lifecycle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Google manages upgrades&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dataplane V2 vs self-managed Cilium on GKE:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;GKE Dataplane V2&lt;/th&gt;
&lt;th&gt;Self-managed Cilium on GKE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Management&lt;/td&gt;
&lt;td&gt;Google-managed&lt;/td&gt;
&lt;td&gt;You manage Helm values/upgrades&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Feature exposure&lt;/td&gt;
&lt;td&gt;Subset of Cilium&lt;/td&gt;
&lt;td&gt;Full Cilium feature set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hubble&lt;/td&gt;
&lt;td&gt;Basic (add-on)&lt;/td&gt;
&lt;td&gt;Full Hubble UI + Relay&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cluster Mesh&lt;/td&gt;
&lt;td&gt;✗ (use GKE Fleet)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L7 CNP&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;GKE SLA&lt;/td&gt;
&lt;td&gt;Community / Isovalent&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;GKE Recommendation:&lt;/strong&gt; For most workloads, &lt;strong&gt;Dataplane V2 is the right choice&lt;/strong&gt; — Google manages it, it's eBPF-based, and it covers L3/L4 policy. If you need full CiliumNetworkPolicy L7 rules or Cluster Mesh, consider self-managed Cilium on GKE with &lt;code&gt;--network-plugin=cni&lt;/code&gt; and disabling kube-proxy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;When to choose GKE Dataplane V2:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Running GKE — it is the default and Google-managed&lt;/li&gt;
&lt;li&gt;✅ Want eBPF performance without managing Cilium yourself&lt;/li&gt;
&lt;li&gt;✅ NetworkPolicy enforcement at scale (eBPF O(1) lookups)&lt;/li&gt;
&lt;li&gt;✅ Need basic Hubble network telemetry&lt;/li&gt;
&lt;li&gt;⚠️ For full L7 policy or Cluster Mesh, self-manage Cilium on GKE instead&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Data Plane Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Service Scalability — All CNIs
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Services&lt;/th&gt;
&lt;th&gt;Flannel (iptables)&lt;/th&gt;
&lt;th&gt;Calico (iptables)&lt;/th&gt;
&lt;th&gt;Calico (eBPF)&lt;/th&gt;
&lt;th&gt;Cilium (eBPF)&lt;/th&gt;
&lt;th&gt;AWS VPC CNI&lt;/th&gt;
&lt;th&gt;Azure CNI&lt;/th&gt;
&lt;th&gt;GKE DPv2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;~10 ms&lt;/td&gt;
&lt;td&gt;~10 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;td&gt;~10 ms&lt;/td&gt;
&lt;td&gt;~10 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;~80 ms&lt;/td&gt;
&lt;td&gt;~80 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;td&gt;~80 ms&lt;/td&gt;
&lt;td&gt;~80 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;~800 ms&lt;/td&gt;
&lt;td&gt;~800 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;td&gt;~800 ms&lt;/td&gt;
&lt;td&gt;~800 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;⚠️ drops&lt;/td&gt;
&lt;td&gt;⚠️ drops&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;td&gt;⚠️ drops&lt;/td&gt;
&lt;td&gt;⚠️ drops&lt;/td&gt;
&lt;td&gt;&amp;lt; 1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  5. Network Policy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Policy Feature Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Policy Feature&lt;/th&gt;
&lt;th&gt;Flannel&lt;/th&gt;
&lt;th&gt;Calico&lt;/th&gt;
&lt;th&gt;Cilium&lt;/th&gt;
&lt;th&gt;Weave&lt;/th&gt;
&lt;th&gt;Antrea&lt;/th&gt;
&lt;th&gt;AWS VPC CNI&lt;/th&gt;
&lt;th&gt;Azure CNI&lt;/th&gt;
&lt;th&gt;GKE DPv2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Standard NetworkPolicy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (add-on)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Egress Policy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GlobalNetworkPolicy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ CCNP&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ ClusterNetworkPolicy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FQDN / DNS policy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ (1.28+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L7 HTTP method/path&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;⚠️ ALP&lt;/td&gt;
&lt;td&gt;✅ no sidecar&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kafka / gRPC policy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiered policy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security Groups (cloud)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ SGP&lt;/td&gt;
&lt;td&gt;✅ NSG&lt;/td&gt;
&lt;td&gt;✅ Firewall rules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6. Observability
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Flannel&lt;/th&gt;
&lt;th&gt;Calico&lt;/th&gt;
&lt;th&gt;Cilium&lt;/th&gt;
&lt;th&gt;Weave&lt;/th&gt;
&lt;th&gt;Antrea&lt;/th&gt;
&lt;th&gt;AWS VPC CNI&lt;/th&gt;
&lt;th&gt;Azure CNI&lt;/th&gt;
&lt;th&gt;GKE DPv2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;L3/L4 flow logs&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ VPC Flow Logs&lt;/td&gt;
&lt;td&gt;✅ NSG Flow Logs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L7 HTTP flows&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (OSS)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live service map&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ Hubble UI&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ Octant&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ (add-on)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drop reason&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prometheus metrics&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Rich&lt;/td&gt;
&lt;td&gt;✅ Basic&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ CloudWatch&lt;/td&gt;
&lt;td&gt;✅ Azure Monitor&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in UI&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (OSS)&lt;/td&gt;
&lt;td&gt;✅ Hubble UI&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ Octant&lt;/td&gt;
&lt;td&gt;✅ CloudWatch&lt;/td&gt;
&lt;td&gt;✅ Azure Monitor&lt;/td&gt;
&lt;td&gt;✅ Cloud Console&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  7. Performance Benchmarks
&lt;/h2&gt;

&lt;h3&gt;
  
  
  TCP Throughput — iperf3, Pod-to-Pod Same Node
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CNI&lt;/th&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Throughput&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flannel&lt;/td&gt;
&lt;td&gt;VXLAN&lt;/td&gt;
&lt;td&gt;~8 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flannel&lt;/td&gt;
&lt;td&gt;host-gw&lt;/td&gt;
&lt;td&gt;~9.5 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calico&lt;/td&gt;
&lt;td&gt;BGP direct (iptables)&lt;/td&gt;
&lt;td&gt;~9.3 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calico&lt;/td&gt;
&lt;td&gt;BGP direct (eBPF)&lt;/td&gt;
&lt;td&gt;~9.7 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cilium&lt;/td&gt;
&lt;td&gt;GENEVE tunnel&lt;/td&gt;
&lt;td&gt;~8.5 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cilium&lt;/td&gt;
&lt;td&gt;native-routing&lt;/td&gt;
&lt;td&gt;~9.8 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cilium&lt;/td&gt;
&lt;td&gt;XDP&lt;/td&gt;
&lt;td&gt;line rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS VPC CNI&lt;/td&gt;
&lt;td&gt;Native VPC routing&lt;/td&gt;
&lt;td&gt;~9.5 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure CNI&lt;/td&gt;
&lt;td&gt;Native VNET routing&lt;/td&gt;
&lt;td&gt;~9.4 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GKE Dataplane V2&lt;/td&gt;
&lt;td&gt;Alias IP + eBPF&lt;/td&gt;
&lt;td&gt;~9.7 Gbps&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Results are representative — hardware, kernel version, and NIC driver all affect real-world numbers.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  p99 Latency — Same Node
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CNI&lt;/th&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;p99 Latency&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Flannel&lt;/td&gt;
&lt;td&gt;VXLAN&lt;/td&gt;
&lt;td&gt;~0.35 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flannel&lt;/td&gt;
&lt;td&gt;host-gw&lt;/td&gt;
&lt;td&gt;~0.18 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calico&lt;/td&gt;
&lt;td&gt;BGP direct (eBPF)&lt;/td&gt;
&lt;td&gt;~0.15 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cilium&lt;/td&gt;
&lt;td&gt;native-routing&lt;/td&gt;
&lt;td&gt;~0.16 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS VPC CNI&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;~0.17 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure CNI&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;~0.18 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GKE Dataplane V2&lt;/td&gt;
&lt;td&gt;eBPF&lt;/td&gt;
&lt;td&gt;~0.15 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  8. Encryption
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Flannel WG&lt;/th&gt;
&lt;th&gt;Calico WG&lt;/th&gt;
&lt;th&gt;Cilium WG&lt;/th&gt;
&lt;th&gt;Cilium IPsec&lt;/th&gt;
&lt;th&gt;Antrea WG/IPsec&lt;/th&gt;
&lt;th&gt;AWS CNI&lt;/th&gt;
&lt;th&gt;Azure CNI&lt;/th&gt;
&lt;th&gt;GKE DPv2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cross-node encryption&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (NLB/TLS)&lt;/td&gt;
&lt;td&gt;✅ (Azure Firewall)&lt;/td&gt;
&lt;td&gt;✅ (WireGuard, beta)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same-node encryption&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ (v3.26+)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strict drop mode&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto key rotation&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FIPS compliance&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ IPsec&lt;/td&gt;
&lt;td&gt;✅ (AWS FIPS)&lt;/td&gt;
&lt;td&gt;✅ (Azure FIPS)&lt;/td&gt;
&lt;td&gt;✅ (Google FIPS)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  9. Multi-Cluster
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Flannel&lt;/th&gt;
&lt;th&gt;Calico&lt;/th&gt;
&lt;th&gt;Cilium&lt;/th&gt;
&lt;th&gt;Antrea&lt;/th&gt;
&lt;th&gt;AWS EKS&lt;/th&gt;
&lt;th&gt;Azure AKS&lt;/th&gt;
&lt;th&gt;GKE&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Native multi-cluster&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ BGP&lt;/td&gt;
&lt;td&gt;✅ Cluster Mesh&lt;/td&gt;
&lt;td&gt;✅ Antrea Multi-cluster&lt;/td&gt;
&lt;td&gt;✅ EKS Connector&lt;/td&gt;
&lt;td&gt;✅ AKS Fleet&lt;/td&gt;
&lt;td&gt;✅ GKE Fleet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unified service DNS&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ (manual)&lt;/td&gt;
&lt;td&gt;⚠️ (manual)&lt;/td&gt;
&lt;td&gt;✅ (Anthos)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-cluster NetworkPolicy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (OSS)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ (Anthos)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-cluster observability&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ Hubble&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ CloudWatch&lt;/td&gt;
&lt;td&gt;✅ Azure Monitor&lt;/td&gt;
&lt;td&gt;✅ Cloud Ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max clusters&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  10. Resource Usage
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Flannel&lt;/th&gt;
&lt;th&gt;Calico&lt;/th&gt;
&lt;th&gt;Cilium&lt;/th&gt;
&lt;th&gt;Weave&lt;/th&gt;
&lt;th&gt;Antrea&lt;/th&gt;
&lt;th&gt;AWS VPC CNI&lt;/th&gt;
&lt;th&gt;Azure CNI&lt;/th&gt;
&lt;th&gt;GKE DPv2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DaemonSet CPU (idle)&lt;/td&gt;
&lt;td&gt;~5 mCPU&lt;/td&gt;
&lt;td&gt;~20–60 mCPU&lt;/td&gt;
&lt;td&gt;~30–80 mCPU&lt;/td&gt;
&lt;td&gt;~10–30 mCPU&lt;/td&gt;
&lt;td&gt;~20–50 mCPU&lt;/td&gt;
&lt;td&gt;~10–25 mCPU&lt;/td&gt;
&lt;td&gt;~10–30 mCPU&lt;/td&gt;
&lt;td&gt;~30–80 mCPU&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DaemonSet RAM (idle)&lt;/td&gt;
&lt;td&gt;~30 MB&lt;/td&gt;
&lt;td&gt;~60–150 MB&lt;/td&gt;
&lt;td&gt;~100–300 MB&lt;/td&gt;
&lt;td&gt;~50–100 MB&lt;/td&gt;
&lt;td&gt;~50–100 MB&lt;/td&gt;
&lt;td&gt;~30–80 MB&lt;/td&gt;
&lt;td&gt;~40–80 MB&lt;/td&gt;
&lt;td&gt;~100–300 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Startup time&lt;/td&gt;
&lt;td&gt;~5s&lt;/td&gt;
&lt;td&gt;~10–20s&lt;/td&gt;
&lt;td&gt;~30–60s&lt;/td&gt;
&lt;td&gt;~10s&lt;/td&gt;
&lt;td&gt;~10–15s&lt;/td&gt;
&lt;td&gt;~5–10s&lt;/td&gt;
&lt;td&gt;~5–10s&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Additional CRDs&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;~8&lt;/td&gt;
&lt;td&gt;~15&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;~10&lt;/td&gt;
&lt;td&gt;0–2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimum kernel&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Any / ≥5.3 (eBPF)&lt;/td&gt;
&lt;td&gt;≥4.9&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;td&gt;GKE-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operator required&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ tigera&lt;/td&gt;
&lt;td&gt;✅ cilium-operator&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ antrea-controller&lt;/td&gt;
&lt;td&gt;AWS-managed&lt;/td&gt;
&lt;td&gt;Azure-managed&lt;/td&gt;
&lt;td&gt;GKE-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  11. Full Feature Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Flannel&lt;/th&gt;
&lt;th&gt;Calico&lt;/th&gt;
&lt;th&gt;Cilium&lt;/th&gt;
&lt;th&gt;Weave&lt;/th&gt;
&lt;th&gt;Antrea&lt;/th&gt;
&lt;th&gt;AWS VPC CNI&lt;/th&gt;
&lt;th&gt;Azure CNI&lt;/th&gt;
&lt;th&gt;GKE DPv2&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data plane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bridge + iptables&lt;/td&gt;
&lt;td&gt;BGP + iptables/eBPF&lt;/td&gt;
&lt;td&gt;eBPF kernel-native&lt;/td&gt;
&lt;td&gt;Mesh sleeve/VXLAN&lt;/td&gt;
&lt;td&gt;OVS&lt;/td&gt;
&lt;td&gt;VPC native&lt;/td&gt;
&lt;td&gt;VNET native&lt;/td&gt;
&lt;td&gt;eBPF (Cilium)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;kube-proxy replacement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ (eBPF)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ AntreaProxy&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Encapsulation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VXLAN&lt;/td&gt;
&lt;td&gt;None/IPIP/VXLAN&lt;/td&gt;
&lt;td&gt;GENEVE&lt;/td&gt;
&lt;td&gt;Sleeve/VXLAN&lt;/td&gt;
&lt;td&gt;Geneve/VXLAN&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;BGP routing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ native&lt;/td&gt;
&lt;td&gt;✅ optional&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L3/L4 NetworkPolicy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (add-on)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L7 HTTP/gRPC policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;⚠️ ALP&lt;/td&gt;
&lt;td&gt;✅ no sidecar&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FQDN-based policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ (1.28+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GlobalNetworkPolicy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ CCNP&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ CNP&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flow observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ flow logs&lt;/td&gt;
&lt;td&gt;✅ Hubble&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ Octant&lt;/td&gt;
&lt;td&gt;✅ VPC Flow&lt;/td&gt;
&lt;td&gt;✅ NSG Flow&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;L7 flow visibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗ (OSS)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cross-node encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ WG&lt;/td&gt;
&lt;td&gt;✅ WG&lt;/td&gt;
&lt;td&gt;✅ WG/IPsec&lt;/td&gt;
&lt;td&gt;✅ NaCl&lt;/td&gt;
&lt;td&gt;✅ WG/IPsec&lt;/td&gt;
&lt;td&gt;Cloud-layer&lt;/td&gt;
&lt;td&gt;Cloud-layer&lt;/td&gt;
&lt;td&gt;✅ WG (beta)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Same-node encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ (v3.26+)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FIPS encryption&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ IPsec&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ IPsec&lt;/td&gt;
&lt;td&gt;✅ (AWS)&lt;/td&gt;
&lt;td&gt;✅ (Azure)&lt;/td&gt;
&lt;td&gt;✅ (GCP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-cluster&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅ BGP&lt;/td&gt;
&lt;td&gt;✅ Cluster Mesh&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;EKS Fleet&lt;/td&gt;
&lt;td&gt;AKS Fleet&lt;/td&gt;
&lt;td&gt;GKE Fleet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows nodes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅ HNS&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud default&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;K3s&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;GKE&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;EKS&lt;/td&gt;
&lt;td&gt;AKS&lt;/td&gt;
&lt;td&gt;GKE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAM per node (idle)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~30 MB&lt;/td&gt;
&lt;td&gt;~60–150 MB&lt;/td&gt;
&lt;td&gt;~100–300 MB&lt;/td&gt;
&lt;td&gt;~50–100 MB&lt;/td&gt;
&lt;td&gt;~50–100 MB&lt;/td&gt;
&lt;td&gt;~30–80 MB&lt;/td&gt;
&lt;td&gt;~40–80 MB&lt;/td&gt;
&lt;td&gt;~100–300 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operational complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Medium–High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Low (managed)&lt;/td&gt;
&lt;td&gt;Low (managed)&lt;/td&gt;
&lt;td&gt;Low (managed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Active development&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️ Archived&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  12. When to Choose Each
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🟢 Choose Flannel when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Dev, CI, or home lab cluster with no production traffic&lt;/li&gt;
&lt;li&gt;✅ No NetworkPolicy requirement whatsoever&lt;/li&gt;
&lt;li&gt;✅ RAM-constrained nodes (Raspberry Pi, 1 GB edge devices)&lt;/li&gt;
&lt;li&gt;✅ You want the absolute lowest operational overhead&lt;/li&gt;
&lt;li&gt;✅ Running a legacy kernel (RHEL 7 / CentOS 7)&lt;/li&gt;
&lt;li&gt;✅ Already using a service mesh (Istio, Linkerd) for policy and observability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟠 Choose Calico when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ NetworkPolicy is required and Cilium feels like overkill&lt;/li&gt;
&lt;li&gt;✅ You need BGP peering with upstream physical routers&lt;/li&gt;
&lt;li&gt;✅ Windows nodes exist in your cluster&lt;/li&gt;
&lt;li&gt;✅ No-encap direct routing is preferred for performance&lt;/li&gt;
&lt;li&gt;✅ Your team already has Calico expertise&lt;/li&gt;
&lt;li&gt;✅ Medium cluster size (10–200 nodes) with moderate policy complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔵 Choose Cilium when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ L7 HTTP/gRPC/Kafka policy without a service mesh sidecar&lt;/li&gt;
&lt;li&gt;✅ Hubble observability and a live service map are needed&lt;/li&gt;
&lt;li&gt;✅ 100+ services with high service churn (eBPF O(1) matters)&lt;/li&gt;
&lt;li&gt;✅ End-to-end pod traffic encryption including same-node&lt;/li&gt;
&lt;li&gt;✅ Multi-cluster federation with unified DNS and policy&lt;/li&gt;
&lt;li&gt;✅ Building toward zero-trust networking inside the cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟡 Choose Weave when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Generally not recommended for new clusters&lt;/strong&gt; — Weaveworks is archived&lt;/li&gt;
&lt;li&gt;✅ Only if migrating from an existing Weave deployment with no immediate migration path&lt;/li&gt;
&lt;li&gt;✅ Simple overlay needed with built-in NaCl encryption (short term)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🟣 Choose Antrea when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ VMware NSX-T / Tanzu environment requiring deep SD-WAN integration&lt;/li&gt;
&lt;li&gt;✅ Tiered network policy enforcement (Emergency / Security / Application tiers)&lt;/li&gt;
&lt;li&gt;✅ Windows and Linux mixed clusters in an enterprise VMware stack&lt;/li&gt;
&lt;li&gt;✅ OVS dataplane is a hard requirement (telco, NFV)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔶 Choose AWS VPC CNI (EKS) when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Running EKS — it is the default AWS-recommended CNI&lt;/li&gt;
&lt;li&gt;✅ Pods must be natively routable across VPC, VPN, or Direct Connect&lt;/li&gt;
&lt;li&gt;✅ Per-pod AWS Security Groups are required (SGP feature)&lt;/li&gt;
&lt;li&gt;✅ Compliance mandates no overlay network&lt;/li&gt;
&lt;li&gt;✅ Integrate with AWS services that need pod-level VPC routing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔷 Choose Azure CNI (AKS) when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Running AKS — use Azure CNI Overlay mode for most production workloads&lt;/li&gt;
&lt;li&gt;✅ Pods need to be reachable from on-prem via ExpressRoute&lt;/li&gt;
&lt;li&gt;✅ Want eBPF performance + Hubble → choose Azure CNI Overlay + Cilium dataplane&lt;/li&gt;
&lt;li&gt;✅ Large clusters → Azure CNI Overlay avoids VNET IP exhaustion&lt;/li&gt;
&lt;li&gt;✅ Windows node support is required (all Azure CNI modes support it)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ♦️ Choose GKE Dataplane V2 (GKE) when…
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Running GKE — it is the default for new clusters&lt;/li&gt;
&lt;li&gt;✅ Want eBPF-based policy without managing Cilium yourself&lt;/li&gt;
&lt;li&gt;✅ Need Hubble network telemetry (enable as add-on)&lt;/li&gt;
&lt;li&gt;✅ FQDN-based NetworkPolicy (GKE 1.28+)&lt;/li&gt;
&lt;li&gt;✅ Google-managed lifecycle and upgrades are preferred&lt;/li&gt;
&lt;li&gt;⚠️ For L7 CNP or Cluster Mesh, self-manage Cilium on GKE instead&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  13. K3s-Specific Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Flannel — Built-In, Nothing to Do
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Flannel ships with K3s — just install&lt;/span&gt;
curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://get.k3s.io | sh -

&lt;span class="c"&gt;# Change backend in /etc/rancher/k3s/config.yaml&lt;/span&gt;
flannel-backend: host-gw   &lt;span class="c"&gt;# vxlan | host-gw | wireguard-native | none&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing Calico on K3s
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Install K3s without Flannel:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://get.k3s.io | &lt;span class="nv"&gt;INSTALL_K3S_EXEC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"--flannel-backend=none &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  --disable-network-policy &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  --cluster-cidr=192.168.0.0/16"&lt;/span&gt; sh -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2 — Install Calico operator:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3 — Apply Installation CR:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;operator.tigera.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Installation&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;calicoNetwork&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;ipPools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cidr&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;192.168.0.0/16&lt;/span&gt;
      &lt;span class="na"&gt;encapsulation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;VXLANCrossSubnet&lt;/span&gt;
      &lt;span class="na"&gt;natOutgoing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enabled&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing Cilium on K3s
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Install K3s without Flannel:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sfL&lt;/span&gt; https://get.k3s.io | &lt;span class="nv"&gt;INSTALL_K3S_EXEC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"--flannel-backend=none &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  --disable-network-policy &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
  --disable=servicelb"&lt;/span&gt; sh -
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2 — Install Cilium via Helm:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;helm repo add cilium https://helm.cilium.io/
helm &lt;span class="nb"&gt;install &lt;/span&gt;cilium cilium/cilium &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; kube-system &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; operator.replicas&lt;span class="o"&gt;=&lt;/span&gt;1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;kubeProxyReplacement&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;k8sServiceHost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;YOUR_K3S_API_IP&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;k8sServicePort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6443 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; bpf.masquerade&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; ipam.mode&lt;span class="o"&gt;=&lt;/span&gt;kubernetes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Minimum Kernel Requirements
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Cilium&lt;/th&gt;
&lt;th&gt;Calico eBPF&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basic CNI&lt;/td&gt;
&lt;td&gt;≥ 4.9&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;kube-proxy replacement&lt;/td&gt;
&lt;td&gt;≥ 5.2&lt;/td&gt;
&lt;td&gt;≥ 5.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WireGuard encryption&lt;/td&gt;
&lt;td&gt;≥ 5.6&lt;/td&gt;
&lt;td&gt;≥ 5.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XDP acceleration&lt;/td&gt;
&lt;td&gt;≥ 5.10&lt;/td&gt;
&lt;td&gt;≥ 5.10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Ubuntu 22.04 ships kernel 5.15, Debian 12 ships 6.1, Raspberry Pi OS Bookworm ships 6.1 — all satisfy every requirement.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  14. Migration Guide on K3s
&lt;/h2&gt;

&lt;p&gt;All migrations follow the same pattern:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;drain → clean CNI state → restart K3s with &lt;code&gt;--flannel-backend=none&lt;/code&gt; → install new CNI → uncordon&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Flannel → Calico
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Drain the node&lt;/span&gt;
kubectl drain &amp;lt;node&amp;gt; &lt;span class="nt"&gt;--ignore-daemonsets&lt;/span&gt; &lt;span class="nt"&gt;--delete-emptydir-data&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Remove Flannel state on the node&lt;/span&gt;
systemctl stop k3s
ip &lt;span class="nb"&gt;link &lt;/span&gt;delete flannel.1 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
&lt;/span&gt;ip &lt;span class="nb"&gt;link &lt;/span&gt;delete cni0 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true
rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/cni /etc/cni/net.d

&lt;span class="c"&gt;# Step 3: Set flannel-backend: none in /etc/rancher/k3s/config.yaml, then restart&lt;/span&gt;
systemctl start k3s

&lt;span class="c"&gt;# Step 4: Install Calico operator&lt;/span&gt;
kubectl create &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml

&lt;span class="c"&gt;# Step 5: Uncordon&lt;/span&gt;
kubectl uncordon &amp;lt;node&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Flannel → Cilium
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Steps 1–3 same as above (drain, clean, restart with flannel-backend=none)&lt;/span&gt;

&lt;span class="c"&gt;# Step 4: Install Cilium&lt;/span&gt;
helm repo add cilium https://helm.cilium.io/
helm &lt;span class="nb"&gt;install &lt;/span&gt;cilium cilium/cilium &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--namespace&lt;/span&gt; kube-system &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;kubeProxyReplacement&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;k8sServiceHost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;API_IP&amp;gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set&lt;/span&gt; &lt;span class="nv"&gt;k8sServicePort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6443

&lt;span class="c"&gt;# Step 5: Uncordon&lt;/span&gt;
kubectl uncordon &amp;lt;node&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Pro Tip:&lt;/strong&gt; For single-node K3s lab environments, a clean reinstall is always faster and safer than a live migration. Run &lt;code&gt;k3s-uninstall.sh&lt;/code&gt;, reinstall with the correct flags, then Helm install your chosen CNI — total time is about 10 minutes.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  15. Conclusion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Open-Source CNIs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🟢 Flannel&lt;/strong&gt; — A masterpiece of minimalism. One job, done perfectly, with near-zero operational overhead. The right choice when simplicity and RAM constraints matter more than policy or observability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🟠 Calico&lt;/strong&gt; — The policy-first CNI. BGP-native routing, mature L3/L4 NetworkPolicy, Windows node support, and a pluggable data plane. The right choice when you need robust policy enforcement, prefer no-encap routing, or operate in an environment with existing BGP infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🔵 Cilium&lt;/strong&gt; — The platform CNI. eBPF-native with O(1) service lookup, L7-aware policy with no sidecar, Hubble observability, full pod-traffic encryption, and Cluster Mesh multi-cluster. The most capable networking layer available in Kubernetes today.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🟡 Weave Net&lt;/strong&gt; — Once a popular choice for simplicity and built-in encryption. Now archived — migrate to Cilium or Calico for any new or long-running cluster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🟣 Antrea&lt;/strong&gt; — The VMware-native CNI. OVS dataplane, tiered policy, Windows support, and NSX-T integration. The right choice in Tanzu or NSX environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🔷 Multus&lt;/strong&gt; — Not a CNI replacement but a CNI multiplier. Essential for telco/NFV workloads needing multiple pod network interfaces.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cloud Provider CNIs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🔶 AWS VPC CNI (EKS)&lt;/strong&gt; — Native VPC IP assignment with no overlay. Pods are first-class VPC citizens. Add Calico or the AWS-native policy controller for NetworkPolicy. Choose prefix delegation for high pod density.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;🔷 Azure CNI (AKS)&lt;/strong&gt; — Use &lt;strong&gt;Azure CNI Overlay&lt;/strong&gt; for most production workloads to avoid IP exhaustion, and add the &lt;strong&gt;Cilium dataplane&lt;/strong&gt; for eBPF policy + Hubble observability. Azure CNI traditional still works, but requires careful subnet pre-planning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;♦️ GKE Dataplane V2 (GKE)&lt;/strong&gt; — Google's managed Cilium eBPF layer. The default for new GKE clusters. Handles NetworkPolicy at scale with eBPF O(1) lookups. Add the Hubble observability add-on for network telemetry. Self-manage Cilium on GKE only if you need L7 CNP or Cluster Mesh.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; If you run a managed Kubernetes service, use the cloud-default CNI and layer policy/observability on top. If you run self-managed clusters, Cilium is the most capable long-term investment, with Calico as the pragmatic choice if BGP integration or Windows nodes are required.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The networking layer of your cluster is not where you want to cut corners at scale.&lt;br&gt;
&lt;strong&gt;Choose based on where your cluster is going — not just where it is today.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.cilium.io/en/stable/installation/k3s/" rel="noopener noreferrer"&gt;Cilium K3s Installation Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cilium.io/blog/2021/05/11/cni-benchmark/" rel="noopener noreferrer"&gt;Cilium Network Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.tigera.io/calico/latest/getting-started/kubernetes/k3s/" rel="noopener noreferrer"&gt;Calico on K3s — Official Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/flannel-io/flannel" rel="noopener noreferrer"&gt;Flannel GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mvallim.github.io/kubernetes-under-the-hood/documentation/kube-flannel.html" rel="noopener noreferrer"&gt;Flannel Networking&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/antrea-io/antrea" rel="noopener noreferrer"&gt;Antrea GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aws/amazon-vpc-cni-k8s" rel="noopener noreferrer"&gt;AWS VPC CNI GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/aks/azure-cni-overlay" rel="noopener noreferrer"&gt;Azure CNI Overlay Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs/concepts/dataplane-v2" rel="noopener noreferrer"&gt;GKE Dataplane V2 Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.cilium.io/en/stable/network/clustermesh/" rel="noopener noreferrer"&gt;Cilium Cluster Mesh Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.tigera.io/calico/latest/reference/resources/globalnetworkpolicy" rel="noopener noreferrer"&gt;Calico GlobalNetworkPolicy Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://antrea.io/docs/main/docs/antrea-network-policy/" rel="noopener noreferrer"&gt;Antrea Network Policy Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Written for K3s v1.29+, Cilium v1.15+, Calico v3.27+, Flannel v0.24+, AWS VPC CNI v1.18+, Azure CNI v1.5+, GKE 1.28+. Benchmark figures are representative — always test with your own hardware and workload before production decisions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>networking</category>
      <category>cni</category>
      <category>devops</category>
    </item>
    <item>
      <title>⚖️ Case File 2.1: The Prompt-and-Pray Conspiracy</title>
      <dc:creator>Manoj Mishra</dc:creator>
      <pubDate>Tue, 12 May 2026 03:30:00 +0000</pubDate>
      <link>https://dev.to/manojsatna31/case-file-21-the-prompt-and-pray-conspiracy-4bbp</link>
      <guid>https://dev.to/manojsatna31/case-file-21-the-prompt-and-pray-conspiracy-4bbp</guid>
      <description>&lt;blockquote&gt;
&lt;h3&gt;
  
  
  The AI Syndicate
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;AI doesn't make you a better engineer; it makes you a faster version of whoever you already are. If you’re a "Software Criminal," it just makes you a Serial Offender.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In our transition to &lt;strong&gt;Agentic Development&lt;/strong&gt;, we’ve entered a dangerous era. With 17+ years in tech, I’ve seen the shift from "copying from StackOverflow" to "prompting an LLM." The difference? AI produces "plausible-looking" code at machine speed. This is the &lt;strong&gt;Prompt-and-Pray Conspiracy&lt;/strong&gt;, and it is the fastest way to lose your technical authority.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎭 The Crime: The Black-Box Handover
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;If you can't explain the code the AI wrote, you didn't "build" it—you just found it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Scenario&lt;/strong&gt;: A developer uses an AI agent to generate a complex data transformation logic involving multiple streams and nested loops.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Crime&lt;/strong&gt;: Copying the generated code directly into the PR without stepping through the logic to understand the time complexity ($O(n^2)$ vs $O(n)$).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Brutality&lt;/strong&gt;: The code works in staging with small datasets but causes a memory leak and production timeout when the first 100k records hit. The developer is unable to debug it because they don't understand the "black-box" logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to Avoid It&lt;/strong&gt;: Treat AI as a junior intern, not a senior architect. Every line it writes must be vetted by your brain as if you were doing a hostile code review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brutal Habit to Adopt: The Verification Loop.&lt;/strong&gt; Never merge AI code until you can manually trace the data path and explain the "Why" behind every generated abstraction.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Own the Output."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🤖 The Crime: The "LGTM" for Agents
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Trusting an AI to review an AI is like letting two toddlers guard the cookie jar.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Scenario&lt;/strong&gt;: A team sets up an automated AI agent to review Pull Requests. The agent checks for linting and syntax but misses a critical logical flaw in the transaction management.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Crime&lt;/strong&gt;: Delegating the "Human Judgment" of a code review to a model that only understands patterns, not business consequences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Brutality&lt;/strong&gt;: The "clean" code is merged, leading to partial database writes because the AI didn't catch that the &lt;code&gt;@Transactional&lt;/code&gt; annotation was on a private method (a common Java pitfall).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to Avoid It&lt;/strong&gt;: Automated tools are for &lt;strong&gt;syntax&lt;/strong&gt;; humans are for &lt;strong&gt;semantics&lt;/strong&gt;. Use AI to find typos, but never let it sign off on logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brutal Habit to Adopt: The Manual Intercept.&lt;/strong&gt; Even if an AI agent gives a "Green Check," a human architect must perform a high-level logic verification before any merge to the main branch.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Judgment is Non-Transferable."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧩 The Crime: The Context Collapse
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;AI is brilliant at functions but blind to systems.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Scenario&lt;/strong&gt;: A developer prompts an AI to "optimize this specific function" in a high-concurrency microservice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Crime&lt;/strong&gt;: Implementing a local optimization (like adding a local cache) while ignoring the global system impact (cache inconsistency across multiple nodes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Brutality&lt;/strong&gt;: The function is now 5x faster, but the system starts returning stale data, leading to financial discrepancies that take weeks to reconcile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to Avoid It&lt;/strong&gt;: Before applying an AI suggestion, zoom out. Ask: "How does this local change affect the upstream database and downstream services?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brutal Habit to Adopt: The Context Anchor.&lt;/strong&gt; Before you prompt, define the system constraints (Concurrency, Latency, Consistency). If the AI response ignores these anchors, discard it.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"System Over Syntax."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🛠️ Case File Takeaway: The "Logic First" Rule
&lt;/h2&gt;

&lt;p&gt;AI should be the &lt;em&gt;last&lt;/em&gt; step in your process, not the first.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Professional Tip&lt;/strong&gt;: When faced with a complex task, design the logic on paper first. Map out the input, the transformation, and the expected output. Once your "Paper Model" is solid, use the AI only to generate the boilerplate. If the AI’s logic differs from your paper model, the AI is wrong until proven otherwise.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📋 Cheat Sheet: The AI Syndicate
&lt;/h2&gt;

&lt;h5&gt;
  
  
  [&lt;em&gt;The Prompt-and-Pray Conspiracy&lt;/em&gt;]
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The Crime&lt;/th&gt;
&lt;th&gt;The Red Flag&lt;/th&gt;
&lt;th&gt;The Fix&lt;/th&gt;
&lt;th&gt;Mnemonic&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Brutal Habit to Adopt&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Black-Box Handover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"I'm not sure how this part works."&lt;/td&gt;
&lt;td&gt;Trace every line manually.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Own the Output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Verification Loop&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agent LGTM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"The AI said the PR is fine."&lt;/td&gt;
&lt;td&gt;Logic reviews are human-only.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Judgment is Non-Transferable&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Manual Intercept&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Collapse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"It works for this function."&lt;/td&gt;
&lt;td&gt;Check upstream/downstream impact.&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;System Over Syntax&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Context Anchor&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;Next Drop:&lt;/strong&gt; We move to &lt;strong&gt;Case File 2.2: The Stagnation Syndicate&lt;/strong&gt;, where we discuss the crime of using outdated patterns in a modern, agentic world.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What’s the most "confident" but completely wrong code an AI has ever given you?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;💬&lt;em&gt;Let’s talk in the comments.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Migrating Off Google Analytics: Umami vs Plausible vs Fathom</title>
      <dc:creator>Alan West</dc:creator>
      <pubDate>Tue, 12 May 2026 03:18:38 +0000</pubDate>
      <link>https://dev.to/alanwest/migrating-off-google-analytics-umami-vs-plausible-vs-fathom-36gc</link>
      <guid>https://dev.to/alanwest/migrating-off-google-analytics-umami-vs-plausible-vs-fathom-36gc</guid>
      <description>&lt;h2&gt;
  
  
  The wake-up call I didn't ask for
&lt;/h2&gt;

&lt;p&gt;Last week the TanStack folks reported what appears to be a compromise affecting some of their NPM packages (the details are still being sorted out in &lt;a href="https://github.com/TanStack/router/issues/7383" rel="noopener noreferrer"&gt;issue #7383&lt;/a&gt; — read it yourself before drawing conclusions). I won't rehash the postmortem here. What I want to talk about is the gut-punch feeling I had reading it.&lt;/p&gt;

&lt;p&gt;I run &lt;code&gt;npm install&lt;/code&gt; every day. I've barely thought about which third-party scripts are loading in production. And one of the worst offenders sitting in nearly every site I've ever shipped? Analytics.&lt;/p&gt;

&lt;p&gt;So this post is about something I've been chewing on for months but finally moved on: ripping Google Analytics out of three side projects and picking a privacy-focused alternative. Specifically, I'll compare &lt;a href="https://umami.is" rel="noopener noreferrer"&gt;Umami&lt;/a&gt;, &lt;a href="https://plausible.io" rel="noopener noreferrer"&gt;Plausible&lt;/a&gt;, and &lt;a href="https://usefathom.com" rel="noopener noreferrer"&gt;Fathom&lt;/a&gt; — the three I actually evaluated — and walk through the migration steps that worked for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why even migrate?
&lt;/h2&gt;

&lt;p&gt;A few honest reasons, none of them ideological:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Script weight.&lt;/strong&gt; GA4's &lt;code&gt;gtag.js&lt;/code&gt; is heavy. The privacy-focused tools are typically 1–2 KB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cookie banners.&lt;/strong&gt; No cookies = no consent banner in most jurisdictions. Fewer modals = fewer bounces.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vendor trust.&lt;/strong&gt; After watching a supply chain story unfold in real time, having fewer third-party scripts feels less reckless.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosting option.&lt;/strong&gt; If I can run it on my own infra, I control the script.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you genuinely need Google's audience features (remarketing, conversion linking to Google Ads), this post probably isn't for you. Stay where you are.&lt;/p&gt;

&lt;h2&gt;
  
  
  The contenders
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Plausible
&lt;/h3&gt;

&lt;p&gt;Open source (AGPL), GDPR/CCPA compliant, cloud or self-hosted. The script is small — the docs claim under 1 KB. Written in Elixir. Cloud plans are subscription-based.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fathom
&lt;/h3&gt;

&lt;p&gt;Privacy-focused, cloud-only since they pivoted from the original open source v1 ("Fathom Lite," archived) to a commercial closed-source product. I evaluated the commercial product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Umami
&lt;/h3&gt;

&lt;p&gt;Open source (MIT), self-hosted by default with a hosted cloud option on &lt;code&gt;umami.is&lt;/code&gt;. Built on Next.js, runs on PostgreSQL or MySQL. Free if you host it yourself. Easy enough that I had it running in an evening.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side-by-side
&lt;/h2&gt;

&lt;p&gt;I'll keep this honest — I ran all three on the same site for two weeks before deciding.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Plausible&lt;/th&gt;
&lt;th&gt;Fathom&lt;/th&gt;
&lt;th&gt;Umami&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;Yes (AGPL)&lt;/td&gt;
&lt;td&gt;No (closed)&lt;/td&gt;
&lt;td&gt;Yes (MIT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-host&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (primary path)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cookies&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud option&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;td&gt;Free tier + paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Script size&lt;/td&gt;
&lt;td&gt;~1 KB&lt;/td&gt;
&lt;td&gt;~2 KB&lt;/td&gt;
&lt;td&gt;~2 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funnels / goals&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes (basic)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The sizes above match what I observed in the network tab, but check each vendor's docs before quoting them anywhere serious.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the snippets look like
&lt;/h2&gt;

&lt;p&gt;Replacing GA is mostly about swapping a script tag. Here's the before:&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;!-- Google Analytics (the thing we're leaving) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://www.googletagmanager.com/gtag/js?id=G-XXXXXX"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);}&lt;/span&gt;
  &lt;span class="nf"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="nf"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;config&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;G-XXXXXX&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// sends pageview + sets cookies&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the replacements:&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;!-- Plausible (cloud) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;defer&lt;/span&gt; &lt;span class="na"&gt;data-domain=&lt;/span&gt;&lt;span class="s"&gt;"example.com"&lt;/span&gt;
        &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://plausible.io/js/script.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Fathom --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://cdn.usefathom.com/script.js"&lt;/span&gt;
        &lt;span class="na"&gt;data-site=&lt;/span&gt;&lt;span class="s"&gt;"ABCDEFG"&lt;/span&gt; &lt;span class="na"&gt;defer&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Umami (self-hosted) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;defer&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://analytics.mydomain.com/script.js"&lt;/span&gt;
        &lt;span class="na"&gt;data-website-id=&lt;/span&gt;&lt;span class="s"&gt;"your-website-id"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No &lt;code&gt;dataLayer&lt;/code&gt;. No consent banner gate. The script loads once, sends a single beacon per pageview, and stops bothering you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom events
&lt;/h2&gt;

&lt;p&gt;The thing I almost forgot when migrating: GA's &lt;code&gt;gtag('event', ...)&lt;/code&gt; calls. Here's how I rewrote them for Umami (the APIs are similar across the three, but each has its own conventions):&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;// Before (GA4)&lt;/span&gt;
&lt;span class="nf"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;event&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;signup_completed&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="na"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pricing_page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// After (Umami)&lt;/span&gt;
&lt;span class="c1"&gt;// `umami` is attached to window by the loader script&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;umami&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;track&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;signup_completed&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="na"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pricing_page&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plausible uses &lt;code&gt;window.plausible('signup_completed', { props: { plan: 'pro' } })&lt;/code&gt;. Fathom uses &lt;code&gt;fathom.trackEvent('signup_completed')&lt;/code&gt;. Don't do a global find-and-replace — the property conventions differ enough that you'll want to read each vendor's docs first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Self-hosting Umami in five minutes
&lt;/h2&gt;

&lt;p&gt;This is the part that sold me. Here's the &lt;code&gt;docker-compose.yml&lt;/code&gt; running on the VPS for one of my side projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;umami&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/umami-software/umami:postgresql-latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;DATABASE_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgresql://umami:umami@db:5432/umami&lt;/span&gt;
      &lt;span class="na"&gt;DATABASE_TYPE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgresql&lt;/span&gt;
      &lt;span class="na"&gt;APP_SECRET&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;change-me-to-a-real-secret&lt;/span&gt; &lt;span class="c1"&gt;# rotate this&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15-alpine&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;umami&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;umami&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;umami&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;umami-db:/var/lib/postgresql/data&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD-SHELL"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pg_isready&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-U&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;umami"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;umami-db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it behind Caddy or Nginx, point a subdomain at it, drop the script tag into your site. You own the data. Nothing leaves your server. The dashboard is genuinely pleasant — the Next.js UI loads fast and shows the things I actually look at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migration steps that worked
&lt;/h2&gt;

&lt;p&gt;No magic, just mechanical:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inventory your GA calls.&lt;/strong&gt; Grep your codebase for &lt;code&gt;gtag(&lt;/code&gt;, &lt;code&gt;dataLayer&lt;/code&gt;, and any analytics wrapper functions. Write them down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick your destination.&lt;/strong&gt; Zero ongoing cost and own your data → self-hosted Umami. Don't want to run Postgres → Plausible Cloud. Want the most polished commercial dashboard → Fathom.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run them in parallel for a week.&lt;/strong&gt; Drop the new script alongside GA. Compare daily pageview counts. You'll see drift — the privacy-focused tools usually report fewer visits because they don't fingerprint, and that's kind of the point.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rewrite custom events.&lt;/strong&gt; Map each &lt;code&gt;gtag('event', ...)&lt;/code&gt; to the new API. Wrap them in a helper so you can switch again later without grepping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove the GA script and the cookie banner.&lt;/strong&gt; This is the satisfying part.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  My recommendation
&lt;/h2&gt;

&lt;p&gt;Honestly? Here's how I'd choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Side projects, solo devs:&lt;/strong&gt; Self-hosted Umami. Free, simple, MIT-licensed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small business, no ops appetite:&lt;/strong&gt; Plausible Cloud. Easiest onboarding, still open source if you ever want to migrate off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polished dashboards for clients:&lt;/strong&gt; Fathom. The UX feels the most "finished" of the three.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm not saying Google Analytics is bad — it's free, it's powerful, and it's still the right answer if you live inside their ad ecosystem. But for the rest of us, three lines of script and a Postgres container will get you 90% of what you actually look at, with one less third-party domain in your &lt;code&gt;Content-Security-Policy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The TanStack situation reminded me that every script tag is a trust decision. Make fewer trust decisions.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>analytics</category>
      <category>privacy</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Fixing XSLT Import Issues in MuleSoft (Works in Local but Fails in RTF Runtime)</title>
      <dc:creator>sphurthi Edara</dc:creator>
      <pubDate>Tue, 12 May 2026 03:16:49 +0000</pubDate>
      <link>https://dev.to/sphurthi_edara/fixing-xslt-import-issues-in-mulesoft-works-in-local-but-fails-in-rtf-runtime-3bi0</link>
      <guid>https://dev.to/sphurthi_edara/fixing-xslt-import-issues-in-mulesoft-works-in-local-but-fails-in-rtf-runtime-3bi0</guid>
      <description>&lt;p&gt;Fixing XSLT Import Issues in MuleSoft&lt;br&gt;
(Works in Local but Fails in RTF Runtime)&lt;/p&gt;

&lt;p&gt;Introduction&lt;br&gt;
XSLT (Extensible Stylesheet Language Transformations) is used to transform XML data from one format into another during application integrations.&lt;br&gt;
While working on a MuleSoft integration project, I faced a challenging issue where the XSLT transformation worked perfectly in Anypoint Studio (local environment) but failed after deployment to Runtime Fabric (RTF).&lt;br&gt;
After trying multiple approaches and finding very limited documentation for this issue, I was able to identify the root cause and implement a working solution. In this article, I will explain the issue, failed approaches, and the final solution that resolved it successfully.&lt;/p&gt;



&lt;p&gt;🔹 Scenario&lt;br&gt;
I had:&lt;br&gt;
• A parent XSLT file &lt;br&gt;
• One or more child XSL files &lt;br&gt;
• Requirement: Import child XSL inside the parent and perform transformation&lt;/p&gt;

&lt;p&gt;🔹 Local Setup vs Runtime Issue&lt;br&gt;
• Both the parent and child XSL files were stored under: &lt;br&gt;
               src/main/resources/xslt/&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%2F9r3bs2f6v3j6u03y7ncw.png" 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%2F9r3bs2f6v3j6u03y7ncw.png" alt=" " width="800" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the General section, I used:&lt;br&gt;
• Content → Passed the payload to be transformed &lt;br&gt;
• XSLT → Referenced the parent XSL file using:&lt;br&gt;
${file::xslt/parent.xsl}&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%2F5jlvkx76zzo7kxmamdi1.png" 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%2F5jlvkx76zzo7kxmamdi1.png" alt=" " width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;• Inside the parent XSL, I imported the child XSL using: &lt;br&gt;
               &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%2Fkdrc3bys71ijpeg2soby.png" 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%2Fkdrc3bys71ijpeg2soby.png" alt=" " width="800" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 (Refer to the screenshot above for the exact configuration)&lt;/p&gt;

&lt;p&gt;👉 With this setup, the transformation worked perfectly in the local environment (Anypoint Studio).&lt;/p&gt;

&lt;p&gt;🔴 Issue in Runtime Fabric (RTF)&lt;/p&gt;

&lt;p&gt;However, when the same application was deployed to the RTF (Runtime Fabric) environment, the transformation failed with the following error: &lt;/p&gt;

&lt;p&gt;[2026-04-21 17:50:36.966] ERROR DefaultExceptionListener [[MuleRuntime].uber.03: [test].test.CPU_INTENSIVE @65f712f4] [event: ]: &lt;/p&gt;



&lt;p&gt;Message               : I/O error reported by XML parser processing file:/apps/test/xslt/xsl/child.xsl: /apps/test/xslt/xsl/child.xsl (No such file or directory)&lt;/p&gt;

&lt;p&gt;💡 Why This Happens&lt;/p&gt;

&lt;p&gt;In Anypoint Studio (local):&lt;br&gt;
• Mule can resolve ${file::} paths directly from the filesystem &lt;/p&gt;

&lt;p&gt;In RTF (runtime):&lt;br&gt;
• Resources are packaged inside the application JAR &lt;br&gt;
• Mule uses classpath-based resolution, not filesystem paths &lt;/p&gt;

&lt;p&gt;👉 That’s why the child XSL cannot be found in runtime&lt;/p&gt;

&lt;p&gt;🔴 Failed Approaches&lt;br&gt;
I tried multiple approaches, but none worked:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Using classpath inside parent XSL&lt;br&gt;
 &lt;br&gt;
❌ Error:&lt;/p&gt;



&lt;p&gt;Message               : I/O error reported by XML parser processing classpath:/xslt.xsl/child.xsl: unknown protocol: classpath&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using relative path&lt;br&gt;
 &lt;br&gt;
❌ Error:&lt;/p&gt;



&lt;p&gt;Message               : I/O error reported by XML parser processing file:/tmp/child.xsl: /tmp/child.xsl (No such file or directory)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using absolute path&lt;br&gt;
&lt;br&gt;
*Both child and parent xsl are in same xslt folder unser src/main/resoucrces.&lt;br&gt;
❌ Error:&lt;/p&gt;



&lt;p&gt;Message               : I/O error reported by XML parser processing file:/xslt/child.xsl: /xslt/child.xsl (No such file or directory)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;✅ Final Working Solution&lt;br&gt;
The solution was a combination of correct XSLT reference + classpath usage + dependency alignment.&lt;br&gt;
✔ Step 1: Change how parent XSL is referenced&lt;br&gt;
Instead of using ${file::...}, declare XSL directly in the XSLT component:&lt;br&gt;
&lt;a&gt;xml-module:xslt&lt;/a&gt;&lt;br&gt;
  &amp;lt;![CDATA[]]&amp;gt;&lt;br&gt;
&lt;a href="/xml-module:xslt"&gt;/xml-module:xslt&lt;/a&gt;&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%2Fltr1qmmfmnm60vzqybyg.png" 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%2Fltr1qmmfmnm60vzqybyg.png" alt=" " width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✔ Step 2: Use classpath inside parent XSL&lt;br&gt;
&lt;br&gt;
👉 This ensures Mule runtime correctly resolves resources from the classpath.&lt;/p&gt;

&lt;p&gt;✔ Step 3: Ensure correct folder structure&lt;br&gt;
src/main/resources/xslt/&lt;br&gt;
    └── child.xsl&lt;/p&gt;

&lt;p&gt;✔ Step 4: Match Mule XML Module dependency with runtime&lt;br&gt;
&lt;br&gt;
    org.mule.modules&lt;br&gt;
    mule-xml-module&lt;br&gt;
    1.4.3&lt;br&gt;
    mule-plugin&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;👉 Important: Dependency version must align with your Mule runtime.&lt;br&gt;
• Runtime used: 4.10.2 &lt;br&gt;
• Module version: 1.4.3&lt;/p&gt;

&lt;p&gt;💡 Bonus Insight&lt;br&gt;
This solution also works when:&lt;br&gt;
• You have multiple child XSL files &lt;br&gt;
• Complex transformations with nested imports &lt;br&gt;
I tested this with multiple child XSLs, and it worked consistently in both:&lt;br&gt;
• Local (Studio) &lt;br&gt;
• RTF Runtime&lt;/p&gt;

&lt;p&gt;🔹 Conclusion&lt;br&gt;
This issue is not well documented, and it can be frustrating when something works locally but fails in runtime.&lt;br&gt;
• By correctly using classpath-based imports and aligning dependencies, you can ensure consistent XSLT execution across environments.&lt;br&gt;
• I hope this helps anyone facing similar issues and saves valuable debugging time.&lt;/p&gt;

&lt;p&gt;✍️ Author&lt;br&gt;
Sphurthi Edara&lt;br&gt;
MuleSoft Developer&lt;br&gt;
Connect with me on LinkedIn:&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/sphurthi-edara/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/sphurthi-edara/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mulesoft</category>
      <category>xslt</category>
      <category>runtimefabric</category>
      <category>xslttranformation</category>
    </item>
  </channel>
</rss>
